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 modalità tablet, ma bloccarlo in modalità verticale quando il dispositivo è chiuso.

A partire da Android 13, Android è in grado di personalizzare le impostazioni di rotazione automatica in base agli stati del dispositivo, ad esempio piegato, aperto o semi-piegato (modalità tavolo).

Pagina delle impostazioni di rotazione automatica in base allo stato del dispositivo

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

Attivare l'impostazione di rotazione automatica in base allo stato del dispositivo

Per attivare e configurare la rotazione automatica in base allo stato del dispositivo, crea un overlay 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 nell'overlay del dispositivo config.xml:

    <!-- 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 fa 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 ottenere o impostare la preferenza di rotazione automatica vengono reindirizzate alla postura di riserva.

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

    • 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 è in fase di HALF_OPENED aggiornamento 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 nell'overlay 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. Per modificare queste impostazioni in modo programmatico, devi utilizzare le API corrette anziché scrivere direttamente nei provider di impostazioni, per evitare comportamenti incoerenti:

    • Per modificare lo stato attuale del blocco della rotazione (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 di chiavi principali che controllano il comportamento di rotazione automatica per un dispositivo pieghevole sono descritte nelle sezioni seguenti.

Impostazioni

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

  • Settings.System.ACCELEROMETER_ROTATION: questa è l'impostazione principale della rotazione automatica. Per un dispositivo pieghevole, il valore indica se la rotazione automatica è attivata per la postura attuale 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, piegato 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 dai 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 per la rotazione sono:

    • 0: Ignorato (viene utilizzata l'impostazione per una postura di fallback)
    • 1: Bloccato (rotazione automatica disattivata)
    • 2: Sbloccato (rotazione automatica attiva)

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

    • Per lo stato piegato (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 (Window Manager): Sincronizza ACCELEROMETER_ROTATION e DEVICE_STATE_ROTATION_LOCK. Quando la postura del dispositivo cambia, ACCELEROMETER_ROTATION viene aggiornato in base alla preferenza dell'utente per il nuovo stato. Assicura che qualsiasi modifica apportata a ACCELEROMETER_ROTATION venga salvata di nuovo in DEVICE_STATE_ROTATION_LOCK per la postura attuale del dispositivo e, in modo simile, le modifiche apportate a DEVICE_STATE_ROTATION_LOCK per la postura attuale vengano riflesse in ACCELEROMETER_ROTATION.

  • DeviceStateAutoRotateSettingController (app Impostazioni): controlla l'interfaccia utente nella pagina delle impostazioni di rotazione automatica in base allo stato del dispositivo.

  • PostureDeviceStateConverter: esegue la conversione tra 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.