Mengimplementasikan cahaya malam

Riset menunjukkan bahwa cahaya biru dari layar dapat berdampak negatif pada tidur. Android 7.1.1 memperkenalkan fitur bernama Cahaya Malam yang mengurangi jumlah cahaya biru yang dipancarkan oleh layar perangkat agar lebih cocok dengan cahaya alam pada waktu dan lokasi pengguna. Android 8.0 memperkenalkan fitur tambahan yang memberi pengguna kontrol lebih besar atas intensitas efek Lampu Malam. Android 10 memperkenalkan layanan sistem COLOR_DISPLAY_SERVICE, dengan platform API sistem untuk memberi sistem, Setelan, dan UI Sistem lebih banyak kontrol atas semua transformasi warna, termasuk Lampu Malam.

Lampu Malam memerlukan penerapan Hardware Composer HAL 2.0 (HWC 2) yang dapat menerapkan matriks yang diteruskan ke setColorTransform untuk melakukan tinting tanpa memengaruhi daya, performa, dan kompatibilitas aplikasi.

Implementasi

Produsen perangkat dapat mengaktifkan penerapan default fitur dengan menggunakan flag berikut yang ditentukan di 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>

Kode dibagi antara framework, layanan sistem, UI Sistem, dan Setelan. Fungsi inti dikontrol oleh ColorDisplayManager (didukung oleh ColorDisplayService).

Produsen perangkat harus menyesuaikan gradien warna berdasarkan karakteristik panel layar perangkat, termasuk titik putih, gamut, dan warna yang diinginkan. Anda dapat mengubah ramp warna tanpa mengubah implementasi dasar menggunakan overlay konfigurasi. Konfigurasi ini dinyatakan sebagai persamaan kuadrat untuk setiap warna merah, hijau, dan biru, dalam bentuk vres = vat2 + vbt + vy-int dengan t adalah input suhu dalam Kelvin, seperti yang ditentukan dalam rentang antara config_nightDisplayColorTemperatureMin dan config_nightDisplayColorTemperatureMax (seperti yang dijelaskan di bagian sebelumnya), dan va, vb, dan vy-int masing-masing adalah koefisien a, koefisien b, dan intersep y, untuk kurva primer yang diberikan, seperti yang ditunjukkan di bawah.

    <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>

Fitur UI

Karena Lampu Malam adalah fitur yang terlihat oleh pengguna, pengguna harus dapat mengendalikannya. Ada implementasi setelan lengkap dalam project packages/apps/Settings Android Open Source Project (AOSP) yang dapat dirujuk oleh produsen perangkat untuk implementasi Setelan mereka. Implementer harus menangani intent Settings.ACTION_NIGHT_DISPLAY_SETTINGS untuk mengekspos setelan ini.

Setelan

Setelan untuk Cahaya Malam ada di Setelan > Tampilan > Cahaya Malam. Dari sana, pengguna dapat mempelajari Lampu Malam, menyetel jadwalnya, dan mengaktifkan atau menonaktifkannya.

  • Aktifkan Otomatis
    • Tidak pernah: Cahaya Malam tidak akan pernah aktif secara otomatis dan harus diaktifkan dengan tombol Aktif / Nonaktif manual.
    • Jadwal kustom: Mode Cahaya Malam akan aktif pada Waktu mulai yang ditentukan [default: 22.30] dan nonaktif pada Waktu berakhir yang ditentukan [default: 06.30].
    • Matahari terbenam hingga matahari terbit: Cahaya Malam akan aktif saat matahari terbenam dan nonaktif saat matahari terbit. Waktu matahari terbit dan terbenam bergantung pada lokasi perangkat dan waktu dalam setahun.
  • Aktif / Nonaktif: Tombol yang mengontrol status Cahaya Malam saat ini. Status ini mematuhi aturan otomatis yang ada. Misalnya, jika Cahaya Malam diaktifkan pada pukul 17.30 (sebelum aturan otomatis mengaktifkannya pada pukul 22.30), Mode Cahaya Malam akan tetap dinonaktifkan pada pukul 06.30. Dan jika Mode Cahaya Malam dinonaktifkan pada pukul 05.30 (sebelum dinonaktifkan pada pukul 06.30), mode tersebut akan tetap diaktifkan pada pukul 22.30.
  • Intensitas: Seekbar yang mengontrol tingkat tint dengan menggeser dari hangat ke dingin. Panel geser dapat dinonaktifkan jika Cahaya Malam tidak diaktifkan.
  • Teks informatif: Mengajari pengguna fungsi Lampu Malam dan alasannya.

Setelan kondisional

Terlihat di bagian atas Setelan saat Mode Cahaya Malam aktif.

Kartu Setelan Cepat

Kartu Setelan Cepat berperilaku sama dengan tombol Aktif / Nonaktif di Setelan > Tampilan > Lampu Malam.