สแตนด์บายทีวี

ใน Android 11 การนอนหลับโดยไม่ตั้งใจเป็นฟีเจอร์ประหยัดพลังงานที่ช่วยให้ผู้ใช้สามารถตั้งค่าการหมดเวลาการไม่ใช้งานของผู้ใช้หลังจากที่หน้าจอปิดลง แม้ว่าหน้าต่างที่มี FLAG_KEEP_SCREEN_ON จะมองเห็นได้หรือมีการล็อค Wakelock ระดับ FULL_WAKE_LOCK , SCREEN_BRIGHT_WAKE_LOCK หรือ SCREEN_DIM_WAKE_LOCK ไว้ก็ตาม Wakelock ที่มีระดับ PARTIAL_WAKE_LOCK จะไม่ได้รับผลกระทบจากคุณสมบัตินี้ ไม่นานก่อนที่ระยะหมดเวลาจะสิ้นสุดลง ระบบจะแสดงข้อความเพื่อเตือนผู้ใช้ว่าอุปกรณ์จะเข้าสู่โหมดสลีปหากไม่ได้โต้ตอบกับอุปกรณ์

ในบริบทนี้ กิจกรรมผู้ใช้อ้างอิงถึงสิ่งใดก็ตามที่ทริกเกอร์การเรียก PowerManager#userActivity (โดยไม่มีแฟล็ก USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS ) รวมถึงแต่ไม่จำกัดเพียง:

  • การโต้ตอบกับหน้าจอสัมผัส
  • การกดปุ่มทางกายภาพ
  • ป้อนข้อมูลเหตุการณ์จากอุปกรณ์เสริมภายนอก (เช่น แป้นพิมพ์ที่เชื่อมต่อ รีโมทบลูทูธ รีโมท IR)
  • การโต้ตอบด้วยเสียง
  • การรับข้อความ HDMI CEC บางอย่าง เช่น One Touch Play
  • กำลังเริ่มเซสชั่นนักแสดงใหม่

การปรับแต่ง

หากเปิดใช้งานคุณสมบัตินี้ อุปกรณ์จะแสดงคำเตือนบนหน้าจอหลังจากไม่มีการใช้งานของผู้ใช้เป็นระยะเวลาหนึ่ง หากไม่มีการดำเนินการใดๆ หน้าจอจะปิดลง คุณสามารถปรับแต่งคุณสมบัติได้โดยใช้ตัวเลือกการกำหนดค่าเหล่านี้

การกำหนดค่าการหมดเวลา

หากต้องการกำหนดค่าการหมดเวลา ให้อัพเดตอิลิเมนต์ต่อไปนี้ใน frameworks/base/core/res/res/values/config.xml :

  • config_attentiveTimeout
    • ระบุเวลาเริ่มต้นในหน่วยมิลลิวินาทีที่ผู้ใช้ไม่มีการใช้งานหลังจากที่หน้าจอปิดลง (แม้ว่าจะใช้งาน Wakelock ของหน้าจอก็ตาม)
    • ตั้งเวลาสร้าง
    • หากค่าอยู่ระหว่าง 0 ถึง config_minimumScreenOffTimeout การหมดเวลาจะถูกตั้งค่าเป็น config_minimumScreenOffTimeout เพื่อป้องกันไม่ให้อุปกรณ์ปิดหน้าจอไม่นานหลังจากตื่นนอน
    • ค่าเริ่มต้น: -1 ซึ่งปิดใช้งานคุณลักษณะนี้

แทนที่การหมดเวลาเริ่มต้น

หากต้องการแทนที่การตั้งค่าการหมดเวลาเริ่มต้น ให้อัปเดตองค์ประกอบต่อไปนี้

  • Settings.Secure.ATTENTIVE_TIMEOUT
    • หากตั้งค่าไว้ จะแทนที่การหมดเวลาพักเครื่องโดยไม่ตั้งใจที่เป็นค่าเริ่มต้นซึ่งกำหนดโดย config_attentiveTimeout
    • สามารถตั้งค่าตอนรันไทม์ได้

การกำหนดระยะเวลาก่อนที่จะมีคำเตือนปรากฏขึ้น

หากต้องการกำหนดคอนฟิกระยะเวลา ให้อัพเดตอิลิเมนต์ต่อไปนี้ใน frameworks/base/core/res/res/values/config.xml :

  • config_attentiveWarningDuration
    • ระยะเวลาที่จะแสดงข้อความเตือนแก่ผู้ใช้ก่อนที่หน้าจอจะดับลงหลังจากที่ผู้ใช้ไม่มีการใช้งานเป็นเวลานาน
    • ค่าควรต่ำกว่าระยะหมดเวลาการนอนหลับโดยไม่ตั้งใจที่ตั้งไว้มาก มิฉะนั้นกล่องโต้ตอบคำเตือนจะแสดงอย่างต่อเนื่องและไม่สามารถปิดได้
    • ค่าเริ่มต้น: 30000 (30 วินาที)

การแสดงการตั้งค่าการหมดเวลาใน TvSettings

หากต้องการแสดงการกำหนดค่าตามความชอบการหมดเวลา ให้อัพเดตอิลิเมนต์ต่อไปนี้ใน packages/apps/TvSettings/Settings/res/values/config.xml :

  • config_show_standby_timeout
    • จะแสดงรายการกำหนดลักษณะเพื่อให้สามารถปิดหน้าจอระหว่างการเล่นสื่อได้หรือไม่
    • ค่าเริ่มต้น: false

ทรัพยากรสำหรับ UI คำเตือน

  • โครงร่างของไดอะล็อกคำเตือนถูกกำหนดไว้ใน frameworks/base/packages/SystemUI/res/layout/inattentive_sleep_warning.xml
  • สตริงต่อไปนี้สำหรับไดอะล็อกถูกกำหนดไว้ใน frameworks/base/packages/SystemUI/res/values/strings.xml และ frameworks/base/packages/SystemUI/res-product/values/strings.xml
    • inattentive_sleep_warning_title
    • inattentive_sleep_warning_message

การกำหนดค่าเวลาในการสร้างและทรัพยากรสามารถเปลี่ยนแปลงได้โดยการซ้อนทับทรัพยากร

การนำไปปฏิบัติ

เปิดใช้งานคุณสมบัติโดยใช้สิ่งต่อไปนี้

  1. แทนที่ค่าดีฟอลต์ config_attentiveTimeout
  2. หากใช้ AOSP TvSettings :
    • ปิดการใช้งานคุณสมบัติในการตั้งค่าโดยการแทนที่ config_show_standby_timeout
    • ใช้การตั้งค่าของคุณเองที่ตั้งค่า Settings.Secure.ATTENTIVE_TIMEOUT

การตรวจสอบ

การทดสอบ CTS สำหรับคุณลักษณะนี้อยู่ที่ cts/hostsidetests/os/src/android/os/cts/InattentiveSleepTests.java

ตัวอย่างและที่มา

  • frameworks/base/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java มีการใช้งาน UI คำเตือนเริ่มต้น
  • packages/apps/TvSettings ให้ตัวอย่างวิธีเปิดเผยคุณสมบัติในการตั้งค่า

ตัวอย่างกรณีทดสอบด้วยตนเอง

  1. ตรวจสอบให้แน่ใจว่าการตั้งค่าของนักพัฒนา stay_on_while_plugged_in ปิดอยู่ หาก HAL สุขภาพของอุปกรณ์รายงานว่าอุปกรณ์มีแบตเตอรี่ ( battery_present เป็น true ) เนื่องจากอาจทำให้ฟีเจอร์นี้ไม่สามารถปิดหน้าจอได้
    adb shell settings put global stay_on_while_plugged_in 0

  2. ตั้งค่าการหมดเวลาการนอนหลับโดยไม่ตั้งใจให้มากกว่าระยะเวลาของกล่องโต้ตอบคำเตือนสองสามวินาที
    adb shell settings put secure attentive_timeout 32000
  3. เริ่มเล่นวิดีโอ (เพื่อรับการปลุกหน้าจอ)
  4. ตรวจสอบว่ากล่องโต้ตอบคำเตือนการนอนหลับปรากฏขึ้นหลังจากผ่านไปไม่กี่วินาที
  5. ตรวจสอบว่าหน้าจอปิดลงหลังจากหมดเวลาที่กำหนด