Suggestions de rotation

Sous Android 8.0, les utilisateurs pouvaient basculer entre les modes de rotation automatique et de rotation en mode portrait à l'aide d'une carte Réglages rapides 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 si nécessaire en appuyant sur un nouveau bouton dans la barre de navigation. Nous avons renommé le mode portrait en "Verrouillage de rotation". Il s'active lorsque la rotation automatique est désactivée. Le mode rotation automatique n'est pas modifié.

Lorsque l'appareil est en mode verrouillage de la rotation, les utilisateurs peuvent verrouiller leur écran sur n'importe quelle rotation compatible avec l'activité visible en haut (compte tenu des contraintes système actuelles). Si l'activité supérieure peut être affichée dans plusieurs rotations en mode rotation automatique, les mêmes options doivent être disponibles en mode rotation verrouillée, avec quelques exceptions en fonction du paramètre screenOrientation de l'activité.

Le mode Verrouillage de la rotation affiche un bouton dans la barre de navigation lorsque la rotation de l'appareil change. 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 la préférence de rotation de l'utilisateur (Settings.System.USER_ROTATION). WindowManager utilise cette préférence, ainsi que d'autres informations sur l'activité principale et l'état du système, pour modifier la rotation du système. WindowManager continue d'utiliser la préférence de rotation de l'utilisateur pour déterminer la rotation à utiliser pour afficher le système lors du passage à une autre activité.

Ce GIF montre un téléphone en mode paysage avec l'écran en mode portrait. Une icône s'affiche pour demander à l'utilisateur s'il souhaite modifier l'orientation de l'écran en mode paysage.
Figure 1. Bouton de rotation des suggestions avec le geste "Balayer l'écran vers le haut depuis le bouton d'accueil" activé

La préférence de rotation de l'utilisateur doit être conservée lors du passage d'une activité à une autre. Toutefois, comme la plupart des utilisateurs de téléphones ne souhaitent utiliser le mode Paysage que pendant une courte période 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 mode portrait (0 degrés). La réinitialisation de la préférence de rotation de l'utilisateur se produit souvent lorsque vous utilisez une application en mode portrait uniquement, que vous verrouillez le téléphone ou que vous revenez à l'espace de travail du lanceur d'applications.

Les interactions de rotation pour les utilisateurs n'ont guère changé au cours de la dernière décennie. Les utilisateurs peuvent avoir du mal à découvrir cette fonctionnalité en raison de leur expérience antérieure avec la rotation et le positionnement des boutons dans la barre de navigation. C'est pourquoi nous avons ajouté un mode d'introduction au bouton de rotation qui le met en surbrillance lorsqu'il apparaît. Le comportement du mode d'introduction ne se produit que pour les premières interactions avec les boutons, après quoi le mode d'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 :
    • Crochets consommant la sortie de WindowOrientationListener (MyOrientationListener, responsable de la surveillance des capteurs pour déterminer si l'appareil a été pivoté)
    • Maintient l'WindowOrientationListener actif même lorsque la rotation automatique est désactivée (voir needSensorRunningLp())
    • Calcule la rotation du système en fonction de la préférence de rotation de l'utilisateur, des paramètres screenOrientation d'activité de premier plan et de l'état du système (voir rotationForOrientationLw()).
    • Déterminez si l'activité supérieure peut pivoter selon une rotation donnée (voir isRotationChoicePossible()).
  • SystemUI/.../statusbar/phone/NavigationBarFragment :
    • Détermine si le bouton de la barre de navigation doit s'afficher lors des rappels de suggestion de rotation à partir de PhoneWindowManager (voir onRotationProposal()).
    • Gère le moment où le bouton de rotation de la barre de navigation doit être masqué (voir les appels à setRotateSuggestionButtonState(false))
    • Gère les délais avant expiration des boutons, y compris le cas particulier où la barre de navigation est masquée (généralement en plein écran).
    • Réinitialise la préférence de l'utilisateur à 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 modifications de la 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 la plus à droite)
  • SystemUI/res/layout/menu_ime.xml :
    • Inclut un nouveau KeyButtonView pour le bouton de rotation, superposé au menu et au sélecteur d'IME/de clavier, mais sous le bouton d'accessibilité
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml :
    • AnimatedVectorDrawable complexe utilisé pour animer le bouton de rotation de la barre de navigation
    • Le style (dans SystemUI/res/values/styles.xml) permet de définir les angles de début et de fin de la rotation afin que le même drawable puisse être utilisé pour animer différentes rotations de début et de fin.
    • La teinte de l'icône est définie via TintedKeyButtonDrawable

Implémentation

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

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

Les exigences matérielles pour utiliser cette fonctionnalité sont les mêmes que celles requises pour utiliser la rotation automatique.

Pour assurer la cohérence de l'implémentation, la préférence de rotation de l'utilisateur (Settings.System.USER_ROTATION) doit être 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 le fait (voir NavigationBarFragment.mRotationWatcher).

Un nouvel indicateur est disponible dans StatusBarManager.disable2 pour empêcher temporairement l'affichage des suggestions de rotation. Consultez 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 de configuration. L'implémentation fournie est compatible avec cette fonctionnalité (voir NavigationBarFragment.disable()).

Nous vous recommandons vivement d'activer cette fonctionnalité et de suivre l'implémentation AOSP, si possible. Nous souhaitons que l'expérience de rotation soit similaire entre les appareils, comme c'est le cas aujourd'hui sur la plupart des téléphones entre la rotation automatique et le verrouillage en mode portrait.

Personnalisation

Comme les suggestions de rotation ne s'affichent que lorsque la rotation est verrouillée (rotation automatique désactivée), vous pouvez choisir si la fonctionnalité est activée par défaut pour les nouvelles installations en désactivant la rotation automatique par défaut. Consultez def_accelerometer_rotation dans SettingsProvider/res/values/defaults.xml pour apporter des modifications par défaut.

Les utilisateurs peuvent facilement modifier l'activation ou la désactivation de la rotation automatique (quelle que soit la valeur par défaut) via le bloc de rotation dans les Réglages rapides ou les paramètres d'affichage.

Validation

Pour les tests, vous pouvez activer et désactiver la fonctionnalité en modifiant une valeur Settings.Secure de filtrage. Pour ce faire, exécutez la commande suivante à partir d'une instance adb privilégiée:

adb shell settings put secure show_rotation_suggestions <x>

Définissez x sur 0 pour désactiver et sur 1 pour activer.

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

adb shell settings put secure num_rotation_suggestions_accepted 0