Cómo rotar sugerencias

En Android 8.0, los usuarios podían alternar entre los modos de rotación automática y vertical con una tarjeta 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 no deseadas fijando la rotación de pantalla actual, 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 vertical a bloqueo de rotación, y se activa cuando la función Girar automáticamente está desactivada. No hay cambios en el modo Girar automáticamente.

Cuando el dispositivo está en modo de bloqueo de rotación, los usuarios pueden bloquear la pantalla en cualquier rotación compatible con la actividad visible superior (según las restricciones actuales del sistema). Si la actividad superior se puede renderizar 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 según la configuración de screenOrientation de la actividad.

El modo de bloqueo de rotación funciona mostrando un botón en la barra de navegación cuando cambian los cambios de rotación del dispositivo. Para lograrlo, el sensor de orientación del dispositivo debe permanecer activo incluso cuando la opción de giro automático está desactivada. Si presionas este botón, se establece de manera efectiva 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 usando la preferencia de rotación del usuario cuando decide en qué rotación renderizar el sistema cuando se cambia a otra actividad.

En este GIF, se muestra un teléfono en orientación horizontal con la pantalla en orientación vertical. Aparece un ícono para preguntarle al usuario si quiere cambiar la orientación de la pantalla a horizontal.
Figura 1: Botón de rotación de sugerencias con el gesto "Desliza hacia arriba en el botón de inicio" habilitado

La preferencia de rotación del usuario debe mantenerse cuando se cambia de una actividad a otra. Sin embargo, como la mayoría de los usuarios de teléfonos solo quieren usar el modo horizontal por un período breve y temporal, agregamos el 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. En 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 suele ocurrir cuando se usa una app solo en modo vertical, se bloquea el teléfono o se regresa al espacio de trabajo del selector.

Las interacciones de rotación para los usuarios no han cambiado mucho en la última década. Es posible que los usuarios encuentren 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 este motivo, agregamos un modo de introducción al botón de rotación que lo destaca cuando aparece. El comportamiento del modo de introducción solo se produce durante las primeras interacciones con los botones, después de las cuales se inhabilita el modo de introducción.

Fuente

Se agregó compatibilidad con las sugerencias de rotación a Android 9. La mayoría de los cambios se encuentran en los siguientes archivos.

  • services/.../server/policy/PhoneWindowManager.java:
    • Hook que consume el resultado de WindowOrientationListener (MyOrientationListener, responsable de supervisar los sensores para determinar si se giró el dispositivo)
    • Mantiene el WindowOrientationListener activo incluso cuando el giro automático está inhabilitado (consulta needSensorRunningLp()).
    • Calcula la rotación del sistema según la preferencia de rotación del usuario, la configuración superior de screenOrientation de la actividad y el estado del sistema (consulta rotationForOrientationLw()).
    • Determina si la actividad superior puede rotar a una rotación determinada (consulta isRotationChoicePossible()).
  • SystemUI/.../statusbar/phone/NavigationBarFragment:
    • Determina si se debe mostrar el botón de la barra de navegación en las devoluciones de llamada de sugerencias de rotación de PhoneWindowManager (consulta onRotationProposal()).
    • Controla cuándo ocultar el botón de la barra de navegación para rotar (consulta las llamadas a setRotateSuggestionButtonState(false)).
    • Controla los tiempos de espera de los botones, incluido el caso especial cuando la barra de navegación está oculta (por lo general, en pantalla completa).
    • Restablece la preferencia del usuario cuando se vuelve a la orientación natural del dispositivo (mRotationWatcher).
    • Elige el estilo adecuado para la animación del botón de la barra de navegación, que se aplica en NavigationBarView (consulta onRotationProposal()).
    • Agrega lógica del modo de introducción, incluida la animación especializada (consulta las referencias a Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED).
    • Implementa la marca de rotación disable2 (consulta disable()).
  • SystemUI/.../statusbar/phone/NavigationBarView.java:
    • Animación del ícono del botón de diseño para que coincida con la rotación pendiente (consulta updateRotateSuggestionButtonStyle())
    • Controla los cambios de visibilidad de los botones (consulta setRotateButtonVisibility()), incluida la lógica para ocultar el botón de rotación si ciertos servicios de accesibilidad están activos (se tiene en cuenta 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, que se apila sobre el menú y el selector de IME/teclado, pero debajo del botón de accesibilidad.
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml:
    • AnimatedVectorDrawable complejo que se usa para animar el botón de la barra de navegación que rota
    • El diseño (en SystemUI/res/values/styles.xml) se usa para establecer los ángulos de inicio y finalización de la rotación, de modo que se pueda usar el mismo elemento de diseño para animar varias rotaciones de inicio y finalización.
    • El tono de los íconos se establece a través de TintedKeyButtonDrawable.

Implementación

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

Los fabricantes de dispositivos que crean dispositivos con teclas de navegación de hardware que desean implementar esta función deberán diseñar e implementar su propio indicador visual de la IU del sistema o inhabilitar la función. Se recomienda que cualquier superficie que se presente sea fácil de usar cuando el dispositivo se sostenga a 90º o 180º de la rotación del sistema actual y se pueda acceder a ella rápidamente. Por estos motivos, no se recomienda el uso de notificaciones (como se hace para el selector de IME o teclado).

Los requisitos de hardware para usar esta función son los mismos que los requisitos para usar la función de giro automático.

Para garantizar la coherencia de la implementación, es necesario que la preferencia de rotación del usuario (Settings.System.USER_ROTATION) se restablezca a la rotación natural del dispositivo cuando el sistema cambie a la rotación natural del dispositivo por cualquier motivo cuando la rotación automática esté desactivada. La implementación proporcionada hace esto (consulta NavigationBarFragment.mRotationWatcher).

Hay una nueva marca en StatusBarManager.disable2 para evitar temporalmente que aparezcan sugerencias de rotación. Consulta StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS. Esta marca se debe respetar en todas las implementaciones, ya que la usan las apps del sistema críticas, incluido el Asistente de configuración. La implementación proporcionada admite esto (consulta NavigationBarFragment.disable()).

Te recomendamos que habilites la función y sigas la implementación de AOSP, si es posible. Nuestro objetivo es mantener la experiencia de rotación similar entre los dispositivos, lo que refleja la uniformidad en la experiencia de la mayoría de los teléfonos actuales entre la rotación automática y el bloqueo vertical.

Personalización

Como las sugerencias de rotación solo aparecen 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 instalaciones nuevas. Para ello, desactiva la rotación automática de forma predeterminada. Consulta def_accelerometer_rotation en SettingsProvider/res/values/defaults.xml para realizar cambios predeterminados.

Los usuarios pueden cambiar fácilmente si la opción de giro automático está activa o no (independientemente de la configuración predeterminada) a través de la tarjeta de giro en Configuración rápida o Configuración de pantalla.

Validación

Para las pruebas, se puede desactivar y activar la función alterando un valor de Settings.Secure de control de acceso. Para ello, ejecuta el siguiente comando desde una instancia de adb con privilegios:

adb shell settings put secure show_rotation_suggestions <x>

Establece x en 0 para desactivar y 1 para activar.

Para las pruebas, se puede restablecer el modo de introducción alterando el valor asociado de Settings.Secure. Para ello, ejecuta el siguiente comando desde una instancia de adb con privilegios:

adb shell settings put secure num_rotation_suggestions_accepted 0