Impostazione di rotazione automatica basata sullo stato del dispositivo

Per i dispositivi pieghevoli, l'esperienza utente può essere ottimizzata adattando il comportamento di rotazione dello schermo allo stato fisico del dispositivo. Ad esempio, puoi impostare la rotazione automatica dello schermo quando il dispositivo è aperto in una postura simile a quella di un tablet, ma bloccarlo in verticale quando il dispositivo è chiuso.

A partire da Android 13, Android ha la possibilità di personalizzare le impostazioni di rotazione automatica in base agli stati del dispositivo, ad esempio chiuso, aperto o semiaperto (modalità da tavolo).

Pagina delle impostazioni di rotazione automatica basata sullo stato del dispositivo

Figura 1. Impostazioni di rotazione automatica basate sullo stato del dispositivo visualizzate dall'utente.

Attivare l'impostazione di rotazione automatica basata sullo stato del dispositivo

Per attivare e configurare la rotazione automatica basata sullo stato del dispositivo, crea una sovrapposizione del dispositivo per il file config.xml del framework, come segue:

  1. Configura il comportamento di rotazione automatica predefinito per le diverse posture del dispositivo compilando l'array di numeri interi config_perDeviceStateRotationLockDefaults nel file config.xml della sovrapposizione del 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-key è un riferimento a un'altra postura del dispositivo e devi specificare quando il valore di una postura è Settings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED. Quando una postura è configurata in questo modo, tutte le richieste per recuperare o impostare la relativa preferenza di rotazione automatica vengono reindirizzate alla postura di fallback.

    Ad esempio, se la postura HALF_OPENED torna alla OPENED postura:

    • La lettura dell'impostazione di rotazione automatica per HALF_OPENED restituisce l'impostazione corrente per OPENED.
    • La scrittura di una nuova preferenza di rotazione automatica mentre il dispositivo è HALF_OPENED aggiorna la preferenza per la postura OPENED.
  2. Configura le descrizioni per ogni postura del dispositivo impostabile dall'utente. Compila l'array di stringhe config_settableAutoRotationDeviceStatesDescriptions nella sovrapposizione dell'app Impostazioni 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>
    
  3. Utilizza le API corrette per modificare queste impostazioni a livello di programmazione, anziché scrivere direttamente nei provider di impostazioni, per evitare comportamenti incoerenti:

    • Per modificare lo stato di blocco della rotazione corrente (modifica ACCELEROMETER_ROTATION):

    • Per modificare la preferenza di blocco della rotazione per uno stato specifico del dispositivo (modifica DEVICE_STATE_ROTATION_LOCK):

Dettagli di implementazione

Le impostazioni e le classi chiave principali che controllano il comportamento di rotazione automatica per un dispositivo pieghevole sono descritte nelle sezioni seguenti.

Impostazioni

Il sistema utilizza le due impostazioni seguenti per gestire la rotazione automatica:

  • Settings.System.ACCELEROMETER_ROTATION: questa è l'impostazione di rotazione automatica principale. Per un dispositivo pieghevole, il suo valore indica se la rotazione automatica è attivata per la postura corrente del dispositivo.

  • Settings.Secure.DEVICE_STATE_ROTATION_LOCK: questa impostazione memorizza la preferenza di rotazione automatica dell'utente per ogni postura del dispositivo (ad esempio, chiuso o aperto). In questo modo, il sistema può applicare la preferenza corretta quando la postura del dispositivo cambia.

    L'impostazione viene memorizzata come stringa delimitata da due punti. Ogni coppia di valori rappresenta una postura del dispositivo e la relativa impostazione di rotazione. Il formato è:

    <device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...

    I valori di rotazione sono:

    • 0: ignorato (viene utilizzata l'impostazione per una postura di fallback)
    • 1: bloccato (la rotazione automatica è disattivata)
    • 2: sbloccato (la rotazione automatica è attivata)

    Ad esempio, la stringa "0:2:2:1" significa:

    • Per lo stato chiuso (postura 0), la rotazione automatica è sbloccata (2).
    • Per lo stato aperto (postura 2), la rotazione automatica è bloccata (1).

Classi chiave

La logica per la gestione delle impostazioni di rotazione automatica basate sullo stato del dispositivo viene gestita dalle seguenti classi:

  • DeviceStateAutoRotateSettingManagerImpl: gestisce l'impostazione DEVICE_STATE_ROTATION_LOCK. Fornisce metodi per aggiornare l'impostazione, recuperarne il valore e registrare i listener per le modifiche.

  • DeviceStateAutoRotateSettingController (Gestione finestre): sincronizza ACCELEROMETER_ROTATION e DEVICE_STATE_ROTATION_LOCK. Quando la postura del dispositivo cambia, aggiorna ACCELEROMETER_ROTATION in base alla preferenza dell'utente per il nuovo stato. Assicura che qualsiasi modifica a ACCELEROMETER_ROTATION venga salvata in DEVICE_STATE_ROTATION_LOCK per la postura corrente del dispositivo e, in modo simile, le modifiche a DEVICE_STATE_ROTATION_LOCK per la postura corrente si riflettano in ACCELEROMETER_ROTATION.

  • DeviceStateAutoRotateSettingController (app Impostazioni): controlla l'UI nella pagina delle impostazioni di rotazione automatica basate sullo stato del dispositivo.

  • PostureDeviceStateConverter: converte tra gli identificatori generici dello stato del dispositivo e gli identificatori della postura del dispositivo utilizzati da questa funzionalità.

Convalida

Poiché il comportamento di questa funzionalità dipende in larga misura dalla configurazione dell'OEM, non esistono test CTS specifici. Devi eseguire test manuali per verificare che le impostazioni di rotazione automatica cambino come previsto quando il dispositivo passa da uno stato fisico all'altro che hai configurato.