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 position tablette, mais qu'il reste en mode portrait lorsque l'appareil est plié.
À partir d'Android 13, Android peut personnaliser les paramètres de rotation automatique en fonction de l'état de l'appareil (plié, déplié ou à moitié plié, par exemple).
Figure 1 : Paramètres de rotation automatique basés sur l'état de l'appareil, tels qu'ils s'affichent pour 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 postures de l'appareil en remplissant le tableau d'entiers
config_perDeviceStateRotationLockDefaultsdans 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-keyfait référence à une autre position de l'appareil. Vous devez spécifier quand la valeur d'une position estSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED. Lorsqu'une posture 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 posture de secours.Par exemple, si la posture
HALF_OPENEDrevient à la postureOPENED:- 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 en mode
HALF_OPENEDmet à jour la préférence pour la postureOPENED.
- La lecture du paramètre de rotation automatique pour
Configurez des descriptions pour chaque posture 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>Vous devez utiliser les API appropriées pour modifier ces paramètres de manière programmatique, plutôt que d'écrire directement dans les fournisseurs de paramètres, afin d'éviter un comportement incohérent :
Pour modifier l'état actuel du verrouillage de la rotation (modifie
ACCELEROMETER_ROTATION) :- Depuis SystemUI ou le lanceur d'applications, utilisez
RotationPolicy#setRotationLock(...). - Dans le gestionnaire de fenêtres, utilisez
DisplayRotation#freezeRotation()outhawRotation().
- Depuis SystemUI ou le 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 l'implémentation
Les paramètres et les principales classes clés qui contrôlent le comportement de rotation automatique pour 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 posture 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 posture 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 posture de l'appareil et le 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 posture de secours est utilisé)1: verrouillée (rotation automatique désactivée)2: Déverrouillé (rotation automatique activée)
Par exemple, la chaîne
"0:2:2:1"signifie :- En position pliée (posture
0), la rotation automatique est déverrouillée (2). - En mode déplié (posture
2), la rotation automatique est verrouillée (1).
Classes clés
La logique de gestion des paramètres de rotation automatique en fonction de 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,ACCELEROMETER_ROTATIONest mis à jour en fonction de la préférence de l'utilisateur pour le nouvel état. Il garantit que toute modification apportée àACCELEROMETER_ROTATIONest réenregistrée dansDEVICE_STATE_ROTATION_LOCKpour la posture actuelle de l'appareil. De même, les modifications apportées àDEVICE_STATE_ROTATION_LOCKpour la posture actuelle sont reflétées dansACCELEROMETER_ROTATION.DeviceStateAutoRotateSettingController(application Paramètres) : contrôlez l'UI sur la page des paramètres de rotation automatique en fonction de l'état de l'appareil.PostureDeviceStateConverter: effectue la conversion entre les identifiants génériques d'état de l'appareil et les identifiants de position de l'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 pour celle-ci. 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é.