Standby del televisore

In Android 11, la sospensione disattenta è una funzione 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 vengono mantenuti wakelock di livello FULL_WAKE_LOCK , SCREEN_BRIGHT_WAKE_LOCK o SCREEN_DIM_WAKE_LOCK . I wakelock con 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 andrà in modalità di sospensione se non interagisce con il dispositivo.

In questo contesto, l'attività dell'utente si riferisce a tutto ciò che attiva una chiamata a PowerManager#userActivity (senza il flag USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS ), incluso ma non limitato a:

  • Interazione con il touchscreen
  • Premendo un pulsante fisico
  • Immettere eventi da un accessorio esterno (ad esempio, tastiera collegata, telecomando Bluetooth, telecomando IR)
  • Interazione vocale
  • Ricezione di determinati messaggi HDMI CEC, come One Touch Play
  • Avvio di una nuova sessione di cast

Personalizzazione

Se la funzione è abilitata, il dispositivo mostra un avviso su schermo dopo un tempo specificato di inattività dell'utente. Se non viene eseguita alcuna azione, lo schermo si spegne. È possibile personalizzare la funzionalità utilizzando queste opzioni di configurazione.

Configurazione del timeout

Per configurare il timeout, aggiornare il seguente elemento in frameworks/base/core/res/res/values/config.xml :

  • config_attentiveTimeout
    • Specifica il tempo predefinito in millisecondi di inattività dell'utente dopo il quale lo schermo si spegne (anche se sono attivi i wakelock dello schermo).
    • Impostato al momento della creazione.
    • Se il valore è compreso tra 0 e config_minimumScreenOffTimeout , il timeout è impostato su config_minimumScreenOffTimeout per impedire al dispositivo di spegnere lo schermo subito dopo il riavvio.
    • Predefinito: -1 , che disabilita questa funzione.

Ignorare il timeout predefinito

Per sovrascrivere l'impostazione di timeout predefinita, aggiorna il seguente elemento.

  • Settings.Secure.ATTENTIVE_TIMEOUT
    • Se impostato, sovrascrive il timeout di sospensione disattento predefinito impostato da config_attentiveTimeout .
    • Può essere impostato in fase di esecuzione.

Configurazione della durata prima che venga visualizzato l'avviso

Per configurare la durata, aggiornare il seguente elemento in frameworks/base/core/res/res/values/config.xml :

  • config_attentiveWarningDuration
    • Per quanto tempo mostrare un messaggio di avviso all'utente prima che lo schermo si spenga dopo un'inattività prolungata dell'utente.
    • Il valore dovrebbe essere ben al di sotto del timeout di sospensione disattento impostato, altrimenti la finestra di dialogo di avviso viene visualizzata costantemente e non può essere chiusa.
    • Impostazione predefinita: 30000 (30 secondi).

Visualizzazione delle preferenze di timeout in TvSettings

Per mostrare le preferenze di timeout, aggiornare il seguente elemento in packages/apps/TvSettings/Settings/res/values/config.xml :

  • config_show_standby_timeout
    • Se mostrare un elemento di preferenza per consentire lo spegnimento dello schermo durante la riproduzione multimediale.
    • Predefinito: false .

Risorse per l'interfaccia utente degli avvisi

  • 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 e frameworks/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 tramite sovrapposizioni di risorse.

Implementazione

Abilita la funzione utilizzando quanto segue.

  1. Sostituisci il valore predefinito config_attentiveTimeout .
  2. Se si utilizzano le TvSettings AOSP:
    • Disabilita la funzionalità nelle impostazioni sovrascrivendo config_show_standby_timeout .
    • Implementa le tue impostazioni che impostano Settings.Secure.ATTENTIVE_TIMEOUT .

Validazione

I test CTS per la funzionalità si trovano su cts/hostsidetests/os/src/android/os/cts/InattentiveSleepTests.java .

Esempi e fonte

  • 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 caso di test manuale

  1. Assicurati che l'impostazione per sviluppatori stay_on_while_plugged_in sia disattivata se l'HAL di integrità del dispositivo segnala che il dispositivo ha una batteria ( battery_present è true ) poiché ciò potrebbe impedire alla funzionalità di spegnere lo schermo.
    adb shell settings put global stay_on_while_plugged_in 0

  2. Imposta un timeout di sospensione per disattenzione in modo che sia qualche secondo in più rispetto alla durata della finestra di dialogo di avviso.
    adb shell settings put secure attentive_timeout 32000
  3. Avviare la riproduzione di un video (per acquisire un wakelock dello schermo).
  4. Verificare che la finestra di dialogo di avviso di sospensione venga visualizzata dopo alcuni secondi.
  5. Verificare che lo schermo si spenga allo scadere del timeout impostato.