Standby TV

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 le finestre con FLAG_KEEP_SCREEN_ON sono visibili o se sono attivi 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 ti avvisa all'utente che il dispositivo va in modalità di sospensione se non interagisce con il dispositivo.

In questo contesto, con attività utente si intende tutto ciò che attiva una chiamata a PowerManager#userActivity (senza USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS ), inclusi, a titolo esemplificativo:

  • Interazione con il touchscreen
  • Premere 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 CEC HDMI, ad esempio Riproduzione One Touch
  • Avvio di una nuova sessione di trasmissione

Personalizzazione

Se la funzione è attiva, il dispositivo mostra un avviso sullo schermo dopo un determinato periodo di tempo 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 spegne (anche se sono presenti wakelock dello schermo).
    • Impostato al momento della compilazione.
    • Se il valore è compreso tra 0 e config_minimumScreenOffTimeout, il timeout viene impostato su config_minimumScreenOffTimeout per impedire al dispositivo di spegnere lo schermo poco dopo il risveglio.
    • Valore predefinito: -1, che disattiva questa funzionalità.

Esegui l'override del 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 timeout di sospensione 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 mostrare le preferenze di timeout, aggiorna il seguente elemento in packages/apps/TvSettings/Settings/res/values/config.xml:

  • config_show_standby_timeout
    • Indica se mostrare una preferenza per consentire lo spegnimento dello schermo durante la riproduzione di contenuti multimediali.
    • Valore predefinito: false.

Risorse per l'interfaccia utente di 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 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 creazione possono essere modificate tramite overlay delle risorse.

Implementazione

Attiva la funzionalità utilizzando quanto segue.

  1. Esegui l'override del valore predefinito config_attentiveTimeout.
  2. Se utilizzi l'AOSP TvSettings:
    • Disattiva la funzionalità nelle impostazioni impostando 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 caratteristica in impostazioni.

Esempio di test manuale

  1. Assicurati che stay_on_while_plugged_in l'impostazione sviluppatore è disattivata se l'HAL per l'integrità del dispositivo segnala che il dispositivo ha un batteria (battery_present è true) perché ciò potrebbe impedire funzionalità per disattivare lo schermo.
    adb shell settings put global stay_on_while_plugged_in 0

  2. 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
  3. Avvia la riproduzione di un video (per acquisire un blocco schermo).
  4. Verifica che venga visualizzata la finestra di dialogo di avviso relativo al sonno dopo qualche secondo.
  5. Verifica che lo schermo si spenga alla scadenza del timeout impostato.