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).
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:
Configura il comportamento di rotazione automatica predefinito per le diverse posture del dispositivo compilando l'array di numeri interi
config_perDeviceStateRotationLockDefaultsnel fileconfig.xmldella 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_OPENEDtorna allaOPENEDpostura:- 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 è
HALF_OPENEDaggiorna 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_settableAutoRotationDeviceStatesDescriptionsnella 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>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):- Da SystemUI o Avvio app, utilizza
RotationPolicy#setRotationLock(...). - Da 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 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'impostazioneDEVICE_STATE_ROTATION_LOCK. Fornisce metodi per aggiornare l'impostazione, recuperarne il valore e registrare i listener per le modifiche.DeviceStateAutoRotateSettingController(Gestione finestre): sincronizzaACCELEROMETER_ROTATIONeDEVICE_STATE_ROTATION_LOCK. Quando la postura del dispositivo cambia, aggiornaACCELEROMETER_ROTATIONin base alla preferenza dell'utente per il nuovo stato. Assicura che qualsiasi modifica aACCELEROMETER_ROTATIONvenga salvata inDEVICE_STATE_ROTATION_LOCKper la postura corrente del dispositivo e, in modo simile, le modifiche aDEVICE_STATE_ROTATION_LOCKper la postura corrente si riflettano inACCELEROMETER_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.