Modo de espera da TV

No Android 11, o sono desatento é 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 janelas com FLAG_KEEP_SCREEN_ON estiverem visíveis ou wakelocks de nível FULL_WAKE_LOCK , SCREEN_BRIGHT_WAKE_LOCK ou SCREEN_DIM_WAKE_LOCK forem retidos. Wakelocks com nível PARTIAL_WAKE_LOCK não são afetados por este recurso. Pouco antes de o tempo limite expirar, uma mensagem pode ser exibida avisando o usuário que o dispositivo entrará em suspensão se ele não interagir com o dispositivo.

Neste contexto, a atividade do usuário refere-se a qualquer coisa que acione uma chamada para PowerManager#userActivity (sem o sinalizador USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS ), incluindo, mas não se limitando a:

  • Interagindo com a tela sensível ao toque
  • Pressionando um botão físico
  • Eventos de entrada de um acessório externo (por exemplo, teclado conectado, controle remoto Bluetooth, controle remoto IR)
  • Interação por voz
  • Recebendo determinadas mensagens HDMI CEC, como One Touch Play
  • Iniciando uma nova sessão de elenco

Costumização

Se o recurso estiver habilitado, o dispositivo mostrará um aviso na tela após um tempo especificado de inatividade do usuário. Se nenhuma ação for tomada, a tela será desligada. Você pode 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 se os wakelocks da tela estiverem ativados).
    • Definido no momento da construção.
    • Se o valor estiver entre 0 e config_minimumScreenOffTimeout , o tempo limite será definido como config_minimumScreenOffTimeout para evitar que o dispositivo desligue a tela logo após acordar.
    • Padrão: -1 , que desativa esse recurso.

Substituir o tempo limite padrão

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

  • Settings.Secure.ATTENTIVE_TIMEOUT
    • Se definido, substitui o tempo limite de suspensão desatento padrão definido por config_attentiveTimeout .
    • Pode ser definido em tempo de execução.

Configure 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
    • Quanto tempo deve ser exibida uma mensagem de aviso ao usuário antes que a tela seja desligada após inatividade prolongada do usuário.
    • O valor deve estar bem abaixo do tempo limite de suspensão desatento definido, caso contrário, a caixa de diálogo de aviso é exibida constantemente e não pode ser descartada.
    • Padrão: 30000 (30s).

Mostrar as 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
    • Se deve ser mostrado um item de preferência para permitir o desligamento da tela durante a reprodução de mídia.
    • Padrão: false .

Recursos para a IU de aviso

  • O layout da caixa de diálogo de aviso é definido em frameworks/base/packages/SystemUI/res/layout/inattentive_sleep_warning.xml .
  • As sequências a seguir para o 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 construção podem ser alterados por sobreposições de recursos.

Implementação

Habilite o recurso usando o seguinte.

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

Validação

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

Exemplos e fonte

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

Exemplo de caso de teste manual

  1. Certifique-se de que a configuração do desenvolvedor stay_on_while_plugged_in esteja desativada se o HAL de integridade do dispositivo informar que o dispositivo tem bateria ( battery_present é true ), pois 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 suspensão desatento para alguns segundos a mais 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 desliga após o tempo limite definido expirar.