In Android 8.0, gli utenti potevano passare dalla modalità di rotazione automatica a quella di rotazione verticale e viceversa utilizzando un riquadro Impostazioni rapide o le impostazioni di visualizzazione. In Android 9 abbiamo aggiornato la modalità di rotazione verticale per eliminare le rotazioni involontarie bloccando la rotazione corrente dello schermo anche se la posizione del dispositivo cambia. Gli utenti possono attivare la rotazione manualmente, se necessario, premendo un nuovo pulsante nella barra di navigazione. Abbiamo rinominato la modalità Ritratto in Blocco rotazione e si attiva quando la rotazione automatica è disattivata. La modalità di rotazione automatica non è stata modificata.
Quando il dispositivo è in modalità di blocco della rotazione, gli utenti possono bloccare lo schermo su qualsiasi rotazione supportata dall'attività visibile in alto (in base alle attuali limitazioni del sistema). Se l'attività principale può essere visualizzata in più rotazioni in modalità di rotazione automatica, le stesse opzioni dovrebbero essere disponibili in modalità di rotazione bloccata, con alcune eccezioni in base all'impostazione screenOrientation
dell'attività.
La modalità di blocco della rotazione funziona mostrando un pulsante nella barra di navigazione quando cambia la rotazione del dispositivo. Per farlo, il sensore di orientamento del dispositivo deve rimanere attivo anche quando la rotazione automatica è disattivata. Toccando questo pulsante viene impostata la preferenza di rotazione dell'utente (Settings.System.USER_ROTATION
). WindowManager utilizza questa preferenza, insieme ad altri dettagli sull'attività principale e sullo stato del sistema, per modificare la rotazione del sistema. WindowManager continua a utilizzare la preferenza di rotazione dell'utente per decidere in quale rotazione visualizzare il sistema quando si passa a un'altra attività.

La preferenza di rotazione dell'utente deve essere mantenuta quando si passa da un'attività all'altra. Tuttavia, poiché la maggior parte degli utenti di smartphone vuole utilizzare l'orientamento orizzontale solo per brevi periodi di tempo, abbiamo aggiunto un bias di orientamento naturale. La preferenza di rotazione dell'utente viene reimpostata sull'orientamento naturale del dispositivo ogni volta che la rotazione del sistema cambia in base all'orientamento naturale del dispositivo. Per la maggior parte degli smartphone, l'orientamento naturale del dispositivo è verticale (0º). La reimpostazione della preferenza di rotazione dell'utente avviene spesso quando si utilizza un'app solo in verticale, si blocca lo smartphone o si ritorna allo spazio di lavoro del launcher.
Le interazioni con la rotazione per gli utenti non sono cambiate molto nell'ultimo decennio. Gli utenti potrebbero avere difficoltà a trovare questa funzionalità, a causa della loro esperienza precedente con la rotazione e il posizionamento dei pulsanti nella barra di navigazione. Per questo motivo, abbiamo aggiunto al pulsante di rotazione una modalità di introduzione che lo evidenzia quando viene visualizzato. Il comportamento della modalità Intro avviene solo per le prime interazioni con i pulsanti, dopodiché la modalità Intro viene disattivata.
Fonte
In Android 9 è stato aggiunto il supporto per i suggerimenti di rotazione. La maggior parte delle modifiche è contenuta nei seguenti file.
services/.../server/policy/PhoneWindowManager.java
:- Hook che utilizzano l'output di
WindowOrientationListener
(MyOrientationListener
, responsabile del monitoraggio dei sensori per determinare se il dispositivo è stato ruotato) - Mantiene attivo
WindowOrientationListener
anche quando la rotazione automatica è disattivata (vedineedSensorRunningLp()
). - Calcola la rotazione del sistema in base alle preferenze di rotazione dell'utente, alle impostazioni principali dell'attività
screenOrientation
e allo stato del sistema (vedirotationForOrientationLw()
). - Determina se l'attività principale può ruotare in base a una determinata rotazione (vedi
isRotationChoicePossible()
)
- Hook che utilizzano l'output di
SystemUI/.../statusbar/phone/NavigationBarFragment
:- Determina se il pulsante della barra di navigazione deve essere visualizzato durante i callback dei suggerimenti di rotazione da
PhoneWindowManager
(vedionRotationProposal()
) - Gestisce quando nascondere il pulsante di rotazione della barra di navigazione (vedi le chiamate a
setRotateSuggestionButtonState(false)
) - Gestisce i timeout dei pulsanti, incluso il caso speciale in cui la barra di navigazione è nascosta (in genere in modalità a schermo intero)
- Reimposta la preferenza dell'utente al ritorno all'orientamento naturale del dispositivo (
mRotationWatcher
) - Scegli lo stile appropriato per l'animazione del pulsante della barra di navigazione,
applicato in
NavigationBarView
(vedionRotationProposal()
) - Aggiunge la logica della modalità di introduzione, inclusa un'animazione specializzata
(vedi i riferimenti a
Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED
) - Implementa il flag di rotazione disattiva2 (vedi
disable()
)
- Determina se il pulsante della barra di navigazione deve essere visualizzato durante i callback dei suggerimenti di rotazione da
SystemUI/.../statusbar/phone/NavigationBarView.java
:- Animazione dell'icona del pulsante Stili in base alla rotazione in attesa (vedi
updateRotateSuggestionButtonStyle()
) - Gestisce le modifiche alla visibilità dei pulsanti (vedi
setRotateButtonVisibility()
), inclusa la logica per nascondere il pulsante di rotazione se sono attivi determinati servizi di accessibilità (tenendo conto del ranking della serie di pulsanti della barra di navigazione più a destra)
- Animazione dell'icona del pulsante Stili in base alla rotazione in attesa (vedi
SystemUI/res/layout/menu_ime.xml
:- Include un nuovo
KeyButtonView
per il pulsante di rotazione, sovrapposto al menu e al selettore di IME/tastiera, ma sotto il pulsante Accessibilità
- Include un nuovo
SystemUI/res/drawable/ic_sysbar_rotate_button.xml
:AnimatedVectorDrawable
complesso utilizzato per animare il pulsante di rotazione della barra di navigazione- Lo stile (in
SystemUI/res/values/styles.xml
) viene utilizzato per impostare gli angoli di rotazione iniziale e finale in modo da poter utilizzare lo stesso elemento visibile per animare varie rotazioni iniziali e finali - La colorazione delle icone è impostata tramite
TintedKeyButtonDrawable
Implementazione
Android 9 include tutte le modifiche necessarie per attivare i suggerimenti di rotazione per i dispositivi che utilizzano i tasti di navigazione software (Indietro, Home e così via).
I produttori di dispositivi che creano dispositivi con tasti di navigazione hardware e vogliono implementare questa funzionalità dovranno progettare e implementare il proprio affordance della UI di sistema o disattivare la funzionalità. È consigliabile che qualsiasi superficie introdotta sia facile da usare quando il dispositivo è tenuto a 90° o 180° rispetto alla rotazione corrente del sistema ed è rapidamente accessibile. Per questi motivi, l'utilizzo delle notifiche (come avviene per il selettore di tastiera/IME) non è consigliato.
I requisiti hardware per l'utilizzo di questa funzionalità sono gli stessi per l'utilizzo della rotazione automatica.
Per la coerenza dell'implementazione, è necessario che la preferenza di rotazione dell'utente (Settings.System.USER_ROTATION
) venga reimpostata sulla rotazione naturale del dispositivo quando il sistema passa alla rotazione naturale del dispositivo per qualsiasi motivo quando la rotazione automatica è disattivata. L'implementazione fornita esegue questa operazione (vedi Settings.System.USER_ROTATION
).NavigationBarFragment.mRotationWatcher
In StatusBarManager.disable2
è presente un nuovo flag per impedire temporaneamente la visualizzazione dei suggerimenti di rotazione. Consulta
StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS
. Questo flag deve essere seguito in tutte le implementazioni, in quanto viene utilizzato dalle app di sistema critiche, tra cui la Configurazione guidata. L'implementazione fornita supporta questa funzionalità (consulta
NavigationBarFragment.disable()
).
Ti consigliamo vivamente di attivare la funzionalità e di seguire l'implementazione AOSP, se possibile. Il nostro obiettivo è mantenere l'esperienza di rotazione simile tra i dispositivi, rispecchiando l'uniformità dell'esperienza sulla maggior parte degli smartphone oggi tra rotazione automatica e blocco verticale.
Personalizzazione
Poiché i suggerimenti di rotazione vengono visualizzati solo in modalità di rotazione bloccata (rotazione automatica disattivata), è possibile scegliere se la funzionalità è attiva per impostazione predefinita per le nuove installazioni disattivando la rotazione automatica per impostazione predefinita. Consulta
def_accelerometer_rotation
in
SettingsProvider/res/values/defaults.xml
per apportare modifiche predefinite.
Gli utenti possono modificare facilmente se la rotazione automatica è attiva o meno (indipendentemente dal valore predefinito) tramite il riquadro di rotazione nelle Impostazioni rapide o nelle Impostazioni di visualizzazione.
Convalida
Per i test, la funzionalità può essere attivata e disattivata modificando un valore di gatingSettings.Secure
. Questa operazione può essere eseguita più facilmente eseguendo il seguente comando da un'istanza adb con privilegi:
adb shell settings put secure show_rotation_suggestions <x>
Imposta x su 0
per off e 1
per on.
Per i test, la modalità introduttiva può essere reimpostata modificando il valore Settings.Secure
associato. Questa operazione può essere eseguita più facilmente eseguendo il seguente comando da un'istanza adb con privilegi:
adb shell settings put secure num_rotation_suggestions_accepted 0