ТВ в режиме ожидания

В 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. Убедитесь, что экран выключается по истечении установленного времени ожидания.