Implementare la luminosità notturna

Alcuni studi suggeriscono che la luce blu degli schermi possa avere un impatto negativo sul sonno. Android 7.1.1 ha introdotto una funzionalità chiamata Luminosità notturna che riduce la quantità di luce blu emessa dal display del dispositivo per adattarsi meglio alla luce naturale dell'ora del giorno e della posizione dell'utente. Android 8.0 ha introdotto un'ulteriore funzionalità che offre agli utenti un maggiore controllo sull'intensità dell'effetto Luce notturna. Android 10 introduce il servizio di sistema COLOR_DISPLAY_SERVICE, con una superficie dell'API di sistema per offrire al sistema, alle Impostazioni e all'interfaccia utente di sistema un maggiore controllo su tutte le trasformazioni di colore, inclusa la Luce notturna.

Luce notturna richiede un'implementazione di Hardware Composer HAL 2.0 (HWC 2) che possa applicare la matrice passata a setColorTransform per eseguire la colorazione senza influire su potenza, prestazioni e compatibilità delle app.

Implementazione

I produttori di dispositivi possono attivare l'implementazione predefinita della funzionalità utilizzando i seguenti flag definiti inframeworks/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>

Il codice è suddiviso in framework, servizi di sistema, UI di sistema e Impostazioni. La funzionalità di base è controllata da ColorDisplayManager (supportata da ColorDisplayService).

I produttori di dispositivi devono personalizzare la rampa di colori in base alle caratteristiche del pannello del display del dispositivo, inclusi il punto di bianco, la gamma e il colore desiderato. Puoi modificare la scala di colori senza modificare l'implementazione di base utilizzando un overlay di configurazione. Questa configurazione è espressa come equazione quadratica per ciascuno dei colori rosso, verde e blu, nella forma vres = vat2 + vbt + vy-int dove t è l'input della temperatura in Kelvin, come specificato nell'intervallo tra config_nightDisplayColorTemperatureMin e config_nightDisplayColorTemperatureMax (come descritto nella sezione precedente) e va, vb e vy-int sono, rispettivamente, il coefficiente a, il coefficiente b e l'intercetta sull'asse y per la curva principale data, come indicato di seguito.

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

Funzionalità dell'interfaccia utente

Poiché Luce notturna è una funzionalità rivolta agli utenti, questi devono poterla controllare. Esiste un'implementazione completa delle impostazioni nel progetto Android Open Source Project (AOSP) packages/apps/Settings a cui i produttori di dispositivi possono fare riferimento per la propria implementazione delle impostazioni. Gli implementatori devono gestire l'intent Settings.ACTION_NIGHT_DISPLAY_SETTINGS per esporre questa impostazione.

Impostazioni

Le impostazioni della luminosità notturna sono disponibili in Impostazioni > Display > Luminosità notturna. Da qui, gli utenti possono scoprire di più sulla Luce notturna, impostarne la programmazione e attivarla o disattivarla.

  • Attiva automaticamente
    • Mai: la Luce notturna non si accende mai automaticamente e deve essere attivata con l'opzione di attivazione/disattivazione manuale On/Off.
    • Programmazione personalizzata:la luminosità notturna si accende a un'ora di inizio specificata [valore predefinito: 22:30] e si spegne a un'ora di fine specificata [valore predefinito: 06:30].
    • Dal tramonto all'alba: la luminosità notturna si accende al tramonto e si spegne all'alba. L'ora di alba e tramonto dipende dalla posizione del dispositivo e dal periodo dell'anno.
  • On/Off:pulsante di attivazione/disattivazione che controlla lo stato corrente della luminosità notturna. Questo stato rispetta le regole automatiche esistenti. Ad esempio, se la Luminosità notturna viene attivata alle 17:30 (prima che la regola automatica la attivi alle 22:30), La Luminosità notturna si spegnerà comunque alle 06:30. Se la Luminosità notturna viene disattivata alle 05:30 (prima che si spenga alle 06:30), si accenderà comunque alle 22:30.
  • Intensità: barra di scorrimento che controlla il livello di tinta scorrendo da caldo a freddo. La barra di scorrimento può essere disabilitata quando la luminosità notturna non è attiva.
  • Testo informativo: spiega all'utente cosa fa Luce notturna e perché.

Condizione delle impostazioni

Visibile nella parte superiore di Impostazioni quando la luminosità notturna è attiva.

Riquadro Impostazioni rapide

Il riquadro Impostazioni rapide si comporta in modo identico all'opzione di attivazione/disattivazione On/Off in Impostazioni > Display > Luminosità notturna.