Modo de espera da TV

No Android 11, a suspensão por inatividade é um recurso de economia de energia que permite definir um tempo limite de inatividade do usuário após o qual a tela é desligada, mesmo se as janelas com FLAG_KEEP_SCREEN_ON são visíveis ou wake locks de nível FULL_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK ou SCREEN_DIM_WAKE_LOCK são mantidos. Os wakelocks com nível PARTIAL_WAKE_LOCK não são afetados por esse recurso. Pouco antes do tempo limite expirar, uma mensagem pode ser exibida alertando o usuário de que o dispositivo vai entrar em suspensão se ele não interagir com ele.

Nesse contexto, atividade do usuário se refere a qualquer coisa que acione uma chamada para PowerManager#userActivity (sem o USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS) ), incluindo, sem limitação:

  • Como interagir com a tela touch
  • Pressionar um botão físico
  • Eventos de entrada de um acessório externo (por exemplo, teclado conectado, controle remoto Bluetooth, controle remoto por infravermelho)
  • Interação por voz
  • Receber determinadas mensagens HDMI CEC, como o recurso "One Touch Play"
  • Como iniciar uma nova sessão de transmissão

Personalização

Se o recurso estiver ativado, o dispositivo vai mostrar um aviso na tela após um período especificado de inatividade do usuário. Se nenhuma ação for realizada, a tela será desligada. É possível personalizar o recurso usando estas opções de configuração.

Configurar o tempo limite

Para configurar o tempo limite, atualize o seguinte elemento em frameworks/base/core/res/res/values/config.xml:

  • config_attentiveTimeout
    • Especifica o tempo padrão em milissegundos de inatividade do usuário após o qual a tela é desligada, mesmo que wakelocks de tela estejam em vigor.
    • Definidos no tempo de compilação.
    • Se o valor estiver entre 0 e config_minimumScreenOffTimeout, o tempo limite está definido como config_minimumScreenOffTimeout para evitar que o dispositivo desligando a tela logo depois de acordar.
    • Padrão: -1, que desativa esse recurso.

Substituir o tempo limite padrão

Para substituir a configuração padrão de tempo limite, atualize o elemento a seguir.

  • Settings.Secure.ATTENTIVE_TIMEOUT
    • Se definido, substitui o tempo limite de suspensão de falta de atenção padrão definido por config_attentiveTimeout.
    • Pode ser definido durante a execução.

Configurar a duração antes que o aviso apareça

Para configurar a duração, atualize o seguinte elemento em frameworks/base/core/res/res/values/config.xml:

  • config_attentiveWarningDuration
    • Por quanto tempo mostrar uma mensagem de aviso ao usuário antes de a tela ser desligada após inatividade prolongada do usuário.
    • O valor precisa estar bem abaixo do tempo limite de suspensão de desatenção definido. Caso contrário, a caixa de diálogo de aviso será mostrada constantemente e não poderá ser dispensada.
    • Padrão: 30000 (30 s).

Mostrar preferências de tempo limite em TvSettings

Para mostrar as preferências de tempo limite, atualize o seguinte elemento em packages/apps/TvSettings/Settings/res/values/config.xml:

  • config_show_standby_timeout
    • Define se um item de preferência será mostrado para permitir desligar a tela durante a reprodução de mídia.
    • Padrão: false.

Recursos para a interface de aviso

  • O layout da caixa de diálogo de aviso é definido em frameworks/base/packages/SystemUI/res/layout/inattentive_sleep_warning.xml:
  • As strings a seguir para a caixa de diálogo são definidas em frameworks/base/packages/SystemUI/res/values/strings.xml e frameworks/base/packages/SystemUI/res-product/values/strings.xml.
    • inattentive_sleep_warning_title
    • inattentive_sleep_warning_message

As configurações e os recursos do tempo de build podem ser alterados por sobreposições de recursos.

Implementação

Para ativar o recurso, use o código abaixo.

  1. Substitua o config_attentiveTimeout padrão.
  2. Se estiver usando o TvSettings do AOSP:
    • Desative o recurso nas configurações substituindo config_show_standby_timeout.
    • Implementar suas próprias configurações que define Settings.Secure.ATTENTIVE_TIMEOUT.

Validação

Os testes do CTS para o recurso estão em cts/hostsidetests/os/src/android/os/cts/InattentiveSleepTests.java.

Exemplos e origem

  • frameworks/base/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java contém a implementação de interface de aviso padrão.
  • packages/apps/TvSettings mostra um exemplo de como expor o recurso nas configurações.

Exemplo de caso de teste manual

  1. Verifique se a configuração de desenvolvedor stay_on_while_plugged_in está desativada se o HAL de integridade do dispositivo informar que ele tem uma bateria (battery_present é true), já que isso pode impedir que o recurso desligue a tela.
    adb shell settings put global stay_on_while_plugged_in 0

  2. Defina um tempo limite de inatividade por inatividade alguns segundos a mais do que a duração da caixa de diálogo de aviso.
    adb shell settings put secure attentive_timeout 32000
  3. Comece a reproduzir um vídeo (para adquirir um wakelock de tela).
  4. Verifique se a caixa de diálogo de aviso de suspensão aparece após alguns segundos.
  5. Verifique se a tela é desligada após o tempo limite definido.