Pour les appareils pliables, l'expérience utilisateur peut être optimisée en adaptant le comportement de rotation de l'écran à l'état physique de l'appareil. Par exemple, vous pouvez configurer l'écran pour qu'il pivote automatiquement lorsque l'appareil est déplié en mode tablette, mais qu'il reste en mode portrait lorsqu'il est plié.
À partir d'Android 13, Android peut personnaliser les paramètres de rotation automatique en fonction de l'état de l'appareil, par exemple plié, déplié ou à moitié plié (mode table).
Figure 1. Paramètres de rotation automatique basés sur l'état de l'appareil tels qu'ils sont vus par l'utilisateur.
Activer le paramètre de rotation automatique basé sur l'état de l'appareil
Pour activer et configurer la rotation automatique basée sur l'état de l'appareil, créez une superposition d'appareil pour le fichier config.xml du framework, comme suit :
Configurez le comportement de rotation automatique par défaut pour différentes positions de l'appareil en remplissant le
config_perDeviceStateRotationLockDefaultstableau d'entiers dans la superpositionconfig.xmlde votre appareil :<!-- 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-keyest une référence à une autre stratégie de l'appareil. Vous devez spécifier quand la valeur d'une stratégie estSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED. Lorsqu'une position est configurée de cette manière, toutes les requêtes visant à obtenir ou à définir sa préférence de rotation automatique sont redirigées vers la position de secours.Par exemple, si la
HALF_OPENEDposition revient à laOPENEDposition :- La lecture du paramètre de rotation automatique pour
HALF_OPENEDrenvoie le paramètre actuel pourOPENED. - L'écriture d'une nouvelle préférence de rotation automatique lorsque l'appareil est
HALF_OPENEDmet à jour la préférence pour la positionOPENED.
- La lecture du paramètre de rotation automatique pour
Configurez les descriptions pour chaque stratégie d'appareil configurable par l'utilisateur. Remplissez le tableau de chaînes
config_settableAutoRotationDeviceStatesDescriptionsdans la superposition de l'application Paramètres de votre appareil :<!-- 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>Utilisez les API appropriées pour modifier ces paramètres par programmation, plutôt que d'écrire directement dans les fournisseurs de paramètres, afin d'éviter tout comportement incohérent :
Pour modifier l'état actuel du verrouillage de la rotation (modifie
ACCELEROMETER_ROTATION) :- À partir de SystemUI ou du Lanceur d'applications, utilisez
RotationPolicy#setRotationLock(...). - À partir du gestionnaire de fenêtres, utilisez
DisplayRotation#freezeRotation()outhawRotation().
- À partir de SystemUI ou du Lanceur d'applications, utilisez
Pour modifier la préférence de verrouillage de la rotation pour un état d'appareil spécifique (modifie
DEVICE_STATE_ROTATION_LOCK) :- Utilisez
requestDeviceStateAutoRotateSettingChange(...)à partir deRotationPolicyouDeviceStateAutoRotateSettingManager.
- Utilisez
Détails de mise en œuvre
Les paramètres et les classes clés de base qui contrôlent le comportement de rotation automatique d'un appareil pliable sont décrits dans les sections suivantes.
Paramètres
Le système utilise les deux paramètres suivants pour gérer la rotation automatique :
Settings.System.ACCELEROMETER_ROTATION: il s'agit du paramètre de rotation automatique principal. Pour un appareil pliable, sa valeur indique si la rotation automatique est activée pour la position actuelle de l'appareil.Settings.Secure.DEVICE_STATE_ROTATION_LOCK: ce paramètre stocke la préférence de rotation automatique de l'utilisateur pour chaque position de l'appareil (par exemple, plié ou déplié). Cela permet au système d'appliquer la préférence appropriée lorsque la position de l'appareil change.Le paramètre est stocké sous forme de chaîne délimitée par des deux-points. Chaque paire de valeurs représente une position de l'appareil et son paramètre de rotation correspondant. Le format est le suivant :
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...Les valeurs de rotation sont les suivantes :
0: ignoré (le paramètre d'une position de secours est utilisé)1: verrouillé (rotation automatique désactivée)2: déverrouillé (rotation automatique activée)
Par exemple, la chaîne
"0:2:2:1"signifie :- Pour l'état plié (position
0), la rotation automatique est déverrouillée (2). - Pour l'état déplié (position
2), la rotation automatique est verrouillée (1).
Classes clés
La logique de gestion des paramètres de rotation automatique basés sur l'état de l'appareil est gérée par les classes suivantes :
DeviceStateAutoRotateSettingManagerImpl: gère le paramètreDEVICE_STATE_ROTATION_LOCK. Il fournit des méthodes pour mettre à jour le paramètre, récupérer sa valeur et enregistrer des écouteurs pour les modifications.DeviceStateAutoRotateSettingController(gestionnaire de fenêtres): SynchroniseACCELEROMETER_ROTATIONetDEVICE_STATE_ROTATION_LOCK. Lorsque la position de l'appareil change, il met à jourACCELEROMETER_ROTATIONen fonction de la préférence de l'utilisateur pour le nouvel état. Il s'assure que toute modification apportée àACCELEROMETER_ROTATIONest enregistrée dansDEVICE_STATE_ROTATION_LOCKpour la position actuelle de l'appareil et, de la même manière, que les modifications apportées àDEVICE_STATE_ROTATION_LOCKpour la position actuelle sont reflétées dansACCELEROMETER_ROTATION.DeviceStateAutoRotateSettingController(application Paramètres): contrôle l'interface utilisateur sur la page des paramètres de rotation automatique basés sur l'état de l'appareil.PostureDeviceStateConverter: effectue la conversion entre les identifiants d'état d'appareil génériques et les identifiants de position d'appareil utilisés par cette fonctionnalité.
Validation
Étant donné que le comportement de cette fonctionnalité dépend fortement de la configuration de l'OEM, il n'existe pas de tests CTS spécifiques. Vous devez effectuer des tests manuels pour vérifier que les paramètres de rotation automatique changent comme prévu lorsque l'appareil passe d'un état physique à un autre que vous avez configuré.