Режим ожидания телевизора

В Android 11 функция "Сон при бездействии" позволяет экономить заряд батареи. Она позволяет задать время ожидания бездействия пользователя, по истечении которого экран отключается, даже если видны окна с флагом FLAG_KEEP_SCREEN_ON или удерживаются блокировки пробуждения уровня FULL_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK или SCREEN_DIM_WAKE_LOCK. Функция не влияет на блокировки уровня PARTIAL_WAKE_LOCK. Незадолго до истечения времени ожидания может появиться сообщение с предупреждением о том, что устройство перейдет в спящий режим, если пользователь не будет с ним взаимодействовать.

В этом контексте под действиями пользователя понимается все, что вызывает вызов PowerManager#userActivity (без флага USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS), включая, помимо прочего:

  • Взаимодействие с сенсорным экраном
  • Нажатие физической кнопки.
  • События ввода с внешнего аксессуара (например, подключенной клавиатуры, пульта Bluetooth или ИК-пульта).
  • Голосовое взаимодействие
  • Получение определенных сообщений HDMI CEC, например One Touch Play.
  • Как начать новый сеанс трансляции

Настройка канала

Если функция включена, на экране устройства появляется предупреждение после указанного времени бездействия пользователя. Если ничего не предпринять, экран выключится. Вы можете настроить эту функцию, используя следующие параметры конфигурации.

Как настроить время ожидания

Чтобы настроить время ожидания, измените следующий элемент в файле frameworks/base/core/res/res/values/config.xml:

  • config_attentiveTimeout
    • Указывает время бездействия пользователя в миллисекундах, по истечении которого экран отключается (даже если включена блокировка спящего режима).
    • Задается во время сборки.
    • Если значение находится в диапазоне от 0 до config_minimumScreenOffTimeout, тайм-аут будет установлен на config_minimumScreenOffTimeout, чтобы экран устройства не отключался вскоре после выхода из спящего режима.
    • Значение по умолчанию: -1 (функция отключена).

Как переопределить время ожидания по умолчанию

Чтобы переопределить время ожидания по умолчанию, измените следующий элемент:

  • Settings.Secure.ATTENTIVE_TIMEOUT
    • Если задано, переопределяет тайм-аут бездействия по умолчанию, заданный параметром config_attentiveTimeout.
    • Можно задать во время выполнения.

Как настроить время до появления предупреждения

Чтобы настроить продолжительность, измените следующий элемент в файле frameworks/base/core/res/res/values/config.xml:

  • config_attentiveWarningDuration
    • Как долго показывать пользователю предупреждение перед отключением экрана после длительного бездействия.
    • Значение должно быть значительно меньше времени ожидания перехода в режим сна при невнимательности, иначе диалоговое окно с предупреждением будет постоянно показываться и его нельзя будет закрыть.
    • Значение по умолчанию: 30000 (30 секунд).

Показывать настройки тайм-аута в TvSettings

Чтобы показать настройки времени ожидания, измените следующий элемент в файле packages/apps/TvSettings/Settings/res/values/config.xml:

  • config_show_standby_timeout
    • Показывать ли элемент настроек, позволяющий отключать экран во время воспроизведения мультимедиа.
    • По умолчанию: false.

Ресурсы для интерфейса предупреждения

  • Макет диалогового окна с предупреждением задан в файле frameworks/base/packages/SystemUI/res/layout/inattentive_sleep_warning.xml.
  • В файлах frameworks/base/packages/SystemUI/res/values/strings.xml и frameworks/base/packages/SystemUI/res-product/values/strings.xml определены следующие строки для диалогового окна:
    • inattentive_sleep_warning_title
    • inattentive_sleep_warning_message

Конфигурации и ресурсы времени сборки можно изменить с помощью наложений ресурсов.

Реализация

Чтобы включить функцию, выполните следующие действия:

  1. Переопределите значение по умолчанию config_attentiveTimeout.
  2. Если вы используете AOSP TvSettings:
    • Отключить функцию в настройках, переопределив config_show_standby_timeout.
    • Задайте собственные настройки, которые устанавливают Settings.Secure.ATTENTIVE_TIMEOUT.

Проверка

Тесты CTS для этой функции находятся в каталоге cts/hostsidetests/os/src/android/os/cts/InattentiveSleepTests.java.

Примеры и источник

  • frameworks/base/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java содержит реализацию пользовательского интерфейса предупреждения по умолчанию.
  • packages/apps/TvSettings – пример того, как добавить функцию в настройки.

Пример отчета о тестировании вручную

  1. Убедитесь, что параметр stay_on_while_plugged_in отключен, если HAL устройства сообщает, что у него есть батарея (battery_present – true), так как это может помешать функции выключить экран.
    adb shell settings put global stay_on_while_plugged_in 0

  2. Установите время ожидания до перехода в спящий режим при отсутствии внимания на несколько секунд больше, чем длительность показа предупреждения.
    adb shell settings put secure attentive_timeout 32000
  3. Начните воспроизведение видео (чтобы получить блокировку пробуждения экрана).
  4. Убедитесь, что через несколько секунд появится диалоговое окно с предупреждением о переходе в спящий режим.
  5. Убедитесь, что экран выключается по истечении заданного времени.