Suggestions de rotation

Dans Android 8.0, les utilisateurs pouvaient basculer entre les modes de rotation automatique et de rotation portrait à l'aide d'une vignette Quicksettings ou des paramètres d'affichage. Dans Android 9, nous avons mis à jour le mode de rotation portrait pour éliminer les rotations involontaires en épinglant la rotation actuelle de l'écran même si la position de l'appareil change. Les utilisateurs peuvent déclencher la rotation manuellement en cas de besoin en appuyant sur un nouveau bouton dans la barre de navigation. Nous avons renommé le mode portrait en verrouillage de rotation et il s'active lorsque la rotation automatique est désactivée. Il n’y a aucun changement dans le mode de rotation automatique.

Lorsque l'appareil est en mode de verrouillage de rotation, les utilisateurs peuvent verrouiller leur écran sur n'importe quelle rotation prise en charge par l'activité supérieure visible (compte tenu des contraintes actuelles du système). Si l'activité supérieure peut être rendue dans plusieurs rotations en mode rotation automatique, les mêmes options doivent être disponibles en mode rotation verrouillée, à quelques exceptions près basées sur le paramètre screenOrientation de l'activité.

Le mode de verrouillage de la rotation fonctionne en affichant un bouton dans la barre de navigation lors des modifications de rotation de l'appareil. Pour ce faire, le capteur d'orientation de l'appareil doit rester actif même lorsque la rotation automatique est désactivée. Appuyer sur ce bouton définit efficacement les préférences de rotation de l'utilisateur ( Settings.System.USER_ROTATION ). WindowManager utilise cette préférence, ainsi que d'autres détails sur l'activité principale et l'état du système, pour modifier la rotation du système. WindowManager continue d'utiliser les préférences de rotation de l'utilisateur pour décider dans quelle rotation rendre le système lors du passage à une autre activité.

Ce gif montre un téléphone en orientation paysage avec l'écran en orientation portrait. Une icône apparaît pour demander à l'utilisateur s'il souhaite changer l'orientation de son écran en paysage.
Figure 1 . Faites pivoter le bouton de suggestion avec le geste « Glisser vers le haut sur le bouton Accueil » activé

La préférence de rotation des utilisateurs doit être conservée lors du déplacement entre les activités. Cependant, comme la plupart des utilisateurs de téléphones souhaitent rester dans le paysage pendant une période courte et temporaire, nous avons ajouté un biais d'orientation naturelle. La préférence de rotation de l'utilisateur est réinitialisée sur l'orientation naturelle de l'appareil chaque fois que la rotation du système passe à l'orientation naturelle de l'appareil. Pour la plupart des téléphones, l'orientation naturelle de l'appareil est le portrait (0º). La réinitialisation des préférences de rotation de l'utilisateur se produit souvent lors de l'utilisation d'une application portrait uniquement, du verrouillage du téléphone ou du retour à l'espace de travail du lanceur.

Les interactions de rotation pour les utilisateurs n'ont pas beaucoup changé au cours de la dernière décennie. Les utilisateurs peuvent trouver cette fonctionnalité difficile à découvrir compte tenu de leur historique de rotation et de positionnement des boutons dans la barre de navigation. Pour cette raison, nous avons ajouté un mode d'introduction au bouton de rotation qui le met en surbrillance lorsqu'il apparaît. Le comportement du mode Intro ne se produit que pour les premières interactions des boutons, après quoi le mode Introduction est désactivé.

Source

La prise en charge des suggestions de rotation a été ajoutée à Android 9. La plupart des modifications sont contenues dans les fichiers suivants.

  • services/.../server/policy/PhoneWindowManager.java :
    • Hooks consommant la sortie de WindowOrientationListener ( MyOrientationListener , responsable de la surveillance des capteurs pour déterminer si l'appareil a pivoté)
    • Maintient WindowOrientationListener actif même lorsque la rotation automatique est désactivée (voir needSensorRunningLp() )
    • Calcule la rotation du système en fonction des préférences de rotation de l'utilisateur, des paramètres d'orientation screenOrientation d'activité supérieur et de l'état du système (voir rotationForOrientationLw() )
    • Déterminez si l'activité supérieure peut effectuer une rotation selon une rotation donnée (voir isRotationChoicePossible() )
  • SystemUI/.../statusbar/phone/NavigationBarFragment :
    • Détermine si le bouton de la barre de navigation doit être affiché lors des rappels de suggestion de rotation de PhoneWindowManager (voir onRotationProposal() )
    • Gère quand masquer le bouton de rotation de la barre de navigation (voir les appels à setRotateSuggestionButtonState(false) )
    • Gère les délais d'attente des boutons, y compris le cas particulier où la barre de navigation est masquée (généralement en plein écran)
    • Réinitialise les préférences de l'utilisateur lors du retour à l'orientation naturelle de l'appareil ( mRotationWatcher )
    • Sélectionne le style approprié pour l'animation du bouton de la barre de navigation, appliqué dans NavigationBarView (voir onRotationProposal() )
    • Ajoute une logique de mode d'introduction, y compris une animation spécialisée (voir les références à Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED )
    • Implémente l'indicateur de rotation Disable2 (voir disable() )
  • SystemUI/.../statusbar/phone/NavigationBarView.java :
    • Animation de l'icône du bouton Styles pour correspondre à la rotation en attente (voir updateRotateSuggestionButtonStyle() )
    • Gère les changements de visibilité des boutons (voir setRotateButtonVisibility() ), y compris la logique permettant de masquer le bouton de rotation si certains services d'accessibilité sont actifs (en tenant compte du classement de la pile de boutons de la barre de navigation le plus à droite)
  • SystemUI/res/layout/menu_ime.xml :
    • Inclut un nouveau KeyButtonView pour le bouton de rotation, empilé au-dessus du menu et du sélecteur IME/clavier mais en dessous du bouton d'accessibilité
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml :
    • Complexe AnimatedVectorDrawable utilisé pour animer le bouton de rotation de la barre de navigation
    • Le style (dans SystemUI/res/values/styles.xml ) est utilisé pour définir les angles de rotation de début et de fin afin que le même dessin puisse être utilisé pour animer diverses rotations de début et de fin.
    • La teinte des icônes est définie via TintedKeyButtonDrawable

Mise en œuvre

Android 9 inclut toutes les modifications nécessaires pour que les suggestions de rotation fonctionnent sur les appareils qui utilisent les touches de navigation logicielles (retour, accueil, etc.).

Les fabricants d'appareils qui créent des appareils dotés de touches de navigation matérielles et souhaitant implémenter cette fonctionnalité devront concevoir et implémenter leur propre fonctionnalité d'interface utilisateur système ou désactiver la fonctionnalité. Il est recommandé que toute surface introduite soit facile à utiliser lorsque l'appareil est maintenu à 90º ou 180º par rapport à la rotation actuelle du système et qu'elle soit rapidement accessible. Pour ces raisons, l’utilisation de notifications (comme c’est le cas pour le sélecteur IME/clavier) n’est pas recommandée.

La configuration matérielle requise pour utiliser cette fonctionnalité est la même que celle requise pour utiliser la rotation automatique.

Il est nécessaire pour la cohérence de l'implémentation que la préférence de rotation de l'utilisateur ( Settings.System.USER_ROTATION ) soit réinitialisée sur la rotation naturelle de l'appareil lorsque le système passe à la rotation naturelle de l'appareil pour une raison quelconque lorsque la rotation automatique est désactivée. L'implémentation fournie fait cela (voir NavigationBarFragment.mRotationWatcher ).

Il y a un nouvel indicateur dans StatusBarManager.disable2 pour empêcher temporairement l'apparition des suggestions de rotation. Voir StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS . Cet indicateur doit être respecté dans toutes les implémentations car il est utilisé par les applications système critiques, y compris l'assistant d'installation. L'implémentation fournie prend en charge cela (voir NavigationBarFragment.disable() ).

Nous vous recommandons fortement d'activer la fonctionnalité et de suivre la mise en œuvre de l'AOSP, si possible. Notre objectif est de maintenir une expérience de rotation similaire entre les appareils, reflétant l'uniformité de l'expérience actuelle sur la plupart des téléphones entre la rotation automatique et le verrouillage portrait.

Personnalisation

Comme les suggestions de rotation n'apparaissent qu'en mode rotation verrouillée (rotation automatique désactivée), il est possible de choisir si la fonctionnalité est activée par défaut pour les nouvelles installations en choisissant de désactiver la rotation automatique par défaut. Voir def_accelerometer_rotation dans SettingsProvider/res/values/defaults.xml pour apporter des modifications par défaut.

Les utilisateurs peuvent facilement modifier si la rotation automatique est active ou non (quelle que soit la valeur par défaut) via la vignette de rotation dans les paramètres rapides ou les paramètres d'affichage.

Validation

Pour les tests, la fonctionnalité peut être désactivée et activée en modifiant une valeur de déclenchement Settings.Secure . Cela est plus simple en exécutant la commande suivante à partir d'une instance adb privilégiée :

adb shell settings put secure show_rotation_suggestions <x>

Réglez x sur 0 pour désactiver et 1 pour activer.

Pour les tests, le mode d'introduction peut être réinitialisé en modifiant la valeur Settings.Secure associée. Cela est plus simple en exécutant la commande suivante à partir d'une instance adb privilégiée :

adb shell settings put secure num_rotation_suggestions_accepted 0