In Android 11, la sospensione in caso di disattenzione è una funzionalità di risparmio energetico
che consente di impostare un timeout di inattività dell'utente dopo il quale lo schermo si spegne, anche
se sono visibili finestre con FLAG_KEEP_SCREEN_ON
o sono attivi wakelock di livello
FULL_WAKE_LOCK
,
SCREEN_BRIGHT_WAKE_LOCK
o
SCREEN_DIM_WAKE_LOCK
.
I wakelock di livello PARTIAL_WAKE_LOCK
non sono interessati da questa funzionalità.
Poco prima della scadenza del timeout, può essere visualizzato un messaggio che avvisa l'utente che il dispositivo entrerà in modalità di sospensione se non interagisce con esso.
In questo contesto, per attività utente si intende tutto ciò che attiva una chiamata a
PowerManager#userActivity
(senza il flag
USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS
), inclusi, a titolo esemplificativo:
- Interazione con il touchscreen
- Premendo un pulsante fisico
- Eventi di input da un accessorio esterno (ad esempio tastiera collegata, telecomando Bluetooth, telecomando a infrarossi)
- Interazione vocale
- Ricezione di determinati messaggi HDMI-CEC, ad esempio One Touch Play
- Avvio di una nuova sessione di trasmissione
Personalizzazione
Se la funzionalità è attivata, il dispositivo mostra un avviso sullo schermo dopo un determinato periodo di inattività dell'utente. Se non viene eseguita alcuna azione, lo schermo si spegne. Puoi personalizzare la funzionalità utilizzando queste opzioni di configurazione.
Configura il timeout
Per configurare il timeout, aggiorna il seguente elemento in
frameworks/base/core/res/res/values/config.xml
:
config_attentiveTimeout
- Specifica il tempo predefinito in millisecondi di inattività dell'utente trascorso il quale lo schermo si disattiva (anche se sono attivi wakelock dello schermo).
- Impostato al momento della compilazione.
- Se il valore è compreso tra
0
econfig_minimumScreenOffTimeout
, il timeout viene impostato suconfig_minimumScreenOffTimeout
per impedire al dispositivo di disattivare lo schermo poco dopo il risveglio. - Valore predefinito:
-1
, che disattiva questa funzionalità.
Sostituisci il timeout predefinito
Per eseguire l'override dell'impostazione di timeout predefinita, aggiorna il seguente elemento.
Settings.Secure.ATTENTIVE_TIMEOUT
- Se impostato, sostituisce il valore predefinito del timeout di sospensione per inattività impostato da
config_attentiveTimeout
. - Può essere impostato in fase di runtime.
Configura la durata che deve trascorrere prima che venga visualizzato l'avviso
Per configurare la durata, aggiorna il seguente elemento in
frameworks/base/core/res/res/values/config.xml
:
config_attentiveWarningDuration
- Il tempo per cui mostrare un messaggio di avviso all'utente prima che lo schermo si spenga dopo un periodo di inattività prolungato.
- Il valore deve essere molto inferiore al tempo di spegnimento per inattività impostato, altrimenti la finestra di dialogo di avviso viene visualizzata costantemente e non può essere ignorata.
- Valore predefinito:
30000
(30 s).
Mostrare le preferenze di timeout in TvSettings
Per visualizzare le preferenze di timeout, aggiorna il seguente elemento in
packages/apps/TvSettings/Settings/res/values/config.xml
:
config_show_standby_timeout
- Indica se mostrare un elemento di preferenza per consentire lo spegnimento dello schermo durante la riproduzione di contenuti multimediali.
- Valore predefinito:
false
.
Risorse per l'interfaccia utente dell'avviso
- Il layout della finestra di dialogo di avviso è definito in
frameworks/base/packages/SystemUI/res/layout/inattentive_sleep_warning.xml
. - Le seguenti stringhe per la finestra di dialogo sono definite in
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
Le configurazioni e le risorse in fase di compilazione possono essere modificate dagli overlay delle risorse.
Implementazione
Attiva la funzionalità utilizzando quanto segue.
- Sostituisci il valore predefinito
config_attentiveTimeout
. - Se utilizzi AOSP
TvSettings
: - Disabilita la funzionalità nelle impostazioni
con l'override di
config_show_standby_timeout
. - Implementa le tue impostazioni
che impostano
Settings.Secure.ATTENTIVE_TIMEOUT
.
Convalida
I test CTS per la funzionalità sono disponibili al sito
cts/hostsidetests/os/src/android/os/cts/InattentiveSleepTests.java
.
Esempi e origine
frameworks/base/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java
contiene l'implementazione dell'interfaccia utente di avviso predefinita.packages/apps/TvSettings
fornisce un esempio di come esporre la funzionalità nelle impostazioni.
Esempio di scenario di test manuale
Assicurati che l'impostazione di sviluppatore
stay_on_while_plugged_in
sia disattivata se l'HAL di stato del dispositivo segnala che il dispositivo ha una batteria (battery_present
ètrue
), in quanto ciò potrebbe impedire alla funzionalità di spegnere lo schermo.
adb shell settings put global stay_on_while_plugged_in 0
- Imposta un timeout di sospensione per inattività di qualche secondo più lungo della durata della finestra di dialogo di avviso.
adb shell settings put secure attentive_timeout 32000
- Avvia la riproduzione di un video (per acquisire un blocco schermo).
- Verifica che la finestra di dialogo di avviso di sospensione venga visualizzata dopo alcuni secondi.
- Verifica che lo schermo si spenga al termine del timeout impostato.