تنفيذ ضوء الليل

تشير الأبحاث إلى أن الضوء الأزرق المنبعث من الشاشات يمكن أن يكون له تأثير سلبي على النوم. قدم Android 7.1.1 ميزة تسمى Night Light والتي تعمل على تقليل كمية الضوء الأزرق المنبعث من شاشة الجهاز لتتناسب بشكل أفضل مع الضوء الطبيعي لوقت المستخدم من اليوم وموقعه. قدم Android 8.0 ميزة إضافية تمنح المستخدمين مزيدًا من التحكم في شدة تأثير Night Light. يقدم Android 10 خدمة النظام COLOR_DISPLAY_SERVICE ، مع سطح API للنظام لمنح النظام والإعدادات وواجهة مستخدم النظام مزيدًا من التحكم في جميع تحويلات الألوان، بما في ذلك Night Light.

يتطلب Night Light تطبيق Hardware Composer HAL 2.0 (HWC 2) الذي يمكنه تطبيق المصفوفة التي تم تمريرها إلى setColorTransform لإجراء التلوين دون التأثير على الطاقة والأداء وتوافق التطبيق.

تطبيق

يمكن لمصنعي الأجهزة تمكين التنفيذ الافتراضي للميزة باستخدام العلامات التالية المحددة في 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>

يتم تقسيم الكود بين إطار العمل وخدمات النظام وواجهة مستخدم النظام والإعدادات. يتم التحكم في الوظيفة الأساسية بواسطة ColorDisplayManager (المدعوم بواسطة ColorDisplayService ).

يجب على الشركات المصنعة للأجهزة تخصيص تدرج الألوان استنادًا إلى خصائص لوحة عرض الجهاز، بما في ذلك النقطة البيضاء والتدرج اللوني واللون المطلوب. يمكنك تغيير تدرج الألوان دون تغيير التنفيذ الأساسي باستخدام تراكب التكوين. يتم التعبير عن هذا التكوين كمعادلة تربيعية لكل من الأحمر والأخضر والأزرق، في النموذج v res = v a t 2 + v b t + v y-int حيث t هي مدخلات درجة الحرارة بالكلفن، كما هو محدد في النطاق بين config_nightDisplayColorTemperatureMin و config_nightDisplayColorTemperatureMax (كما هو موضح في القسم السابق)، وv a وv b وv y-int هي معامل a ومعامل b وتقاطع y، على التوالي، لمنحنى الأساسي المحدد، كما المبين أدناه.

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

ميزات واجهة المستخدم

نظرًا لأن Night Light هي ميزة يواجهها المستخدم، فيجب أن يكون المستخدمون قادرين على التحكم فيها. يوجد تنفيذ كامل للإعدادات في مشروع حزم/تطبيقات/إعدادات مشروع Android مفتوح المصدر (AOSP) الذي يمكن لمصنعي الأجهزة الرجوع إليه لتنفيذ الإعدادات الخاصة بهم. يجب على المنفذين التعامل مع نية Settings.ACTION_NIGHT_DISPLAY_SETTINGS لكشف هذا الإعداد.

إعدادات

توجد إعدادات Night Light في الإعدادات > العرض > Night Light . ومن هناك، يمكن للمستخدمين التعرف على Night Light وتحديد جدوله الزمني وتشغيله أو إيقاف تشغيله.

  • تشغيل تلقائيا
    • أبدًا: لن يتم تشغيل الإضاءة الليلية تلقائيًا مطلقًا ويجب تنشيطها باستخدام مفتاح التشغيل/الإيقاف اليدوي.
    • جدول مخصص: يتم تشغيل الإضاءة الليلية في وقت بدء محدد [الافتراضي: 10:30 مساءً] ويتم إيقاف تشغيلها في وقت انتهاء محدد [الافتراضي: 6:30 صباحًا].
    • من غروب الشمس إلى شروقها: يتم تشغيل الضوء الليلي عند غروب الشمس وينطفئ عند شروق الشمس. يعتمد وقت شروق الشمس وغروبها على موقع الجهاز والوقت من السنة.
  • تشغيل / إيقاف: تبديل يتحكم في الحالة الحالية للضوء الليلي. تحترم هذه الحالة القواعد التلقائية الموجودة. على سبيل المثال، إذا تم تشغيل Night Light عند الساعة 5:30 مساءً (قبل أن تقوم القاعدة التلقائية بتشغيله عند الساعة 10:30 مساءً)، فسيتم إيقاف تشغيل Night Light عند الساعة 6:30 صباحًا، وإذا تم تبديل Night Light عند الساعة 5 :30 صباحًا (قبل أن ينطفئ عند الساعة 6:30 صباحًا)، سيستمر في التشغيل عند الساعة 10:30 مساءً
  • الكثافة: شريط البحث الذي يتحكم في مستوى الصبغة عن طريق الانزلاق من الدافئ إلى البارد. يمكن تعطيل شريط البحث عند عدم تنشيط Night Light.
  • نص إعلامي: يعلم المستخدم ما يفعله Night Light ولماذا.

الإعدادات مشروطة

يكون مرئيًا في الجزء العلوي من الإعدادات عند تشغيل الإضاءة الليلية.

بلاط الإعدادات السريعة

يتصرف مربع الإعدادات السريعة بشكل مماثل لمفتاح التشغيل/الإيقاف في الإعدادات > العرض > الإضاءة الليلية .