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

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 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 :

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

    • 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 en mode HALF_OPENED met à jour la préférence pour la posture OPENED.
  2. Configurez des descriptions pour chaque posture 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. 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() 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 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è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, ACCELEROMETER_ROTATION est mis à jour en fonction de la préférence de l'utilisateur pour le nouvel état. Il garantit que toute modification apportée à ACCELEROMETER_ROTATION est réenregistrée dans DEVICE_STATE_ROTATION_LOCK pour la posture actuelle de l'appareil. De même, les modifications apportées à DEVICE_STATE_ROTATION_LOCK pour la posture actuelle sont reflétées dans ACCELEROMETER_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é.