Parámetro de configuración de rotación automática basado en el estado del dispositivo

En el caso de los dispositivos plegables, la experiencia del usuario se puede optimizar adaptando el comportamiento de rotación de la pantalla al estado físico del dispositivo. Por ejemplo, puedes configurar la pantalla para que rote automáticamente cuando el dispositivo se despliega en una posición similar a la de una tablet, pero que se bloquee en vertical cuando el dispositivo está plegado.

A partir de Android 13, el sistema operativo puede personalizar la configuración de rotación automática según los estados del dispositivo, como plegado, desplegado o plegado a la mitad (modo de mesa).

Página de configuración de la rotación automática basada en el estado del dispositivo

Figura 1: Configuración de rotación automática basada en el estado del dispositivo que ve el usuario.

Habilita el parámetro de configuración de rotación automática según el estado del dispositivo

Para habilitar y configurar la rotación automática basada en el estado del dispositivo, crea una superposición del dispositivo para el archivo config.xml del framework de la siguiente manera:

  1. Para configurar el comportamiento predeterminado de la rotación automática para las diferentes posiciones del dispositivo, completa el array de números enteros config_perDeviceStateRotationLockDefaults en la superposición config.xml del dispositivo:

    <!-- In your device overlay, for example,
        device/generic/goldfish/phone/overlay/frameworks/base/core/res/res/values/config.xml -->
    <resources>
        <!-- Map of device posture to rotation lock setting. Each entry must be
            in the format "key:value", or "key:value:fallback_key" for example:
            "0:1" or "2:0:1". The keys are one of
            Settings.Secure.DeviceStateRotationLockKey, and the values are one of
            Settings.Secure.DeviceStateRotationLockSetting. -->
        <integer-array name="config_perDeviceStateRotationLockDefaults">
            <item>0:1</item> <!-- CLOSED -> LOCKED -->
            <item>1:0:2</item> <!-- HALF_OPENED -> IGNORED and fallback to
                device posture OPENED -->
            <item>2:2</item> <!-- OPENED -> UNLOCKED -->
            <item>3:0:0</item> <!-- REAR_DISPLAY -> IGNORED and fallback to
                device posture CLOSED -->
        </integer-array>
    </resources>
    

    fallback-key es una referencia a otra posición del dispositivo, y debes especificar cuándo el valor de una posición es Settings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED. Cuando una postura se configura de esta manera, cualquier solicitud para obtener o establecer su preferencia de rotación automática se redirecciona a la postura de resguardo.

    Por ejemplo, si la postura HALF_OPENED recurre a la postura OPENED:

    • La lectura del parámetro de configuración de rotación automática para HALF_OPENED devuelve el parámetro de configuración actual para OPENED.
    • Escribir una nueva preferencia de rotación automática mientras el dispositivo está en HALF_OPENED actualiza la preferencia para la postura OPENED.
  2. Configura descripciones para cada postura del dispositivo que el usuario puede establecer. Completa el array de cadenas config_settableAutoRotationDeviceStatesDescriptions en la superposición de la app de Configuración del dispositivo:

    <!-- In your device's Settings app overlay -->
    <resources>
        <!-- The settings/preference description for each settable device
            posture defined in the array
            "config_perDeviceStateRotationLockDefaults".
            The item in position "i" describes the auto-rotation setting for the
            device posture also in position "i" in the array
            "config_perDeviceStateRotationLockDefaults". -->
        <string-array name="config_settableAutoRotationDeviceStatesDescriptions">
            <item>Auto-rotate when folded</item>
            <item>@null</item> <!-- No description for state in position 1 (it
            is not settable by the user) -->
            <item>Auto-rotate when unfolded</item>
        </string-array>
    </resources>
    
  3. Debes usar las APIs correctas para modificar estos parámetros de configuración de forma programática, en lugar de escribir directamente en los proveedores de configuración, para evitar un comportamiento incoherente:

    • Para cambiar el estado actual del bloqueo de rotación (modifica ACCELEROMETER_ROTATION), haz lo siguiente:

    • Para cambiar la preferencia de bloqueo de rotación para un estado específico del dispositivo (modifica DEVICE_STATE_ROTATION_LOCK), haz lo siguiente:

Detalles de implementación

En las siguientes secciones, se describen los parámetros de configuración y las clases clave principales que controlan el comportamiento de rotación automática en un dispositivo plegable.

Configuración

El sistema usa los siguientes dos parámetros de configuración para administrar la rotación automática:

  • Settings.System.ACCELEROMETER_ROTATION: Este es el parámetro de configuración principal de rotación automática. En el caso de un dispositivo plegable, su valor refleja si la rotación automática está habilitada para la postura actual del dispositivo.

  • Settings.Secure.DEVICE_STATE_ROTATION_LOCK: Este parámetro de configuración almacena la preferencia de rotación automática del usuario para cada posición del dispositivo (por ejemplo, plegado o desplegado). Esto permite que el sistema aplique la preferencia correcta cuando cambia la postura del dispositivo.

    El parámetro de configuración se almacena como una cadena delimitada por dos puntos. Cada par de valores representa la posición del dispositivo y su configuración de rotación correspondiente. El formato es el siguiente:

    <device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...

    Los valores de rotación son los siguientes:

    • 0: Se ignora (se usa el parámetro de configuración de una postura de resguardo).
    • 1: Trabada (la función Girar automáticamente está desactivada)
    • 2: Desbloqueado (la rotación automática está activada)

    Por ejemplo, la cadena "0:2:2:1" significa lo siguiente:

    • En el estado plegado (postura 0), la rotación automática está desbloqueada (2).
    • En el estado desplegado (postura 2), el giro automático está bloqueado (1).

Clases clave

Las siguientes clases controlan la lógica para administrar la configuración de rotación automática basada en el estado del dispositivo:

  • DeviceStateAutoRotateSettingManagerImpl: Administra el parámetro de configuración DEVICE_STATE_ROTATION_LOCK. Proporciona métodos para actualizar el parámetro de configuración, recuperar su valor y registrar objetos de escucha para los cambios.

  • DeviceStateAutoRotateSettingController (Administrador de ventanas): Sincroniza ACCELEROMETER_ROTATION y DEVICE_STATE_ROTATION_LOCK. Cuando cambia la postura del dispositivo, se actualiza ACCELEROMETER_ROTATION según la preferencia del usuario para el nuevo estado. Se asegura de que cualquier cambio en ACCELEROMETER_ROTATION se guarde en DEVICE_STATE_ROTATION_LOCK para la posición actual del dispositivo y, de manera similar, los cambios en DEVICE_STATE_ROTATION_LOCK para la posición actual se reflejen en ACCELEROMETER_ROTATION.

  • DeviceStateAutoRotateSettingController (app de Configuración): Controla la IU en la página de configuración de rotación automática basada en el estado del dispositivo.

  • PostureDeviceStateConverter: Realiza conversiones entre identificadores genéricos de estado del dispositivo y los identificadores de posición del dispositivo que usa esta función.

Validación

Dado que el comportamiento de esta función depende en gran medida de la configuración del OEM, no hay pruebas específicas de CTS para ella. Debes realizar pruebas manuales para verificar que la configuración de rotación automática cambie según lo previsto cuando el dispositivo realice la transición entre los diferentes estados físicos que configuraste.