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).
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:
Configura il comportamento di rotazione automatica predefinito per le diverse posture del dispositivo compilando l'array di numeri interi
config_perDeviceStateRotationLockDefaultsnell'overlay del dispositivoconfig.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-keyfa 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_OPENEDtorna alla posturaOPENED:- La lettura dell'impostazione di rotazione automatica per
HALF_OPENEDrestituisce l'impostazione corrente perOPENED. - La scrittura di una nuova preferenza di rotazione automatica mentre il dispositivo è in fase di
HALF_OPENEDaggiornamento aggiorna la preferenza per la posturaOPENED.
- La lettura dell'impostazione di rotazione automatica per
Configura le descrizioni per ogni postura del dispositivo impostabile dall'utente. Compila l'array di stringhe
config_settableAutoRotationDeviceStatesDescriptionsnell'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>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):- Da SystemUI o Avvio app, utilizza
RotationPolicy#setRotationLock(...). - In Gestione finestre, utilizza
DisplayRotation#freezeRotation()othawRotation().
- Da SystemUI o Avvio app, utilizza
Per modificare la preferenza di blocco della rotazione per uno stato specifico del dispositivo (modifica
DEVICE_STATE_ROTATION_LOCK):- Utilizza
requestDeviceStateAutoRotateSettingChange(...)daRotationPolicyoDeviceStateAutoRotateSettingManager.
- Utilizza
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'impostazioneDEVICE_STATE_ROTATION_LOCK. Fornisce metodi per aggiornare l'impostazione, recuperarne il valore e registrare i listener per le modifiche.DeviceStateAutoRotateSettingController(Window Manager): SincronizzaACCELEROMETER_ROTATIONeDEVICE_STATE_ROTATION_LOCK. Quando la postura del dispositivo cambia,ACCELEROMETER_ROTATIONviene aggiornato in base alla preferenza dell'utente per il nuovo stato. Assicura che qualsiasi modifica apportata aACCELEROMETER_ROTATIONvenga salvata di nuovo inDEVICE_STATE_ROTATION_LOCKper la postura attuale del dispositivo e, in modo simile, le modifiche apportate aDEVICE_STATE_ROTATION_LOCKper la postura attuale vengano riflesse inACCELEROMETER_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.