Implementar o Modo noturno

Pesquisas sugerem que a luz azul das telas pode ter um impacto negativo na sono. O Android 7.1.1 introduziu um recurso chamado Modo noturno, que reduz o quantidade de luz azul emitida pela tela do dispositivo para combinar melhor com o de acordo com a hora do dia e o local do usuário. O Android 8.0 introduziu um novo que dá aos usuários mais controle sobre a intensidade do efeito Iluminação noturna. O Android 10 introduz a Serviço do sistema COLOR_DISPLAY_SERVICE, com uma API do sistema superfície para dar ao sistema, às configurações e à interface do sistema mais controle sobre todas as cores de transformação, incluindo o Modo noturno.

O Modo noturno requer um Hardware Implementação da HAL 2.0 do Composer 2.0 (HWC 2) que pode aplicar a matriz transmitida setColorTransform para realizar a tonalidade sem afetar a energia; desempenho e compatibilidade de apps.

Implementação

Os fabricantes de dispositivos podem ativar a implementação padrão do recurso usando as seguintes sinalizações 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 a funcionalidade principal é controlada por ColorDisplayManager (com apoio de ColorDisplayService).

Os fabricantes de dispositivos devem personalizar a variação de cores com base nas características do dispositivo, incluindo o ponto branco, a gama e a cor desejada. É possível alterar rampa de cores sem mudar a implementação básica usando uma sobreposição de configuração. Essa configuração é expressa como uma equação quadrática para cada um dos valores de vermelho, verde e azul. Em formato 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 as coeficiente a, coeficiente b e interceptação y, respectivamente, para a curva do primário em questão, 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 Modo noturno é um recurso voltado ao usuário, ele precisa ser capaz de controlar reimplantá-lo. Há uma implementação completa das configurações no aplicativo Projeto (AOSP) packages/apps/Settings (em inglês). que os fabricantes de dispositivos podem consultar para definir as configurações implementação. Os implementadores precisam lidar com Settings.ACTION_NIGHT_DISPLAY_SETTINGS para expor essa configuração.

Configurações

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

  • Ativar automaticamente
    • Nunca:o Modo noturno nunca é ativado automaticamente, e precisa ser ativada com o botão Ativar / Desativar manual.
    • Programação personalizada:o Modo noturno será ativado no horário especificado Horário de início [padrão: 22h30] e desativado no horário especificado Horário de término [padrão: 6:30 a.m.].
    • Do pôr ao nascer do sol:o Modo noturno será ativado e desativado ao anoitecer. ao nascer do sol. O horário do nascer e do pôr do sol depende da localização do dispositivo e a época do ano.
  • Ativar / desativar:controle o estado noturno atual. Luz. Esse estado respeita as regras automáticas atuais. Por exemplo, se Noite A luz será acesa às 17h30. (antes que a regra automática a ative às 22h30), O Modo noturno ainda será desativado às 6h30 A luz será apagada às 5h30 (antes de apagar às 6h30), vai se 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 desativado quando o Modo noturno não está ativado.
  • Texto informativo:ensina ao usuário o que o Modo noturno faz e por quê.

Condicional de configurações

Visível na parte de cima das configurações quando o Modo noturno está ativado.

Bloco "Configurações rápidas"

O bloco "Configurações rápidas" se comporta de maneira idêntica à opção Ativar / Desativar alterne em Configurações > Exibição > Modo noturno.