Cómo rotar sugerencias

En Android 8.0, los usuarios podían alternar entre la rotación automática y la vertical mediante una tarjeta de Configuración rápida o la configuración de Pantalla. En Android 9, actualizamos modo de rotación vertical para eliminar las rotaciones involuntarias fijando rotación de la pantalla actual, incluso si cambia la posición del dispositivo. Los usuarios pueden activar rotación manual cuando sea necesario presionando un nuevo botón en la barra de navegación. Cambiamos el nombre del modo Retrato a bloqueo de rotación y se activa cuando gira automáticamente 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 la pantalla en cualquier rotación admitida por la parte superior, visible (según el sistema actual restricciones). Si la actividad superior se puede renderizar en varias rotaciones en las mismas opciones deben estar disponibles en el modo de rotación bloqueada con algunas excepciones basadas en el objeto screenOrientation del lugar.

El modo de bloqueo de rotación funciona mostrando un botón en la barra de navegación durante la rotación del dispositivo cambios. Para lograr esto, el sensor de orientación del dispositivo debe permanecer activo incluso cuando la opción de girar automáticamente está desactivada. Cuando se presiona este botón, se configura de manera eficaz la rotación de los usuarios. preferencia (Settings.System.USER_ROTATION). WindowManager la usa preferencia, junto con otros detalles sobre la actividad principal y el estado del sistema, para cambiar la rotación del sistema. WindowManager sigue usando la rotación de usuarios cuando decidas en qué rotación renderizará el sistema cuando se mueva otra actividad.

Este GIF muestra un teléfono en orientación horizontal con la pantalla en
       orientación vertical. Aparecerá un ícono para preguntarle al usuario si desea
       cambiar la orientación de la pantalla a horizontal.
Figura 1: Botón de rotación de sugerencias con “Deslizar” en el botón de inicio" gestos habilitados

Se debe mantener la preferencia de rotación del usuario cuando se mueve entre actividades. Sin embargo, debido a que la mayoría de los usuarios de teléfonos solo quieren estar en modo horizontal de tiempo temporal, agregamos el sesgo de orientación natural. Rotación de usuarios preferencia es restablecer 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 (0o). Restableciendo la rotación del usuario preferencia se produce cuando se usa una app solo con orientación vertical, cuando se bloquea el teléfono o regresando al espacio de trabajo del selector.

Las interacciones de rotación para los usuarios no han cambiado mucho en la última década. Usuarios puede ser difícil descubrir esta función debido a su historial previo con la rotación y la posición de los botones en la barra de navegación. Por esta razón, hemos agregado un modo introducción al botón de rotación que lo destaca cuando aparece. Introducción el comportamiento del modo solo ocurre durante las primeras interacciones con el botón. Luego, el modo de introducción está inhabilitado.

Fuente

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

  • services/.../server/policy/PhoneWindowManager.java:
    • Enlaces que consumen el resultado de WindowOrientationListener (MyOrientationListener, responsable de supervisar sensores para determinar si se rotó el dispositivo)
    • Mantiene el elemento 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, arriba Configuración y estado del sistema de la actividad screenOrientation (consulta rotationForOrientationLw()).
    • Determina si la actividad superior puede rotar en una rotación determinada (consulta la sección isRotationChoicePossible())
  • SystemUI/.../statusbar/phone/NavigationBarFragment:
    • Determina si se debe mostrar el botón de la barra de navegación durante la rotación devoluciones de llamada de sugerencias de PhoneWindowManager (consulta onRotationProposal()).
    • Controla cuándo ocultar el botón para rotar la barra de navegación (consulta las llamadas a setRotateSuggestionButtonState(false))
    • Controla los tiempos de espera del botón, incluido el caso especial en el que La barra de navegación está oculta (por lo general, en pantalla completa)
    • Restablece las preferencias del usuario al volver a la configuración natural del dispositivo. orientación (mRotationWatcher)
    • Selecciona el estilo adecuado para la animación del botón de la barra de navegación. se aplicó 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 inhabilite2 (consulta disable()).
  • SystemUI/.../statusbar/phone/NavigationBarView.java:
    • Animación del ícono del botón de estilos para que coincida con la rotación pendiente (consulta updateRotateSuggestionButtonStyle())
    • Controla los cambios en la visibilidad de los botones (consulta setRotateButtonVisibility()), incluida la lógica para ocultar el botón para rotar si ciertos servicios de accesibilidad están activos (teniendo en cuenta la clasificación de la pila de botones de la barra de navegación que se encuentra más a la derecha)
  • SystemUI/res/layout/menu_ime.xml:
    • Se incluye un KeyButtonView nuevo para el botón de rotación. apilados encima del menú y del selector de IME/teclado, pero debajo del Botón de accesibilidad
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml:
    • Complejo AnimatedVectorDrawable usado para animar la botón para rotar la barra de navegación
    • El diseño (en SystemUI/res/values/styles.xml) se usa para lo siguiente: definir los ángulos de rotación inicial y final para que el mismo elemento de diseño pueda que se usa para animar varias rotaciones de inicio y finalización
    • El tono de los íconos se establece mediante TintedKeyButtonDrawable

Implementación

Android 9 incluye todos los cambios necesarios para obtener de rotación que funcionan para dispositivos que usan botones de navegación de software (atrás, casa, etc.).

Fabricantes de dispositivos que crean dispositivos con teclas de navegación de hardware que desean Para implementar esta función, deberán diseñar e implementar su propia IU del sistema. o inhabilitar la función. Se recomienda que todas las capas introducidas ser fácil de usar cuando el dispositivo se mantiene a 90o o 180o con respecto al sistema actual y es de fácil acceso. Por estos motivos, el uso de notificaciones (como se hace para el selector de IME/teclado) no se recomienda.

Los requisitos de hardware para usar esta función son los mismos que los requisitos para para utilizar la opción de girar automáticamente.

Para la coherencia en la implementación, es necesario saber que la preferencia de rotación del usuario (Settings.System.USER_ROTATION) se restableció a la configuración natural del dispositivo rotación 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 (consulta NavigationBarFragment.mRotationWatcher).

Hay una nueva marca en StatusBarManager.disable2 para temporalmente evitar que aparezcan sugerencias de rotación. Consulta StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS Esta marca debe ser respetado en todas las implementaciones, tal como lo usan las aplicaciones críticas del sistema, incluidas Asistente de configuración La implementación proporcionada es compatible con esto (consulta NavigationBarFragment.disable()).

Te recomendamos que habilites la función y sigas las instrucciones de AOSP para implementarlos, si es posible. Nuestro objetivo es que la experiencia de rotación sea similar entre dispositivos, lo que refleja la uniformidad de la experiencia en la mayoría de los teléfonos actuales. entre el giro automático 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 nuevas instalaciones. la opción de girar automáticamente está desactivada de forma predeterminada. Consulta def_accelerometer_rotation in SettingsProvider/res/values/defaults.xml para realizar cambios predeterminados.

Los usuarios pueden cambiar con facilidad si la rotación automática está activa o no (independientemente de la configuración predeterminada). mediante el mosaico de rotación en la Configuración rápida o la configuración de Visualización.

Validación

Para realizar pruebas, la función se puede activar y desactivar mediante la modificación de un control de acceso. Valor Settings.Secure. Esto se logró con más facilidad al ejecutar siguiente comando desde una instancia de adb con privilegios:

adb shell settings put secure show_rotation_suggestions <x>

Establece x en 0 para desactivarla y 1 para activar la función.

Para las pruebas, el modo de introducción puede restablecerse modificando los Valor Settings.Secure. Esto se logró con más facilidad al ejecutar siguiente comando desde una instancia de adb con privilegios:

adb shell settings put secure num_rotation_suggestions_accepted 0