Modalità standby della TV

In Android 11, la modalità Sospensione distratta è 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 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 avvisa l'utente che il dispositivo entrerà in modalità Sospensione se non interagisce con il dispositivo.

In questo contesto, l'attività dell'utente si riferisce a qualsiasi elemento che attivi una chiamata a PowerManager#userActivity (senza il flag USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS), inclusi, a titolo esemplificativo:

  • Interagire con il touchscreen
  • Premere un pulsante fisico
  • Eventi di input da un accessorio esterno (ad esempio tastiera collegata, telecomando Bluetooth, telecomando IR)
  • Interazione vocale
  • Ricezione di determinati messaggi HDMI CEC, ad esempio One Touch Play
  • Avviare una nuova sessione di trasmissione

Personalizzazione

Se la funzionalità è attivata, il dispositivo mostra un avviso sullo schermo dopo un periodo di inattività dell'utente specificato. Se non viene eseguita alcuna azione, lo schermo si spegne. Puoi personalizzare la funzionalità utilizzando queste opzioni di configurazione.

Configurare 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 blocchi di riattivazione 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 poco dopo la riattivazione.
    • Valore predefinito: -1, che disattiva questa funzionalità.

Eseguire l'override del timeout predefinito

Per eseguire l'override dell'impostazione di timeout predefinita, aggiorna l'elemento seguente.

  • Settings.Secure.ATTENTIVE_TIMEOUT
    • Se impostato, sostituisce il timeout per inattività predefinito impostato da config_attentiveTimeout.
    • Può essere impostato durante il runtime.

Configura la durata prima della visualizzazione dell'avviso

Per configurare la durata, aggiorna 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.
    • Il valore deve essere molto inferiore al timeout di sospensione per disattenzione impostato, altrimenti la finestra di dialogo di avviso viene visualizzata costantemente e non può essere chiusa.
    • Valore predefinito: 30000 (30 secondi).

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 un elemento delle preferenze per consentire lo spegnimento dello schermo durante la riproduzione di contenuti multimediali.
    • 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 del tempo di compilazione possono essere modificate tramite le sovrapposizioni delle risorse.

Implementazione

Attiva la funzionalità utilizzando quanto segue.

  1. Sostituisci il valore predefinito di config_attentiveTimeout.
  2. Se utilizzi TvSettings AOSP:
    • Disattiva la funzionalità nelle impostazioni ignorando config_show_standby_timeout.
    • Implementa le tue impostazioni che impostano Settings.Secure.ATTENTIVE_TIMEOUT.

Convalida

I test CTS per la funzionalità si trovano in 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 predefinita dell'interfaccia utente di avviso.
  • packages/apps/TvSettings fornisce un esempio di come esporre la funzionalità nelle impostazioni.

Esempio di scenario di test manuale

  1. Assicurati che l'impostazione sviluppatore stay_on_while_plugged_in sia disattivata se l'HAL di integrità del dispositivo segnala che il dispositivo ha una batteria (battery_present è true), in quanto ciò potrebbe impedire la disattivazione dello schermo.
    adb shell settings put global stay_on_while_plugged_in 0

  2. Imposta un timeout del sonno inattivo di qualche secondo in più rispetto alla 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 wakelock dello schermo).
  4. Verifica che la finestra di dialogo di avviso sul sonno venga visualizzata dopo alcuni secondi.
  5. Verifica che lo schermo si spenga dopo la scadenza del timeout impostato.