Paramètre de rotation automatique basé sur l'état de l'appareil

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).

Page des paramètres de rotation automatique en fonction de l'état de l'appareil

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 :

  1. Configurez le comportement de rotation automatique par défaut pour différentes positions de l'appareil en remplissant le config_perDeviceStateRotationLockDefaults tableau d'entiers dans la superposition config.xml de 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-key est une référence à une autre stratégie de l'appareil. Vous devez spécifier quand la valeur d'une stratégie est Settings.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_OPENED position revient à la OPENED position :

    • La lecture du paramètre de rotation automatique pour HALF_OPENED renvoie le paramètre actuel pour OPENED.
    • L'écriture d'une nouvelle préférence de rotation automatique lorsque l'appareil est HALF_OPENED met à jour la préférence pour la position OPENED.
  2. Configurez les descriptions pour chaque stratégie d'appareil configurable par l'utilisateur. Remplissez le tableau de chaînes config_settableAutoRotationDeviceStatesDescriptions dans 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>
    
  3. 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() ou thawRotation().
    • Pour modifier la préférence de verrouillage de la rotation pour un état d'appareil spécifique (modifie DEVICE_STATE_ROTATION_LOCK) :

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ètre DEVICE_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): Synchronise ACCELEROMETER_ROTATION et DEVICE_STATE_ROTATION_LOCK. Lorsque la position de l'appareil change, il met à jour ACCELEROMETER_ROTATION en fonction de la préférence de l'utilisateur pour le nouvel état. Il s'assure que toute modification apportée à ACCELEROMETER_ROTATION est enregistrée dans DEVICE_STATE_ROTATION_LOCK pour la position actuelle de l'appareil et, de la même manière, que les modifications apportées à DEVICE_STATE_ROTATION_LOCK pour la position actuelle sont reflétées dans ACCELEROMETER_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é.