Исследования показывают, что синий свет от экранов может негативно влиять на сон. В Android 7.1.1 появилась функция "Ночной режим", которая уменьшает количество синего света, излучаемого экраном устройства, чтобы лучше соответствовать естественному освещению в зависимости от времени суток и местоположения пользователя. В Android 8.0 появилась дополнительная функция, позволяющая пользователям регулировать интенсивность эффекта ночного режима.
В Android 10 появился системный сервис COLOR_DISPLAY_SERVICE с системным API, который позволяет системе, настройкам и системному интерфейсу управлять всеми преобразованиями цвета, в том числе ночным режимом.
Для работы ночного режима требуется реализация Hardware Composer HAL 2.0 (HWC 2), которая может применять матрицу, переданную в setColorTransform, для тонирования без ущерба для энергопотребления, производительности и совместимости с приложениями.
Реализация
Производители устройств могут включить реализацию функции по умолчанию, используя следующие флаги, определенные в frameworks/base/core/res/res/values/config.xml:
<!-- Control whether Night display is available. This should only be enabled
on devices with HWC 2 color transform support. -->
<bool name="config_nightDisplayAvailable">false</bool>
<!-- Default mode to control how Night display is automatically activated.
One of the following values (see NightDisplayController.java):
0 - AUTO_MODE_DISABLED
1 - AUTO_MODE_CUSTOM
2 - AUTO_MODE_TWILIGHT
-->
<integer name="config_defaultNightDisplayAutoMode">0</integer>
<!-- Default time when Night display is automatically activated.
Represented as milliseconds from midnight (e.g. 79200000 == 10pm). -->
<integer name="config_defaultNightDisplayCustomStartTime">79200000</integer>
<!-- Default time when Night display is automatically deactivated.
Represented as milliseconds from midnight (e.g. 21600000 == 6am). -->
<integer name="config_defaultNightDisplayCustomEndTime">21600000</integer>
<!-- Minimum color temperature, in Kelvin, supported by Night display. -->
<integer name="config_nightDisplayColorTemperatureMin">2596</integer>
<!-- Default color temperature, in Kelvin, to tint the screen when Night display is
activated. -->
<integer name="config_nightDisplayColorTemperatureDefault">2850</integer>
<!-- Maximum color temperature, in Kelvin, supported by Night display. -->
<integer name="config_nightDisplayColorTemperatureMax">4082</integer>
Код разделен на фреймворк, системные сервисы, интерфейс системы и настройки. Основными функциями управляет ColorDisplayManager (на основе ColorDisplayService).
Производители устройств должны настраивать цветовую шкалу с учетом характеристик дисплея, в том числе точки белого, цветового охвата и желаемого цвета. Вы можете изменить цветовую шкалу, не меняя базовую реализацию, с помощью оверлея конфигурации.
Эта конфигурация выражается в виде квадратного уравнения для каждого из красного, зеленого и синего цветов в форме vres = vat2 + vbt + vy-int, где t – входная температура в Кельвинах, указанная в диапазоне между config_nightDisplayColorTemperatureMin и config_nightDisplayColorTemperatureMax (как описано в предыдущем разделе), а va, vb и vy-int – это коэффициент a, коэффициент b и точка пересечения с осью Y соответственно для кривой заданного основного цвета, как указано ниже.
<string-array name="config_nightDisplayColorTemperatureCoefficientsNative">
<!-- R a-coefficient --> <item>0.0</item>
<!-- R b-coefficient --> <item>0.0</item>
<!-- R y-intercept --> <item>1.0</item>
<!-- G a-coefficient --> <item>-0.00000000962353339</item>
<!-- G b-coefficient --> <item>0.000153045476</item>
<!-- G y-intercept --> <item>0.390782778</item>
<!-- B a-coefficient --> <item>-0.0000000189359041</item>
<!-- B b-coefficient --> <item>0.000302412211</item>
<!-- B y-intercept --> <item>-0.198650895</item>
</string-array>
<string-array name="config_nightDisplayColorTemperatureCoefficients">
<!-- R a-coefficient --> <item>0.0</item>
<!-- R b-coefficient --> <item>0.0</item>
<!-- R y-intercept --> <item>1.0</item>
<!-- G a-coefficient --> <item>-0.00000000962353339</item>
<!-- G b-coefficient --> <item>0.000153045476</item>
<!-- G y-intercept --> <item>0.390782778</item>
<!-- B a-coefficient --> <item>-0.0000000189359041</item>
<!-- B b-coefficient --> <item>0.000302412211</item>
<!-- B y-intercept --> <item>-0.198650895</item>
</string-array>
Функции пользовательского интерфейса
Поскольку ночной режим – это функция для пользователей, они должны иметь возможность управлять ею. Полная реализация настроек доступна в проекте Android Open Source Project (AOSP) packages/apps/Settings, который производители устройств могут использовать в качестве справочного материала при реализации настроек. Разработчики должны реализовать намерение Settings.ACTION_NIGHT_DISPLAY_SETTINGS, чтобы сделать эту настройку доступной.
Настройки
Настройки ночной подсветки находятся в разделе Настройки > Экран > Ночная подсветка. Здесь можно узнать больше о ночной подсветке, настроить ее расписание и включить или отключить ее.
- Включать автоматически
- Никогда. Ночная подсветка не будет включаться автоматически. Ее можно будет активировать только вручную с помощью переключателя Вкл./Выкл.
- Собственное расписание. Ночная подсветка включается в время начала (по умолчанию 22:30) и выключается в время окончания (по умолчанию 6:30).
- От заката до рассвета. Ночная подсветка включается на закате и выключается на рассвете. Время восхода и захода солнца зависит от местоположения устройства и времени года.
- Включить / выключить. Переключатель, который управляет текущим состоянием ночной подсветки. При этом учитываются существующие автоматические правила. Например, если ночная подсветка включена в 17:30 (до того, как автоматизированное правило включило бы ее в 22:30), Ночная подсветка по-прежнему будет отключаться в 6:30 утра. Если вы отключите ее в 5:30 утра (до того, как она отключится в 6:30 утра), она все равно включится в 22:30.
- Интенсивность. Ползунок, с помощью которого можно регулировать уровень оттенка, переходя от теплого к холодному. Если ночная подсветка не включена, ползунок перемотки можно отключить.
- Информационный текст. Объясняет, что такое ночной режим и зачем он нужен.
Условные настройки
Отображается вверху страницы "Настройки", когда включена ночная подсветка.
Параметр быстрых настроек
Параметр в быстрых настройках работает так же, как переключатель Вкл./Выкл. в разделе Настройки > Экран > Ночной режим.