Rotar sugerencias

En Android 8.0, los usuarios podían alternar entre los modos de rotación automática y vertical mediante un mosaico de configuración rápida o la configuración de pantalla. En Android 9, actualizamos el modo de rotación vertical para eliminar las rotaciones involuntarias fijando la rotación actual de la pantalla incluso si cambia la posición del dispositivo. Los usuarios pueden activar la rotación manualmente cuando sea necesario presionando un nuevo botón en la barra de navegación. Cambiamos el nombre del modo de retrato a bloqueo de rotación y se activa cuando la rotación automática está desactivada. No hay cambios en el modo de rotación automática.

Cuando el dispositivo está en modo de bloqueo de rotación, los usuarios pueden bloquear su pantalla a cualquier rotación admitida por la Actividad visible superior (dadas las restricciones actuales del sistema). Si la actividad superior se puede representar en varias rotaciones en el modo de rotación automática, las mismas opciones deberían estar disponibles en el modo de rotación bloqueada, con algunas excepciones basadas en la configuración de orientación de la pantalla de la screenOrientation .

El modo de bloqueo de rotación funciona al mostrar un botón en la barra de navegación en los cambios de rotación del dispositivo. Para lograr esto, el sensor de orientación del dispositivo debe permanecer activo incluso cuando la rotación automática esté desactivada. Al tocar este botón, se establece efectivamente la preferencia de rotación del usuario ( Settings.System.USER_ROTATION ). WindowManager usa esta preferencia, junto con otros detalles sobre la Actividad superior y el estado del sistema, para cambiar la rotación del sistema. WindowManager sigue utilizando la preferencia de rotación del usuario al decidir en qué rotación renderizar el sistema al pasar a otra actividad.

Este gif muestra un teléfono en orientación horizontal con la pantalla en orientación vertical. Aparece un icono para preguntar al usuario si desea cambiar la orientación de la pantalla a horizontal.
Figura 1 . Girar el botón de sugerencia con el gesto "Deslizar hacia arriba en el botón de inicio" habilitado

Se debe mantener la preferencia de rotación de usuarios al moverse entre actividades. Sin embargo, debido a que la mayoría de los usuarios de teléfonos solo quieren estar en el paisaje durante un período de tiempo corto y temporal, agregamos un sesgo de orientación natural. La preferencia de rotación del usuario se restablece a la orientación natural del dispositivo cada vez que la rotación del sistema cambia a la orientación natural del dispositivo. Para la mayoría de los teléfonos, la orientación natural del dispositivo es vertical (0º). El restablecimiento de la preferencia de rotación del usuario a menudo ocurre cuando se usa una aplicación de solo retrato, se bloquea el teléfono o se regresa al espacio de trabajo del iniciador.

Las interacciones de rotación para los usuarios no han cambiado mucho en la última década. Es posible que a los usuarios les resulte difícil descubrir esta función debido a su historial anterior con la rotación y el posicionamiento de los botones en la barra de navegación. Por esta razón, hemos agregado un modo de introducción al botón de rotación que lo resalta cuando aparece. El comportamiento del modo de introducción solo ocurre durante las primeras interacciones de los botones, después de lo cual se desactiva el modo de introducción.

Fuente

Se agregó soporte para sugerencias de rotación a Android 9. La mayoría de los cambios están contenidos en los siguientes archivos.

  • services/.../server/policy/PhoneWindowManager.java :
    • Ganchos que consumen la salida de WindowOrientationListener ( MyOrientationListener , responsable de monitorear los sensores para determinar si el dispositivo ha sido girado)
    • Mantiene activo WindowOrientationListener incluso cuando la rotación automática está deshabilitada (ver needSensorRunningLp() )
    • Calcula la rotación del sistema dada la preferencia de rotación del usuario, la configuración de screenOrientation de la pantalla de actividad superior y el estado del sistema (ver rotationForOrientationLw() )
    • Determinar si la Actividad superior puede rotar a una rotación dada (ver isRotationChoicePossible() )
  • SystemUI/.../statusbar/phone/NavigationBarFragment :
    • Determina si el botón de la barra de navegación debe mostrarse en las devoluciones de llamada de sugerencia de rotación de PhoneWindowManager (ver onRotationProposal() )
    • Maneja cuándo ocultar el botón de rotación de la barra de navegación (ver llamadas a setRotateSuggestionButtonState(false) )
    • Maneja los tiempos de espera de los botones, incluido el caso especial cuando la barra de navegación está oculta (comúnmente en pantalla completa)
    • Restablece la preferencia del usuario al volver a la orientación natural del dispositivo ( mRotationWatcher )
    • Elige el estilo apropiado para la animación del botón de la barra de navegación, aplicado en NavigationBarView (ver onRotationProposal() )
    • Agrega la lógica del modo de introducción, incluida la animación especializada (consulte las referencias a Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED )
    • Implementa el indicador de rotación disabled2 (ver disabled disable() )
  • SystemUI/.../statusbar/phone/NavigationBarView.java :
    • Animación del icono del botón de estilos para que coincida con la rotación pendiente (ver updateRotateSuggestionButtonStyle() )
    • Maneja los cambios de visibilidad de los botones (consulte setRotateButtonVisibility() ), incluida la lógica para ocultar el botón de rotación si ciertos servicios de accesibilidad están activos (lo que representa la clasificación de la pila de botones de la barra de navegación más a la derecha)
  • SystemUI/res/layout/menu_ime.xml :
    • Incluye un nuevo KeyButtonView para el botón de rotación, apilado sobre el menú y el selector de IME/teclado pero debajo del botón de Accesibilidad
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml :
    • Complex AnimatedVectorDrawable utilizado para animar el botón de rotación de la barra de navegación
    • El estilo (en SystemUI/res/values/styles.xml ) se usa para establecer los ángulos de rotación inicial y final, por lo que el mismo elemento de diseño se puede usar para animar varias rotaciones iniciales y finales.
    • El teñido de iconos se establece a través TintedKeyButtonDrawable

Implementación

Android 9 incluye todos los cambios necesarios para que las sugerencias de rotación funcionen para dispositivos que usan teclas de navegación de software (atrás, inicio, etc.).

Los fabricantes de dispositivos que creen dispositivos con teclas de navegación de hardware que deseen implementar esta función deberán diseñar e implementar su propia capacidad de interfaz de usuario del sistema o deshabilitar la función. Se recomienda que cualquier superficie introducida sea fácil de usar cuando el dispositivo se mantiene a 90º o 180º de la rotación actual del sistema y es rápidamente accesible. Por estos motivos, no se recomienda el uso de notificaciones (como se hace con el selector de IME/teclado).

Los requisitos de hardware para usar esta característica son los mismos que los requisitos para usar la rotación automática.

Es necesario para la coherencia de la implementación que la preferencia de rotación del usuario ( Settings.System.USER_ROTATION ) se restablezca a la rotación natural del dispositivo cuando el sistema cambia a la rotación natural del dispositivo por cualquier motivo cuando la rotación automática está desactivada. La implementación proporcionada hace esto (ver NavigationBarFragment.mRotationWatcher ).

Hay una nueva bandera en StatusBarManager.disable2 para evitar temporalmente que aparezcan sugerencias de rotación. Consulte StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS . Este indicador debe respetarse en todas las implementaciones, ya que lo usan las aplicaciones críticas del sistema, incluido el Asistente de configuración. La implementación proporcionada admite esto (consulte NavigationBarFragment.disable() ).

Recomendamos encarecidamente habilitar la función y seguir la implementación de AOSP, si es posible. Nuestro objetivo es mantener la experiencia de rotación similar entre dispositivos, reflejando la uniformidad en la experiencia en la mayoría de los teléfonos hoy en día entre la rotación automática y el bloqueo vertical.

personalización

Como las sugerencias de rotación aparecen solo en el modo de rotación bloqueada (rotación automática desactivada), es posible elegir si la función está activada de forma predeterminada para las nuevas instalaciones eligiendo la rotación automática desactivada de forma predeterminada. Consulte def_accelerometer_rotation en SettingsProvider/res/values/defaults.xml para realizar cambios predeterminados.

Los usuarios pueden cambiar fácilmente si la rotación automática está activa o no (independientemente del valor predeterminado) a través del mosaico de rotación en Configuración rápida o Configuración de pantalla.

Validación

Para realizar pruebas, la función se puede activar y desactivar modificando un valor de Settings.Secure de activación. Esto se logra más fácilmente ejecutando el siguiente comando desde una instancia adb privilegiada:

adb shell settings put secure show_rotation_suggestions <x>

Establezca x en 0 para desactivar y 1 para activar.

Para las pruebas, el modo de introducción se puede restablecer modificando el valor de Settings.Secure asociado. Esto se logra más fácilmente ejecutando el siguiente comando desde una instancia adb privilegiada:

adb shell settings put secure num_rotation_suggestions_accepted 0