夜間モードを実装する

スクリーンからのブルーライトが睡眠に悪影響を与えることが調査により判明しています。Android 7.1.1 には、夜間モードと呼ばれる機能が搭載されており、ユーザーの時間帯や現在地の自然光に合わせて、デバイスのディスプレイのブルーライトの量を減らすことができます。Android 8.0 には、ユーザーが夜間モードの効果をより細かく制御できる機能もあります。Android 10 では、COLOR_DISPLAY_SERVICE システム サービスが導入されており、システム API サーフェスを使用して、システム、設定、システム UI で夜間モードなどのすべての色変換をより細かく制御できます。

夜間モードには、setColorTransform に渡されるマトリックスを適用して、電源、パフォーマンス、アプリの互換性に影響を与えずに色合いを調整できる Hardware Composer HAL 2.0(HWC 2)の実装が必要です。

実装

デバイスのメーカーは、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>

このコードは、フレームワーク、システム サービス、システム UI、設定の間で分割されます。コア機能は ColorDisplayManagerColorDisplayService に基づく)によって制御されます。

デバイスのメーカーは、ホワイト ポイント、色域、希望の色などのデバイスの表示パネルの特性に基づいて、色傾斜をカスタマイズする必要があります。基本実装を変更することなく色傾斜を変更するには、構成オーバーレイを使用します。この構成は、赤、緑、青それぞれの色について、vres = vat2 + vbt + vy-int の形式の二次方程式で表現されます。ここで t はケルビンでの温度入力値で、config_nightDisplayColorTemperatureMinconfig_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>

UI 機能

夜間モードはユーザー向けの機能であるため、ユーザーが制御できる必要があります。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 分にオンになります。
  • 輝度: シークバーで色合いレベルを暖色や寒色にスライドして調整します。夜間モードが有効になっていない場合は、シークバーを無効にできます。
  • 情報テキスト: 夜間モードの動作とその理由についてユーザーに対して説明します。

条件付きの設定

夜間モードがオンのときに設定の上部に表示されます。

クイック設定タイル

クイック設定タイルは、[設定] > [ディスプレイ] > [夜間モード] にあるオン / オフの切り替えとまったく同じように動作します。