Implémenter l'éclairage nocturne

Des études suggèrent que la lumière bleue des écrans peut avoir un impact négatif sur le sommeil. Android 7.1.1 a introduit une fonctionnalité appelée "Éclairage nocturne" qui réduit la quantité de lumière bleue émise par l'écran de l'appareil pour mieux correspondre à la lumière naturelle de l'heure et de l'emplacement de l'utilisateur. Android 8.0 a introduit une fonctionnalité supplémentaire qui permet aux utilisateurs de mieux contrôler l'intensité de l'effet de la lampe de nuit. Android 10 introduit le service système COLOR_DISPLAY_SERVICE, avec une surface d'API système pour donner au système, aux paramètres et à l'UI système plus de contrôle sur toutes les transformations de couleur, y compris la lumière de nuit.

La lumière de nuit nécessite une implémentation de Hardware Composer HAL 2.0 (HWC 2) pouvant appliquer la matrice transmise à setColorTransform pour effectuer la teinte sans affecter la consommation d'énergie, les performances et la compatibilité des applications.

Implémentation

Les fabricants d'appareils peuvent activer l'implémentation par défaut de la fonctionnalité à l'aide des indicateurs suivants définis dans 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>

Le code est réparti entre le framework, les services système, l'UI système et les paramètres. La fonctionnalité de base est contrôlée par ColorDisplayManager (basée sur ColorDisplayService).

Les fabricants d'appareils doivent personnaliser la rampe de couleurs en fonction des caractéristiques du panneau d'affichage de l'appareil, y compris du point blanc, de la gamme et de la couleur souhaitée. Vous pouvez modifier la rampe de couleurs sans modifier l'implémentation de base à l'aide d'une superposition de configuration. Cette configuration est exprimée sous la forme d'une équation quadratique pour le rouge, le vert et le bleu, sous la forme vres = vat2 + vbt + vy-int, où t est la température d'entrée en kelvin, comme spécifié dans la plage comprise entre config_nightDisplayColorTemperatureMin et config_nightDisplayColorTemperatureMax (comme décrit dans la section précédente), et va, vb et vy-int sont respectivement le coefficient a, le coefficient b et l'ordonnée à l'origine de la courbe primaire donnée, comme indiqué ci-dessous.

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

Fonctionnalités de l'UI

Étant donné que la fonctionnalité Night Light est destinée aux utilisateurs, ils doivent pouvoir la contrôler. Les paramètres sont implémentés de manière complète dans le projet packages/apps/Settings du projet Android Open Source Project (AOSP) que les fabricants d'appareils peuvent consulter pour implémenter leurs paramètres. Les implémentateurs doivent gérer l'intent Settings.ACTION_NIGHT_DISPLAY_SETTINGS pour exposer ce paramètre.

Paramètres

Les paramètres de l'Éclairage nocturne se trouvent dans Paramètres > Affichage > Éclairage nocturne. Les utilisateurs peuvent alors en savoir plus sur la lumière de nuit, définir son calendrier et l'activer ou la désactiver.

  • Activer automatiquement
    • Jamais:la veilleuse ne s'active jamais automatiquement et doit être activée manuellement à l'aide du bouton Marche / Arrêt.
    • Programmation personnalisée : l'éclairage nocturne s'active à une heure de début spécifiée [par défaut : 22h30] et se désactive à une heure de fin spécifiée [par défaut : 6h30].
    • Du coucher au lever du soleil:l'éclairage nocturne s'allume au coucher du soleil et s'éteint au lever du soleil. L'heure du lever et du coucher du soleil dépend de l'emplacement de l'appareil et de la période de l'année.
  • Activé/Désactivé:bouton d'activation/de désactivation de l'éclairage nocturne. Cet état respecte les règles automatiques existantes. Par exemple, si l'Éclairage nocturne est activé à 17h30 (avant que la règle automatique ne l'active à 22h30), L'éclairage nocturne s'éteindra toujours à 6h30. Si vous le désactivez à 5h30 (avant qu'il ne s'éteigne à 6h30), il s'allumera toujours à 22h30.
  • Intensité:curseur qui contrôle le niveau de teinte en faisant glisser le curseur de chaud à froid. La barre de défilement peut être désactivée lorsque l'éclairage nocturne n'est pas activé.
  • Texte informatif:explique à l'utilisateur ce que fait la fonctionnalité Lampe de nuit et pourquoi.

Paramètres conditionnels

Visible en haut de "Paramètres" lorsque l'éclairage nocturne est activé.

Bloc "Réglages rapides"

Le bloc Réglages rapides se comporte de la même manière que le bouton Activé / Désactivé dans Paramètres > Affichage > Éclairage nocturne.