Implementando a luz noturna

Pesquisas sugerem que a luz azul das telas pode ter um impacto negativo no sono. O Android 7.1.1 introduziu um recurso chamado Night Light que reduz a quantidade de luz azul emitida pela tela do dispositivo para combinar melhor com a luz natural da hora do dia e do local do usuário. O Android 8.0 introduziu um recurso adicional que oferece aos usuários mais controle sobre a intensidade do efeito Night Light. O Android 10 apresenta o serviço do sistema COLOR_DISPLAY_SERVICE , com uma superfície de API do sistema para dar ao sistema, às configurações e à interface do usuário do sistema mais controle sobre todas as transformações de cores, incluindo a luz noturna.

Night Light requer uma implementação do Hardware Composer HAL 2.0 (HWC 2) que pode aplicar a matriz passada para setColorTransform para realizar a coloração sem afetar a potência, o desempenho e a compatibilidade do aplicativo.

Implementação

Os fabricantes de dispositivos podem habilitar a implementação padrão do recurso usando os seguintes sinalizadores definidos em 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>

O código é dividido entre estrutura, serviços do sistema, interface do usuário do sistema e configurações. A funcionalidade principal é controlada pelo ColorDisplayManager (suportado pelo ColorDisplayService ).

Os fabricantes de dispositivos devem personalizar a rampa de cores com base nas características do painel de exibição do dispositivo, incluindo ponto branco, gama e cor desejada. Você pode alterar a rampa de cores sem alterar a implementação base usando uma sobreposição de configuração. Essa configuração é expressa como uma equação quadrática para cada vermelho, verde e azul, na forma v res = v a t 2 + v b t + v y-int onde t é a entrada de temperatura em Kelvin, conforme especificado no intervalo entre config_nightDisplayColorTemperatureMin e config_nightDisplayColorTemperatureMax (conforme descrito na seção anterior), e v a , v b e v y-int são o coeficiente a, o coeficiente b e a interceptação y, respectivamente, para a curva do primário fornecido, como indicado abaixo.

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

Recursos da interface do usuário

Como o Night Light é um recurso voltado para o usuário, os usuários precisam poder controlá-lo. Há uma implementação completa das configurações no projeto de pacotes/aplicativos/ configurações do Android Open Source Project (AOSP) que os fabricantes de dispositivos podem fazer referência para sua implementação de configurações. Os implementadores devem manipular a intenção Settings.ACTION_NIGHT_DISPLAY_SETTINGS para expor essa configuração.

Configurações

As configurações para Luz Noturna estão em Configurações > Tela > Luz Noturna . A partir daí, os usuários podem aprender sobre o Night Light, definir sua programação e ativá-lo ou desativá-lo.

  • Ativar automaticamente
    • Nunca: a luz noturna nunca acenderá automaticamente e deve ser ativada com a alternância manual liga /desliga .
    • Programação personalizada: a luz noturna acende em um horário de início especificado [padrão: 22h30] e desliga em um horário de término especificado [padrão: 6h30].
    • Pôr do sol ao nascer do sol: a luz noturna acende ao pôr do sol e desliga ao nascer do sol. A hora do nascer e do pôr do sol depende da localização do dispositivo e da época do ano.
  • Ligado / Desligado: Alterna que controla o estado atual da Luz Noturna. Este estado respeita as regras automáticas existentes. Por exemplo, se o Night Light for ativado às 17h30 (antes da regra automática ativá-lo às 22h30), o Night Light ainda será desligado às 6h30 e se o Night Light for desativado às 5 :30 am (antes de desligar às 6h30), ele ainda ligará às 22h30
  • Intensidade: Barra de busca que controla o nível de tonalidade deslizando de quente para frio. A barra de busca pode ser desativada quando a Luz Noturna não está ativada.
  • Texto informativo: Ensina ao usuário o que o Night Light faz e por quê.

Configurações condicionais

Visível na parte superior das configurações quando a luz noturna está ligada.

Bloco de configurações rápidas

O bloco Configurações rápidas se comporta de forma idêntica à alternância Ligar/Desligar em Configurações > Tela > Luz noturna .