Modo de espera de la TV

En Android 11, el sueño por inactividad es una función de ahorro de energía que permite establecer un tiempo de espera de inactividad del usuario, tras el cual la pantalla se apaga, incluso aunque se mantengan ventanas con FLAG_KEEP_SCREEN_ON visibles o bloqueos de activación de nivel FULL_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK o SCREEN_DIM_WAKE_LOCK. Los bloqueos de activación con el nivel PARTIAL_WAKE_LOCK no se ven afectados por esta función. Poco antes de que venza el tiempo de espera, se puede mostrar un mensaje que advierta al usuario que el dispositivo entrará en modo de suspensión si no interactúa con él.

En este contexto, la actividad del usuario se refiere a cualquier acción que active una llamada a PowerManager#userActivity (sin la marca USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS), lo que incluye, sin limitaciones, lo siguiente:

  • Cómo interactuar con la pantalla táctil
  • Presionar un botón físico
  • Eventos de entrada de un accesorio externo (por ejemplo, teclado conectado, control remoto Bluetooth o control remoto IR)
  • Interacción de voz
  • Recepción de ciertos mensajes de HDMI CEC, como One Touch Play
  • Cómo iniciar una sesión de transmisión nueva

Personalización

Si la función está habilitada, el dispositivo muestra una advertencia en la pantalla después de un tiempo especificado de inactividad del usuario. Si no se realiza ninguna acción, la pantalla se apaga. Puedes personalizar la función con estas opciones de configuración.

Configura el tiempo de espera

Para configurar el tiempo de espera, actualiza el siguiente elemento en frameworks/base/core/res/res/values/config.xml:

  • config_attentiveTimeout
    • Especifica el tiempo predeterminado en milisegundos de inactividad del usuario después del cual se apaga la pantalla (incluso si hay bloqueos de activación de la pantalla).
    • Se establece en el momento de la compilación.
    • Si el valor está entre 0 y config_minimumScreenOffTimeout, el tiempo de espera se establece en config_minimumScreenOffTimeout para evitar que el dispositivo apague la pantalla poco después de activarse.
    • El valor predeterminado es -1, que inhabilita esta función.

Anula el tiempo de espera predeterminado

Para anular el parámetro de configuración de tiempo de espera predeterminado, actualiza el siguiente elemento.

  • Settings.Secure.ATTENTIVE_TIMEOUT
    • Si se establece, anula el tiempo de espera de sueño por falta de atención predeterminado establecido por config_attentiveTimeout.
    • Se puede configurar durante el tiempo de ejecución.

Configura la duración antes de que aparezca la advertencia

Para configurar la duración, actualiza el siguiente elemento en frameworks/base/core/res/res/values/config.xml:

  • config_attentiveWarningDuration
    • Tiempo durante el que se muestra un mensaje de advertencia al usuario antes de que se apague la pantalla después de un período prolongado de inactividad del usuario.
    • El valor debe ser muy inferior al tiempo de espera por inactividad establecido, de lo contrario, el diálogo de advertencia se mostrará constantemente y no se podrá descartar.
    • Valor predeterminado: 30000 (30 s).

Mostrar las preferencias de tiempo de espera en TvSettings

Para mostrar las preferencias de tiempo de espera, actualiza el siguiente elemento en packages/apps/TvSettings/Settings/res/values/config.xml:

  • config_show_standby_timeout
    • Indica si se debe mostrar un elemento de preferencia para permitir que se apague la pantalla durante la reproducción de contenido multimedia.
    • Valor predeterminado: false.

Recursos para la IU de advertencia

  • El diseño del diálogo de advertencia se define en frameworks/base/packages/SystemUI/res/layout/inattentive_sleep_warning.xml.
  • Las siguientes cadenas del diálogo se definen en frameworks/base/packages/SystemUI/res/values/strings.xml y frameworks/base/packages/SystemUI/res-product/values/strings.xml.
    • inattentive_sleep_warning_title
    • inattentive_sleep_warning_message

Las configuraciones y los recursos del tiempo de compilación se pueden cambiar con superposiciones de recursos.

Implementación

Habilita la función con el siguiente comando.

  1. Anula el config_attentiveTimeout predeterminado.
  2. Si usas el comando TvSettings del AOSP, haz lo siguiente:
    • Inhabilita la función en la configuración anulando config_show_standby_timeout.
    • Implementa tu propia configuración que establezca Settings.Secure.ATTENTIVE_TIMEOUT.

Validación

Las pruebas del CTS para la función se encuentran en cts/hostsidetests/os/src/android/os/cts/InattentiveSleepTests.java.

Ejemplos y fuente

  • frameworks/base/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java contiene la implementación predeterminada de la IU de advertencia.
  • packages/apps/TvSettings proporciona un ejemplo de cómo exponer la función en la configuración.

Ejemplo de caso de prueba manual

  1. Asegúrate de que el parámetro de configuración para desarrolladores stay_on_while_plugged_in esté desactivado si el HAL de estado del dispositivo informa que este tiene una batería (battery_present es true), ya que esto podría impedir que la función apague la pantalla.
    adb shell settings put global stay_on_while_plugged_in 0

  2. Establece un tiempo de espera por sueño inatento que sea unos segundos más largo que la duración del diálogo de advertencia.
    adb shell settings put secure attentive_timeout 32000
  3. Comienza a reproducir un video (para adquirir un bloqueo de activación de pantalla).
  4. Verifica que el diálogo de advertencia de sueño aparezca después de unos segundos.
  5. Verifica que la pantalla se apague después de que venza el tiempo de espera establecido.