Veille TV

Dans Android 11, le mode Veille inattentive est une fonctionnalité d'économie d'énergie qui permet de définir un délai d'inactivité de l'utilisateur au-delà duquel l'écran s'éteint, même si des fenêtres avec FLAG_KEEP_SCREEN_ON sont visibles ou si des wakelocks de niveau FULL_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK ou SCREEN_DIM_WAKE_LOCK sont maintenus. Les wakelocks de niveau PARTIAL_WAKE_LOCK ne sont pas concernés par cette fonctionnalité. Peu de temps avant l'expiration du délai, un message peut s'afficher pour avertir l'utilisateur que l'appareil passera en mode veille s'il n'interagit pas avec lui.

Dans ce contexte, l'activité utilisateur fait référence à tout ce qui déclenche un appel à PowerManager#userActivity (sans l'indicateur USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS), y compris, mais sans s'y limiter :

  • Interagir avec l'écran tactile
  • Appuyer sur un bouton physique
  • Événements d'entrée provenant d'un accessoire externe (par exemple, clavier connecté, télécommande Bluetooth, télécommande infrarouge)
  • Interaction vocale
  • Réception de certains messages HDMI-CEC, comme la lecture en un geste
  • Démarrer une session Cast

Personnalisation

Si la fonctionnalité est activée, l'appareil affiche un avertissement à l'écran après une période d'inactivité de l'utilisateur spécifiée. Si aucune action n'est effectuée, l'écran s'éteint. Vous pouvez personnaliser la fonctionnalité à l'aide de ces options de configuration.

Configurer le délai avant expiration

Pour configurer le délai avant expiration, mettez à jour l'élément suivant dans frameworks/base/core/res/res/values/config.xml :

  • config_attentiveTimeout
    • Spécifie le délai d'inactivité de l'utilisateur, en millisecondes, au terme duquel l'écran s'éteint (même si des verrous de réveil de l'écran sont en place).
    • Définie au moment de la compilation.
    • Si la valeur est comprise entre 0 et config_minimumScreenOffTimeout, le délai d'inactivité est défini sur config_minimumScreenOffTimeout pour empêcher l'écran de l'appareil de s'éteindre peu de temps après la sortie de veille.
    • La valeur par défaut est -1, ce qui désactive cette fonctionnalité.

Ignorer le délai avant expiration par défaut

Pour remplacer le paramètre de délai avant expiration par défaut, mettez à jour l'élément suivant.

  • Settings.Secure.ATTENTIVE_TIMEOUT
    • Si cette valeur est définie, elle remplace le délai avant expiration du mode Sommeil inattentif par défaut défini par config_attentiveTimeout.
    • Peut être défini au moment de l'exécution.

Configurer la durée avant l'affichage de l'avertissement

Pour configurer la durée, mettez à jour l'élément suivant dans frameworks/base/core/res/res/values/config.xml :

  • config_attentiveWarningDuration
    • Durée d'affichage d'un message d'avertissement à l'utilisateur avant que l'écran ne s'éteigne après une inactivité prolongée.
    • La valeur doit être bien inférieure au délai d'inactivité défini pour le mode Sommeil, sinon la boîte de dialogue d'avertissement s'affiche en permanence et ne peut pas être fermée.
    • Valeur par défaut : 30000 (30 s).

Afficher les préférences de délai d'inactivité dans TvSettings

Pour afficher les préférences de délai avant expiration, mettez à jour l'élément suivant dans packages/apps/TvSettings/Settings/res/values/config.xml :

  • config_show_standby_timeout
    • Indique s'il faut afficher un élément de préférence pour autoriser l'extinction de l'écran pendant la lecture de contenus multimédias.
    • Par défaut : false.

Ressources pour l'interface utilisateur d'avertissement

  • La mise en page de la boîte de dialogue d'avertissement est définie dans frameworks/base/packages/SystemUI/res/layout/inattentive_sleep_warning.xml.
  • Les chaînes suivantes pour la boîte de dialogue sont définies dans frameworks/base/packages/SystemUI/res/values/strings.xml et frameworks/base/packages/SystemUI/res-product/values/strings.xml.
    • inattentive_sleep_warning_title
    • inattentive_sleep_warning_message

Les configurations et les ressources du temps de compilation peuvent être modifiées par des superpositions de ressources.

Implémentation

Activez la fonctionnalité à l'aide des éléments suivants.

  1. Remplacez la valeur config_attentiveTimeout par défaut.
  2. Si vous utilisez l'TvSettings AOSP :
    • Désactivez la fonctionnalité dans les paramètres en remplaçant config_show_standby_timeout.
    • Implémentez vos propres paramètres qui définissent Settings.Secure.ATTENTIVE_TIMEOUT.

Validation

Les tests CTS pour la fonctionnalité se trouvent sous cts/hostsidetests/os/src/android/os/cts/InattentiveSleepTests.java.

Exemples et source

  • frameworks/base/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java contient l'implémentation de l'UI d'avertissement par défaut.
  • packages/apps/TvSettings fournit un exemple de la façon d'exposer la fonctionnalité dans les paramètres.

Exemple de scénario de test manuel

  1. Assurez-vous que le paramètre développeur stay_on_while_plugged_in est désactivé si le HAL de l'état de l'appareil indique que l'appareil est équipé d'une batterie (battery_present est true), car cela pourrait empêcher la fonctionnalité d'éteindre l'écran.
    adb shell settings put global stay_on_while_plugged_in 0

  2. Définissez un délai avant expiration pour le sommeil inattentif de quelques secondes de plus que la durée de la boîte de dialogue d'avertissement.
    adb shell settings put secure attentive_timeout 32000
  3. Lancez la lecture d'une vidéo (pour acquérir un wakelock d'écran).
  4. Vérifiez que la boîte de dialogue d'avertissement de veille s'affiche après quelques secondes.
  5. Vérifiez que l'écran s'éteint une fois le délai défini écoulé.