Ruota i suggerimenti

In Android 8.0, gli utenti potevano alternare tra la modalità di rotazione automatica e quella di rotazione verticale 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 manualmente la rotazione quando necessario premendo un nuovo pulsante nella barra di navigazione. Abbiamo rinominato la modalità verticale in Blocco rotazione e si attiva quando la rotazione automatica è disattivata. Non sono state apportate modifiche alla modalità di rotazione automatica.

Quando il dispositivo è in modalità di blocco della rotazione, gli utenti possono bloccare lo schermo su qualsiasi rotazione supportata dall'attività visibile in alto (dati i vincoli attuali del sistema). Se è possibile eseguire il rendering dell'attività principale in più rotazioni in modalità di rotazione automatica, le stesse opzioni dovrebbero essere disponibili in modalità rotazione bloccata, con alcune eccezioni basate sull'impostazione screenOrientation dell'attività.

La modalità di blocco della rotazione funziona mostrando un pulsante nella barra di navigazione sulle modifiche alla rotazione del dispositivo. A tale scopo, il sensore di orientamento del dispositivo deve rimanere attivo anche quando la rotazione automatica è disattivata. Toccando questo pulsante si imposta effettivamente 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 quando decide in quale rotazione eseguire il rendering del sistema quando si passa a un'altra attività.

Questa gif mostra un telefono in orientamento orizzontale con lo schermo in orientamento verticale. Viene visualizzata un'icona per chiedere all'utente se desidera modificare l'orientamento dello schermo in orizzontale.
Figura 1 . Ruota il pulsante dei suggerimenti con il gesto "Scorri verso l'alto sul pulsante Home" abilitato

La preferenza di rotazione dell'utente deve essere mantenuta quando ci si sposta tra le attività. Tuttavia, poiché la maggior parte degli utenti di telefoni desidera trovarsi in orizzontale solo per un breve periodo di tempo temporaneo, abbiamo aggiunto una preferenza per l'orientamento naturale. La preferenza di rotazione dell'utente viene reimpostata sull'orientamento naturale del dispositivo ogni volta che la rotazione del sistema cambia nell'orientamento naturale del dispositivo. Per la maggior parte dei telefoni, l'orientamento naturale del dispositivo è verticale (0º). La reimpostazione della preferenza di rotazione dell'utente avviene spesso quando si utilizza un'app solo verticale, si blocca il telefono o si torna all'area di lavoro di avvio.

Le interazioni a rotazione per gli utenti non sono cambiate molto negli ultimi dieci anni. Gli utenti potrebbero trovare difficile scoprire questa funzionalità data la loro cronologia precedente con la rotazione e il posizionamento dei pulsanti nella barra di navigazione. Per questo motivo abbiamo aggiunto una modalità di introduzione al pulsante di rotazione che lo evidenzia quando appare. Il comportamento della modalità introduzione si verifica solo per le prime interazioni con i pulsanti, dopodiché la modalità introduzione viene disabilitata.

Fonte

Il supporto per i suggerimenti di rotazione è stato aggiunto ad Android 9. La maggior parte delle modifiche sono contenute nei seguenti file.

  • services/.../server/policy/PhoneWindowManager.java :
    • Hook che consumano 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 è disabilitata (vedi needSensorRunningLp() )
    • Calcola la rotazione del sistema in base alla preferenza di rotazione dell'utente, alle impostazioni screenOrientation attività superiore e allo stato del sistema (vedere rotationForOrientationLw() )
    • Determina se l'attività principale può ruotare secondo una determinata rotazione (vedi isRotationChoicePossible() )
  • SystemUI/.../statusbar/phone/NavigationBarFragment :
    • Determina se il pulsante della barra di navigazione deve essere mostrato nei callback dei suggerimenti di rotazione da PhoneWindowManager (vedi onRotationProposal() )
    • Gestisce quando nascondere il pulsante di rotazione della barra di navigazione (vedi chiamate a setRotateSuggestionButtonState(false) )
    • Gestisce i timeout dei pulsanti, incluso il caso speciale in cui la barra di navigazione è nascosta (comunemente a schermo intero)
    • Reimposta le preferenze dell'utente quando ritorna all'orientamento naturale del dispositivo ( mRotationWatcher )
    • Sceglie lo stile appropriato per l'animazione del pulsante della barra di navigazione, applicato in NavigationBarView (vedi onRotationProposal() )
    • Aggiunge la logica della modalità introduzione, inclusa l'animazione specializzata (vedi riferimenti a Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED )
    • Implementa il flag di rotazione disattiva2 (vedi disable() )
  • SystemUI/.../statusbar/phone/NavigationBarView.java :
    • Stili dell'animazione dell'icona del pulsante per corrispondere alla rotazione in sospeso (vedere updateRotateSuggestionButtonStyle() )
    • Gestisce le modifiche alla visibilità dei pulsanti (vedere setRotateButtonVisibility() ), inclusa la logica per nascondere il pulsante di rotazione se determinati servizi di accessibilità sono attivi (tenendo conto della classificazione dello stack dei pulsanti della barra di navigazione più a destra)
  • SystemUI/res/layout/menu_ime.xml :
    • Include un nuovo KeyButtonView per il pulsante di rotazione, impilato sopra il menu e il selettore IME/tastiera ma sotto il pulsante Accessibilità
  • 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 che lo stesso elemento disegnabile possa essere utilizzato per animare varie rotazioni iniziali e finali
    • La colorazione delle icone viene impostata tramite TintedKeyButtonDrawable

Implementazione

Android 9 include tutte le modifiche necessarie per far funzionare i suggerimenti di rotazione per i dispositivi che utilizzano i tasti di navigazione software (indietro, home, ecc.).

I produttori di dispositivi che creano dispositivi con tasti di navigazione hardware che desiderano implementare questa funzionalità dovranno progettare e implementare la propria offerta di interfaccia utente di sistema o disabilitare la funzionalità. Si raccomanda che qualsiasi superficie introdotta sia facile da usare quando il dispositivo viene tenuto a 90º o 180º rispetto alla rotazione attuale del sistema e sia rapidamente accessibile. Per questi motivi, si sconsiglia l'uso delle notifiche (come avviene per il selettore IME/tastiera).

I requisiti hardware per utilizzare questa funzionalità sono gli stessi requisiti per utilizzare la rotazione automatica.

Per garantire 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 fa questo (vedi NavigationBarFragment.mRotationWatcher ).

È presente un nuovo flag in StatusBarManager.disable2 per impedire temporaneamente la visualizzazione dei suggerimenti di rotazione. Vedere StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS . Questo flag deve essere rispettato in tutte le implementazioni poiché viene utilizzato dalle app di sistema critiche, inclusa la configurazione guidata. L'implementazione fornita lo supporta (vedi NavigationBarFragment.disable() ).

Consigliamo vivamente di abilitare 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 dei telefoni odierni tra rotazione automatica e blocco verticale.

Personalizzazione

Poiché i suggerimenti di rotazione vengono visualizzati solo in modalità rotazione bloccata (rotazione automatica disattivata), è possibile scegliere se la funzionalità è attivata per impostazione predefinita per le nuove installazioni scegliendo di disattivare la rotazione automatica per impostazione predefinita. Vedere def_accelerometer_rotation in SettingsProvider/res/values/defaults.xml per apportare modifiche predefinite.

Gli utenti possono facilmente modificare se la rotazione automatica è attiva o meno (indipendentemente dall'impostazione predefinita) tramite il riquadro di rotazione in Impostazioni rapide o Impostazioni display.

Validazione

A scopo di test, la funzionalità può essere attivata e disattivata modificando un valore di gating Settings.Secure . Ciò può essere ottenuto più facilmente eseguendo il seguente comando da un'istanza adb privilegiata:

adb shell settings put secure show_rotation_suggestions <x>

Impostare x su 0 per disattivato e 1 per attivato.

Per i test, la modalità di introduzione può essere reimpostata modificando il valore Settings.Secure associato. Ciò può essere ottenuto più facilmente eseguendo il seguente comando da un'istanza adb privilegiata:

adb shell settings put secure num_rotation_suggestions_accepted 0