Implementa la luz nocturna

Las investigaciones sugieren que la luz azul de las pantallas puede tener un impacto negativo en el sueño. Android 7.1.1 presentó una función llamada Luz nocturna que reduce la cantidad de luz azul que emite la pantalla del dispositivo para que coincida mejor con la luz natural de la hora del día y la ubicación del usuario. Android 8.0 introdujo una función adicional que les brinda a los usuarios más control sobre la intensidad del efecto de Luz nocturna. Android 10 presenta el servicio del sistema COLOR_DISPLAY_SERVICE, con una superficie de API del sistema para brindarle al sistema, a la configuración y a la IU del sistema más control sobre todas las transformaciones de color, incluida la Luz nocturna.

La Luz nocturna requiere una implementación de Hardware Composer HAL 2.0 (HWC 2) que pueda aplicar la matriz pasada a setColorTransform para realizar el tono sin afectar la energía, el rendimiento ni la compatibilidad de la app.

Implementación

Los fabricantes de dispositivos pueden habilitar la implementación predeterminada de la función con las siguientes marcas definidas en 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>

El código se divide entre el framework, los servicios del sistema, la IU del sistema y la configuración. ColorDisplayManager controla la funcionalidad principal (respaldada por ColorDisplayService).

Los fabricantes de dispositivos deben personalizar la rampa de colores según las características del panel de la pantalla del dispositivo, incluido el punto blanco, la gama y el color deseado. Puedes cambiar la rampa de colores sin cambiar la implementación base con una superposición de configuración. Esta configuración se expresa como una ecuación cuadrática para cada uno de los colores rojo, verde y azul, en la forma vres = vat2 + vbt + vy-int, donde t es la entrada de temperatura en Kelvin, como se especifica en el rango entre config_nightDisplayColorTemperatureMin y config_nightDisplayColorTemperatureMax (como se describe en la sección anterior), y va, vb y vy-int son el coeficiente a, el coeficiente b y el eje y de corte, respectivamente, para la curva primaria dada, como se indica a continuación.

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

Funciones de la IU

Debido a que la Luz nocturna es una función para el usuario, los usuarios deben poder controlarla. Hay una implementación completa de la configuración en el proyecto de código abierto de Android (AOSP) packages/apps/Settings al que los fabricantes de dispositivos pueden consultar para su implementación de Configuración. Los implementadores deben controlar el intent Settings.ACTION_NIGHT_DISPLAY_SETTINGS para exponer este parámetro de configuración.

Configuración

La configuración de la Luz nocturna se encuentra en Configuración > Pantalla > Luz nocturna. Desde allí, los usuarios pueden obtener información sobre la Luz nocturna, configurar su programación y activarla o desactivarla.

  • Activar automáticamente
    • Nunca: La luz nocturna nunca se activará automáticamente y se debe activar con el botón de activación manual On / Off.
    • Programación personalizada: La Luz nocturna se enciende a una hora de inicio especificada [predeterminada: 10:30 p.m.] y se apaga a una hora de finalización especificada [predeterminada: 6:30 a.m.].
    • Del atardecer al amanecer: La Luz nocturna se activa al atardecer y se apaga al amanecer. La hora del amanecer y el atardecer depende de la ubicación del dispositivo y de la época del año.
  • Activado / desactivado: Activa o desactiva la Luz nocturna. Este estado respeta las reglas automáticas existentes. Por ejemplo, si la Luz nocturna se activa a las 5:30 p.m. (antes de que la regla automática la active a las 10:30 p.m.), La Luz nocturna se apagará a las 6:30 a.m. Y si se desactiva a las 5:30 a.m. (antes de que se apague a las 6:30 a.m.), se encenderá a las 10:30 p.m.
  • Intensidad: Barra de desplazamiento que controla el nivel de tono deslizando de cálido a frío. La barra de desplazamiento se puede inhabilitar cuando la Luz nocturna no está activada.
  • Texto informativo: Le enseña al usuario qué hace la Luz nocturna y por qué.

Configuración condicional

Se muestra en la parte superior de Configuración cuando la Luz nocturna está activada.

Tarjeta de Configuración rápida

La tarjeta de Configuración rápida se comporta de manera idéntica al botón de activación On / Off en Configuración > Pantalla > Luz nocturna.