Wdrożenie podświetlenia nocnego

Badania pokazują, że niebieskie światło z ekranów może negatywnie wpływać na sen. W Androidzie 7.1.1 wprowadziliśmy funkcję Podświetlenie nocne, która zmniejsza ilość niebieskiego światła emitowanego przez wyświetlacz urządzenia, aby lepiej dopasować je do naturalnego światła w zależności od pory dnia i lokalizacji użytkownika. W Androidzie 8.0 wprowadzono dodatkową funkcję, która daje użytkownikom większą kontrolę nad intensywnością efektu Night Light. Android 10 wprowadza usługę systemową COLOR_DISPLAY_SERVICE z interfejsem API systemu, aby zapewnić systemowi, ustawieniom i interfejsowi systemowemu większą kontrolę nad wszystkimi przekształceniami kolorów, w tym nad trybem Night Light.

Tryb Night Light wymaga implementacji Hardware Composer HAL 2.0 (HWC 2), która może stosować przekazaną do setColorTransform macierz, aby wykonać przyciemnienie bez wpływu na zużycie energii, wydajność i zgodność aplikacji.

Implementacja

Producenci urządzeń mogą włączyć domyślną implementację tej funkcji, używając tych flag zdefiniowanych w dokumentie 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>

Kod jest podzielony na framework, usługi systemowe, interfejs systemowy i ustawienia. Główna funkcjonalność jest kontrolowana przez ColorDisplayManager (oparty na ColorDisplayService).

Producenci urządzeń powinni dostosowywać rampę kolorów na podstawie parametrów panelu wyświetlacza urządzenia, w tym punktu białego, gamutu i wybranego koloru. Możesz zmienić rampę kolorów bez zmiany implementacji podstawowej, korzystając z nakładki konfiguracji. Ta konfiguracja jest wyrażona jako równanie kwadratowe dla każdego z kolorów czerwonego, zielonego i niebieskiego w formie vres = vat2 + vbt + vy-int, gdzie t to podany w zakresie od config_nightDisplayColorTemperatureMin do config_nightDisplayColorTemperatureMax (jak opisano w poprzedniej sekcji) sygnał temperatury w stopniach Kelvina, a va, vb i vy-int to odpowiednio współczynnik a, współczynnik b i współrzędna y krzywej danego koloru podstawowego, jak wskazano poniżej.

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

Funkcje interfejsu użytkownika

Funkcja Night Light jest skierowana do użytkowników, dlatego muszą mieć możliwość jej kontrolowania. W ramach projektu pakiety/aplikacje/Ustawienia w Android Open Source Project (AOSP) dostępna jest pełna implementacja ustawień, którą producenci urządzeń mogą wykorzystać w swoich implementacjach Ustawień. Implementatorzy muszą obsłużyć intencję Settings.ACTION_NIGHT_DISPLAY_SETTINGS, aby ujawnić to ustawienie.

Ustawienia

Ustawienia Podświetlenia nocnego znajdziesz w sekcji Ustawienia > Wyświetlacz > Podświetlenie nocne. Użytkownicy mogą dowiedzieć się więcej o podświetleniu nocnym, ustawić jego harmonogram oraz je włączyć lub wyłączyć.

  • Włącz automatycznie
    • Nigdy: podświetlenie nocne nigdy nie włączy się automatycznie i musi być aktywowane ręcznie za pomocą przełącznika Wł./Wył..
    • Harmonogram niestandardowy: podświetlenie nocne włącza się o określonej godzinie rozpoczęcia [domyślnie 22:30] i wyłącza o określonej godzinie zakończenia [domyślnie 6:30].
    • Od zachodu do wschodu słońca: podświetlenie nocne włącza się o zachodzie słońca i wyłącza o wschodzie. Czas wschodu i zachodu słońca zależy od lokalizacji urządzenia oraz pory roku.
  • Wł./wył.:przełącznik, który kontroluje bieżący stan podświetlenia nocnego. Ten stan uwzględnia istniejące reguły automatyczne. Jeśli np. o 17:30 włączysz podświetlenie nocne (zanim zrobi to reguła automatyczna o 22:30), Podświetlenie nocne wyłączy się o 6:30 rano. Jeśli wyłączysz je o 5:30 rano (zanim wyłączy się o 6:30 rano), włączy się o 22:30.
  • Intensywność: suwak, który pozwala regulować poziom zabarwienia, przesuwając suwak od ciepłego do chłodnego. Gdy tryb Night Light jest wyłączony, suwak można wyłączyć.
  • Tekst informacyjny: informuje użytkownika, do czego służy tryb nocny i dlaczego warto go włączyć.

Ustawienia zależne

Widoczne u góry ekranu Ustawienia, gdy Podświetlenie nocne jest włączone.

Kafelek Szybkich ustawień

Płytka Szybkich ustawień działa tak samo jak przełącznik Wł./Wył. w sekcji Ustawienia > Wyświetlacz > Tryb nocny.