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
econfig_minimumScreenOffTimeout
, o tempo limite está definido comoconfig_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
eframeworks/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.
- Substitua o
config_attentiveTimeout
padrão. - 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
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
- 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
- Comece a reproduzir um vídeo (para adquirir um wakelock de tela).
- Verifique se a caixa de diálogo de aviso de suspensão aparece após alguns segundos.
- Verifique se a tela é desligada após o tempo limite definido.