Implementar 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 introdujo una función llamada Night Light que reduce la cantidad de luz azul emitida por la pantalla del dispositivo para adaptarse mejor a la luz natural de la hora del día y la ubicación del usuario. Android 8.0 introdujo una función adicional que brinda a los usuarios más control sobre la intensidad del efecto Luz nocturna. Android 10 presenta el servicio del sistema COLOR_DISPLAY_SERVICE , con una superficie API del sistema para brindarle al sistema, la configuración y la interfaz de usuario más control sobre todas las transformaciones de color, incluida la luz nocturna.

Night Light requiere una implementación de Hardware Composer HAL 2.0 (HWC 2) que pueda aplicar la matriz pasada a setColorTransform para realizar el teñido sin afectar la potencia, el rendimiento y la compatibilidad de las aplicaciones.

Implementación

Los fabricantes de dispositivos pueden habilitar la implementación predeterminada de la función utilizando los siguientes indicadores definidos 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 marco, servicios del sistema, interfaz de usuario del sistema y configuración. La funcionalidad principal está controlada por ColorDisplayManager (respaldado por ColorDisplayService ).

Los fabricantes de dispositivos deben personalizar la rampa de color según las características del panel de visualización del dispositivo, incluido el punto blanco, la gama y el color deseado. Puede cambiar la rampa de color sin cambiar la implementación base mediante 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 v res = v a t 2 + v b t + v y-int donde t es la entrada de temperatura en Kelvin, como se especifica en la rango entre config_nightDisplayColorTemperatureMin y config_nightDisplayColorTemperatureMax (como se describe en la sección anterior), y v a , v b y v y-int son el coeficiente a, el coeficiente b y la intersección con el eje y, respectivamente, para la curva primaria dada, como indicada 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 interfaz de usuario

Debido a que Night Light es una función orientada al usuario, los usuarios deben poder controlarla. Existe una implementación completa de la configuración en los paquetes/aplicaciones/proyecto de configuración del Proyecto de código abierto de Android (AOSP) al que los fabricantes de dispositivos pueden hacer referencia para su implementación de configuración. Los implementadores deben manejar la intención Settings.ACTION_NIGHT_DISPLAY_SETTINGS para exponer esta configuración.

Ajustes

La configuración de Luz nocturna se encuentra en Configuración > Pantalla > Luz nocturna . Desde allí, los usuarios pueden obtener información sobre Night Light, establecer su horario y encenderla o apagarla.

  • Activar automáticamente
    • Nunca: La luz nocturna nunca se encenderá automáticamente y debe activarse con el interruptor manual de encendido/apagado .
    • Horario personalizado: la luz nocturna se enciende a una hora de inicio específica [predeterminada: 10:30 p. m.] y se apaga a una hora de finalización específica [predeterminada: 6:30 a. m.].
    • Del atardecer al amanecer: La luz nocturna se enciende al atardecer y se apaga al amanecer. La hora del amanecer y del atardecer depende de la ubicación del dispositivo y de la época del año.
  • Encendido/Apagado: palanca que controla el estado actual de Night Light. Este estado respeta las reglas automáticas existentes. Por ejemplo, si la luz nocturna se enciende a las 5:30 p. m. (antes de que la regla automática la encendiera a las 10:30 p. m.), la luz nocturna aún se apagará a las 6:30 a. m. Y si la luz nocturna se apaga a las 5:30 p. m. :30 am (antes de que se apagara a las 6:30 am), aún se encenderá a las 10:30 pm
  • Intensidad: barra de búsqueda que controla el nivel de tinte deslizándose de cálido a frío. La barra de búsqueda se puede desactivar cuando la luz nocturna no está activada.
  • Texto informativo: Enseña al usuario qué hace Night Light y por qué.

Configuraciones condicionales

Visible en la parte superior de Configuración cuando la Luz nocturna está encendida.

Mosaico de Configuración rápida

El mosaico de Configuración rápida se comporta de manera idéntica al botón Activar/Desactivar en Configuración > Pantalla > Luz nocturna .