En el caso de los dispositivos plegables, la experiencia del usuario se puede optimizar si se adapta 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 despliegue en una posición similar a una tablet, pero que se bloquee en orientación vertical cuando el dispositivo esté plegado.
A partir de Android 13, Android tiene la capacidad de 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).
Figura 1: Configuración de rotación automática basada en el estado del dispositivo que ve el usuario
Cómo habilitar la configuración de rotación automática basada en el estado del dispositivo
Para habilitar y configurar la rotación automática basada en el estado del dispositivo, crea una superposición de dispositivo para el archivo config.xml del framework de la siguiente manera:
Para configurar el comportamiento predeterminado de la rotación automática para diferentes posiciones del dispositivo, propaga el
config_perDeviceStateRotationLockDefaultsarray de números enteros en la superposiciónconfig.xmldel 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-keyes una referencia a otra posición del dispositivo y debes especificar cuándo el valor de una posición esSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED. Cuando una posición se configura de esta manera, cualquier solicitud para obtener o establecer su preferencia de rotación automática se redirecciona a la posición de resguardo.Por ejemplo, si la postura
HALF_OPENEDrecurre a laOPENEDpostura:- Si se lee la configuración de rotación automática para
HALF_OPENED, se muestra la configuración actual paraOPENED. - Si se escribe una nueva preferencia de rotación automática mientras el dispositivo está
HALF_OPENEDse actualiza la preferencia para laOPENEDposición.
- Si se lee la configuración de rotación automática para
Configura las descripciones para cada posición del dispositivo que se puede configurar por el usuario. Propaga el array de cadenas
config_settableAutoRotationDeviceStatesDescriptionsen 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>Usa las APIs correctas para modificar esta 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 de bloqueo de rotación (modifica
ACCELEROMETER_ROTATION):- Desde SystemUI o Launcher, usa
RotationPolicy#setRotationLock(...). - Desde Window Manager, usa
DisplayRotation#freezeRotation()othawRotation().
- Desde SystemUI o Launcher, usa
Para cambiar la preferencia de bloqueo de rotación para un estado específico del dispositivo (modifica
DEVICE_STATE_ROTATION_LOCK):- Usa
requestDeviceStateAutoRotateSettingChange(...)desdeRotationPolicyoDeviceStateAutoRotateSettingManager.
- Usa
Detalles de la implementación
En las siguientes secciones, se describen la configuración y las clases clave principales que controlan el comportamiento de rotación automática de un dispositivo plegable.
Configuración
El sistema usa la siguiente configuración para administrar la rotación automática:
Settings.System.ACCELEROMETER_ROTATION: Esta es la 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 posición actual del dispositivo.Settings.Secure.DEVICE_STATE_ROTATION_LOCK: Esta 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 posición del dispositivo.La configuración se almacena como una cadena delimitada por dos puntos. Cada par de valores representa una 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: Ignorado (se usa la configuración para una posición de resguardo)1: Bloqueado (la rotación automática está desactivada)2: Desbloqueado (la rotación automática está activada)
Por ejemplo, la cadena
"0:2:2:1"significa lo siguiente:- Para el estado plegado (posición
0), la rotación automática está desbloqueada (2). - Para el estado desplegado (posición
2), la rotación automática está bloqueada (1).
Clases clave
La lógica para administrar la configuración de rotación automática basada en el estado del dispositivo se controla con las siguientes clases:
DeviceStateAutoRotateSettingManagerImpl: Administra la configuraciónDEVICE_STATE_ROTATION_LOCK. Proporciona métodos para actualizar la configuración, recuperar su valor y registrar objetos de escucha para los cambios.DeviceStateAutoRotateSettingController(Window Manager): SincronizaACCELEROMETER_ROTATIONyDEVICE_STATE_ROTATION_LOCK. Cuando cambia la posición del dispositivo, actualizaACCELEROMETER_ROTATIONsegún la preferencia del usuario para el estado nuevo. Se asegura de que cualquier cambio enACCELEROMETER_ROTATIONse guarde enDEVICE_STATE_ROTATION_LOCKpara la posición actual del dispositivo y, de manera similar, los cambios enDEVICE_STATE_ROTATION_LOCKpara la posición actual se reflejen enACCELEROMETER_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 los 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 CTS específicas 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.