Em dispositivos dobráveis no estilo livro, é possível ativar o suporte aos modos de suporte e de apoio.
Os modos de suporte e tenda permitem usar a tela externa quando o dispositivo está levemente aberto, conforme mostrado na figura a seguir:
Figura 1. Posições dobráveis de tenda e cunha.
No modo barraca, o dispositivo fica parcialmente aberto, usando as duas metades para se apoiar como uma barraca. No modo de apoio, o dispositivo fica apoiado na metade direita, que fica plana em uma superfície.
O Android 16 e versões mais recentes oferecem suporte a esse comportamento usando BookStyleDeviceStatePolicy
como política de estado do dispositivo. Essa política funciona
em um dispositivo dobrável com duas telas no estilo de um livro, com a articulação localizada
no lado esquerdo do dispositivo quando dobrado.
Essa política mantém a tela externa ligada por mais tempo ao desdobrar em determinadas condições, por exemplo:
- A metade direita do dispositivo é quase plana, indicando que ele provavelmente está no modo de suporte.
- A orientação do dispositivo é paisagem invertida, indicando que ele provavelmente está no modo tenda.
- A orientação da tela é paisagem ou paisagem invertida.
- Há um app mantendo um wakelock de tela (impedindo o tempo limite da tela).
A política não introduz um estado de dispositivo separado para a postura de tenda ou cunha. Ela mantém o estado fechado para uma faixa mais ampla de ângulos de dobradiça nessas condições específicas.
Para oferecer suporte total a essas heurísticas, o dispositivo precisa:
- Sensor de ângulo de dobradiça informando o ângulo entre as duas metades do dispositivo
- Sensor de acelerômetro em cada metade (esquerda e direita) do dispositivo
Configurar o modo de suporte ou inclinação
Siga estas etapas para ativar o suporte ao modo de tenda e de apoio no seu dispositivo:
Crie uma implementação de
DeviceStatePolicy.Provider
que retorne uma instância deBookStyleDeviceStatePolicy
. A instância precisa fornecer todas as dependências necessárias, como objetos de sensor, ao construtorBookStyleDeviceStatePolicy
.Confira um exemplo de implementação:
package com.example; public class MyDevicePolicyProvider implements DeviceStatePolicy.Provider { @Override public DeviceStatePolicy instantiate(@NonNull Context context) { final SensorManager sensorManager = context.getSystemService(SensorManager.class); final Sensor hingeAngleSensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE, /* wakeUp= */ true); final List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); final Sensor hallSensor = CollectionUtils.find(sensors, (sensor) -> Objects.equals(sensor.getStringType(), "com.example.hall_effect")); final Sensor rightAccelerometerSensor = CollectionUtils.find(sensors, (sensor) -> Objects.equals(sensor.getName(), "Accelerometer 0")); final Sensor leftAccelerometerSensor = CollectionUtils.find(sensors, (sensor) -> Objects.equals(sensor.getName(), "Accelerometer 1")); // You can pass a non-null value here to disable tent/wedge mode logic, // so the displays switch will always happen at the fixed hinge angle. // This might be useful, for example, when in a retail demo mode where // the hinge angle range of the device is limited. final Integer closeAngleDegrees = null; return new BookStyleDeviceStatePolicy(new FeatureFlagsImpl(), context, hingeAngleSensor, hallSensor, leftAccelerometerSensor, rightAccelerometerSensor, closeAngleDegrees); } }
Adicione o provedor de políticas ao caminho de classe do servidor do sistema. Comece criando uma biblioteca com a classe do provedor de políticas de estado do dispositivo criada na etapa anterior.
O exemplo a seguir mostra uma configuração de blueprint
Android.bp
do Soong:java_library { name: "my-device-services", installable: true, system_ext_specific: true, srcs: [ "src/**/*.java" ], libs: [ "services", ], }
Em seguida, para adicionar essa biblioteca ao servidor do sistema, modifique o makefile do dispositivo adicionando as seguintes linhas:
# Add system service libraries (they contain device-specific policies) PRODUCT_SYSTEM_SERVER_JARS += \ my-device-services PRODUCT_PACKAGES += \ my-device-services
Atualize
config_deviceSpecificDeviceStatePolicyProvider
para o nome da classe do seu provedor no arquivoconfig.xml
. Por exemplo:<string translatable="false" name="config_deviceSpecificDeviceStatePolicyProvider">com.example.MyDevicePolicyProvider</string>