Posturas de tenda e cunha

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:

Posições dobráveis de barraca e cunha

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:

  1. Crie uma implementação de DeviceStatePolicy.Provider que retorne uma instância de BookStyleDeviceStatePolicy. A instância precisa fornecer todas as dependências necessárias, como objetos de sensor, ao construtor BookStyleDeviceStatePolicy.

    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);
        }
    }
    
  2. 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
    
  3. Atualize config_deviceSpecificDeviceStatePolicyProvider para o nome da classe do seu provedor no arquivo config.xml. Por exemplo:

    <string translatable="false" name="config_deviceSpecificDeviceStatePolicyProvider">com.example.MyDevicePolicyProvider</string>