实现夜间模式

研究表明,屏幕的蓝光会对睡眠质量造成不良影响。Android 7.1.1 具备一种称为“夜间模式”的功能,可减少设备显示屏发出的蓝光量,以便达到更接近用户当前时间和地点的自然光效果。Android 8.0 提供一项功能,可让用户更好地控制夜间模式效果的强度。

夜间模式需要使用 Hardware Composer HAL 2.0 (HWC 2) 来实现,它可应用传递到 setColorTransform 的矩阵以执行着色,而不会影响耗电量、性能和应用兼容性。

实现

设备制造商可以使用以下路径中定义的下列标记启用该功能的默认实现: /android/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>

这段代码包含用于框架、系统服务、SystemUI 和设置的代码:

platform/frameworks/base/core
├ java/android/provider/Settings.java
├ java/com/android/internal/app/NightDisplayController.java
└ res/res/values/config.xml

platform/frameworks/base/proto/src/metrics_constants.proto

platform/frameworks/base/services
├ core/java/com/android/server/display/DisplayManagerService.java
├ core/java/com/android/server/display/DisplayTransformManager.java
├ core/java/com/android/server/display/NightDisplayService.java
└ java/com/android/server/SystemServer.java

platform/frameworks/base/packages/SystemUI
├ res/drawable/ic_qs_night_display_off.xml
├ res/drawable/ic_qs_night_display_on.xml
├ res/values/strings.xml
└ src/com/android/systemui/qs/tiles/NightDisplayTile.java

platform/packages/apps/Settings
├ AndroidManifest.xml
├ res/drawable/ic_settings_night_display.xml
├ res/values/strings.xml
├ res/xml/display_settings.xml
├ res/xml/night_display_settings.xml
├ src/com/android/settings/Settings.java
├ src/com/android/settings/dashboard/conditional/NightDisplayCondition.java
├ src/com/android/settings/display/NightDisplayPreference.java
├ src/com/android/settings/display/NightDisplayPreferenceController.java
└ src/com/android/settings/display/NightDisplaySettings.java

界面功能

由于夜间模式是面向用户的功能,因此用户需要能够掌控这项功能。Android 开放源代码项目 (AOSP) packages/apps/Settings 项目中提供了全面的设置实现方法,以供设备制造商在实现其设置时参考。实现人员必须处理 Settings.ACTION_NIGHT_DISPLAY_SETTINGS 才能显示此设置。

设置

用户可以在“设置”>“显示”>“夜间模式”中设置夜间模式。在设置页面中,用户可以了解夜间模式,设置其时间安排以及开启或关闭夜间模式。

  • 自动开启
    • 永不:夜间模式一律不自动开启,且必须通过手动切换开启/关闭开关来启用。
    • 自定义时间安排:夜间模式在指定的开始时间(默认为晚上 10:30)开启,并在指定的结束时间(默认为早上 6:30)关闭。
    • 日落到日出:在日落时开启夜间模式,在日出时关闭夜间模式。日出和日落的时间取决于设备所处的位置和当地的时节。
  • 开启/关闭:用于控制夜间模式当前状态的切换开关。此状态遵循现有的自动规则。例如,如果用户在下午 5:30 开启夜间模式(早于自动规则的开启时间,即晚上 10:30),则系统依然会在早上 6:30 关闭夜间模式。如果用户在早上 5:30 关闭夜间模式(早于自动规则的关闭时间,即早上 6:30),则系统依然会在晚上 10:30 开启夜间模式。
  • 强度:通过从暖色调滑动到冷色调来控制着色程度的拖动条。在未启用夜间模式时,可以停用拖动条。
  • 信息性文本:向用户介绍夜间模式的功能和原理。

设置条件语句

当夜间模式处于开启状态时,用户可以在“设置”顶部看到。

“快捷设置”图块

您可以通过“快捷设置”图块执行相应操作,也可以通过“设置”>“显示”>“夜间模式”中的开启/关闭切换开关执行相应操作,两者效果是一样的。