야간 조명 구현

연구 결과에 따르면 화면의 청색광은 수면에 부정적인 영향을 미칠 수 있다고 합니다. Android 7.1.1에는 야간 조명 기능이 도입되었습니다. 야간 조명은 기기 화면에서 발산되는 청색광의 양을 줄여 사용자의 현재 시각 및 위치에 따른 자연광에 좀 더 가깝도록 만들어 줍니다. Android 8.0에는 추가적인 야간 조명 효과 강도 제어 사용자 기능이 도입되었습니다. Android 10에는 COLOR_DISPLAY_SERVICE 시스템 서비스가 도입됩니다. 여기에는 시스템, 설정 및 시스템 UI에서 야간 조명을 비롯한 모든 색 변환에 관한 추가 제어가 가능하게 하는 시스템 API 노출 영역이 포함됩니다.

야간 조명에는 setColorTransform에 전달된 매트릭스를 적용하여 전력과 성능, 앱 호환성에 영향을 미치지 않고 색조를 조정할 수 있는 Hardware Composer HAL 2.0(HWC 2) 구현이 필요합니다.

구현

기기 제조업체는 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>

코드는 프레임워크, 시스템 서비스, 시스템 UI 및 설정 간에 분할됩니다. 핵심 기능은 ColorDisplayManager(ColorDisplayService에서 지원)에서 제어됩니다.

기기 제조업체는 화이트 포인트, 색 영역, 원하는 색을 포함하여 기기의 디스플레이 패널 특성을 기반으로 색 램프를 맞춤설정해야 합니다. 구성 오버레이를 사용하여 기본 구현을 변경하지 않고도 색 램프를 변경할 수 있습니다. 이 구성은 각 빨간색, 녹색, 파란색의 2차 방정식으로 표현되며 형식은 vres = vat2 + vbt + vy-int입니다. 여기서 t는 config_nightDisplayColorTemperatureMinconfig_nightDisplayColorTemperatureMax 사이의 범위에서 지정된 Kelvin의 온도 입력이고(이전 섹션에서 설명) va, vb, vy-int는 각각 아래에 표시된 주어진 기본 곡선의 a-계수, b-계수, y-intercept입니다.

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

UI 기능

야간 조명은 사용자 대상 기능이므로 사용자가 이를 제어할 수 있어야 합니다. Android 오픈소스 프로젝트(AOSP) packages/apps/Settings 프로젝트에는 기기 제조업체가 설정 구현과 관련하여 참조할 수 있는 일체의 설정 구현이 있습니다. 구현자는 Settings.ACTION_NIGHT_DISPLAY_SETTINGS 인텐트를 처리하여 이 설정을 노출시켜야 합니다.

설정

야간 조명 설정은 설정 > 디스플레이 > 야간 조명에 있습니다. 여기서 사용자는 야간 조명을 알아보고 일정을 설정하고 기능을 켜거나 끌 수 있습니다.

  • 자동으로 켜기
    • 사용 안 함: 야간 자동이 자동으로 켜지지 않으며 수동 On/Off 전환으로 활성화되어야 합니다.
    • 맞춤 예약: 야간 조명이 지정된 시작 시간[기본 10:30pm]에 켜졌다가 지정된 종료 시간[기본 6:30am]에 꺼집니다.
    • 화면 밝기 자동 조정: 야간 조명이 일몰 시간에 켜졌다가 일출 시간에 꺼집니다. 일출 및 일몰 시간은 기기 위치와 계절에 따라 다릅니다.
  • On/Off: 현재의 야간 조명 상태를 제어하는 전환입니다. 이 상태는 기존의 자동 규칙을 존중합니다. 예를 들어 자동 규칙에서 오후 10시 30분에 켜기 전에 야간 조명이 오후 5시 30분에 켜져도 여전히 오전 6시 30분에 야간 조명이 꺼집니다. 자동 규칙에서 오전 6시 30분에 끄기 전에 야간 조명이 오전 5시 30분에 꺼져도 여전히 오후 10시 30분에 켜집니다.
  • 강도: 따뜻함에서 차가움으로 슬라이드하여 색조 수준을 제어하는 탐색 막대입니다. 야간 조명이 활성화되지 않으면 탐색 막대를 사용 중지할 수 있습니다.
  • 정보 텍스트: 사용자에게 야간 조명의 역할과 필요 이유를 알려줍니다.

조건부 설정

야간 조명이 켜지면 설정 상단에 표시됩니다.

빠른 설정 타일

빠른 설정 타일은 설정 > 디스플레이 > 야간 조명On/Off 전환과 동일하게 작동합니다.