Implementar o Modo noturno

Pesquisas sugerem que a luz azul das telas pode ter um impacto negativo no sono. O Android 7.1.1 introduziu um recurso chamado Modo noturno, que reduz a quantidade de luz azul emitida pela tela do dispositivo para corresponder melhor à luz natural 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 do Modo noturno. O Android 10 apresenta o serviço do sistema COLOR_DISPLAY_SERVICE, com uma API do sistema para dar ao sistema, às Configurações e à IU do sistema mais controle sobre todas as transformações de cores, incluindo o Modo noturno.

O Night Light requer uma implementação do Hardware Composer HAL 2.0 (HWC 2) que possa aplicar a matriz transmitida a setColorTransform para realizar a coloração sem afetar a energia, o desempenho e a compatibilidade do app.

Implementação

Os fabricantes de dispositivos podem ativar a implementação padrão do recurso usando as seguintes flags definidas 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 framework, serviços do sistema, interface do sistema e configurações. A funcionalidade principal é controlada por ColorDisplayManager (apoiada por ColorDisplayService).

Os fabricantes de dispositivos precisam personalizar a rampa de cores com base nas características do painel de exibição do dispositivo, incluindo o ponto branco, a gama e a cor desejada. É possível mudar a rampa de cores sem mudar a implementação de base usando uma sobreposição de configuração. Essa configuração é expressa como uma equação quadrática para cada um dos vermelho, verde e azul, na forma vres = vat2 + vbt + vy-int, em que t é a entrada de temperatura em kelvin, conforme especificado no intervalo entre config_nightDisplayColorTemperatureMin e config_nightDisplayColorTemperatureMax (conforme descrito na seção anterior), e va, vb e vy-int são o coeficiente a, o coeficiente b e a interseção y, respectivamente, para a curva primária dada, conforme 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

Como o Night Light é um recurso voltado ao usuário, ele precisa ser controlado pelo usuário. Há uma implementação completa das configurações no projeto packages/apps/Settings do Android Open Source Project (AOSP) que os fabricantes de dispositivos podem usar como referência para a implementação das configurações. Os implementadores precisam processar a intent Settings.ACTION_NIGHT_DISPLAY_SETTINGS para expor essa configuração.

Configurações

As configurações do Modo noturno estão em Configurações > Tela > Modo noturno. Nela, os usuários podem saber mais sobre o recurso, definir a programação e ativar ou desativar.

  • Ativar automaticamente
    • Nunca:o Modo noturno nunca será ativado automaticamente e precisa ser ativado manualmente com a opção Ativar / Desativar.
    • Programação personalizada: o Modo noturno é ativado em um Horário de início especificado [padrão: 22h30] e desativado em um Horário de término especificado [padrão: 6h30].
    • Do anoitecer ao amanhecer:o Modo noturno é ativado ao pôr do sol e desativado ao amanhecer. O horário do nascer e do pôr do sol depende da localização do dispositivo e da época do ano.
  • Ativar / Desativar:alternar que controla o estado atual do Modo noturno. Esse estado respeita as regras automáticas atuais. Por exemplo, se o Modo noturno for ativado às 17h30 (antes da regra automática ativá-lo às 22h30), O Modo noturno ainda será desativado às 6h30. E se o Modo noturno for desativado às 5h30 (antes de ser desativado às 6h30), ele ainda será ativado às 22h30.
  • Intensidade:barra de busca que controla o nível de matiz deslizando de quente para frio. A barra de busca pode ser desativada quando o Modo noturno não está ativado.
  • Texto informativo:ensina ao usuário o que o Modo noturno faz e por quê.

Configurações condicionais

Fica visível na parte de cima das Configurações quando o Modo noturno está ativado.

Bloco "Configurações rápidas"

O bloco de Configurações rápidas se comporta de maneira idêntica ao botão Ativar / Desativar em Configurações > Tela > Luz noturna.