การตั้งค่าหมุนอัตโนมัติตามสถานะอุปกรณ์

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

ตั้งแต่ Android 13 เป็นต้นไป Android จะมีความสามารถในการ ปรับแต่งการตั้งค่าหมุนอัตโนมัติตามสถานะของอุปกรณ์ เช่น พับ กางออก หรือพับครึ่ง (โหมดตั้งโต๊ะ)

หน้าการตั้งค่าการหมุนอัตโนมัติตามสถานะอุปกรณ์

รูปที่ 1: การตั้งค่าหมุนอัตโนมัติโดยอิงตามสถานะของอุปกรณ์ตามที่ผู้ใช้เห็น

เปิดใช้การตั้งค่าหมุนอัตโนมัติตามสถานะอุปกรณ์

หากต้องการเปิดใช้และกำหนดค่าการหมุนอัตโนมัติโดยอิงตามสถานะอุปกรณ์ ให้สร้าง การวางซ้อนอุปกรณ์สำหรับไฟล์ config.xml ของเฟรมเวิร์ก ดังนี้

  1. กำหนดค่าลักษณะการทำงานของการหมุนอัตโนมัติเริ่มต้นสำหรับท่าทางของอุปกรณ์ต่างๆ โดย ป้อนข้อมูลอาร์เรย์จำนวนเต็ม config_perDeviceStateRotationLockDefaults ในการวางซ้อน config.xml ของอุปกรณ์

    <!-- In your device overlay, for example,
        device/generic/goldfish/phone/overlay/frameworks/base/core/res/res/values/config.xml -->
    <resources>
        <!-- Map of device posture to rotation lock setting. Each entry must be
            in the format "key:value", or "key:value:fallback_key" for example:
            "0:1" or "2:0:1". The keys are one of
            Settings.Secure.DeviceStateRotationLockKey, and the values are one of
            Settings.Secure.DeviceStateRotationLockSetting. -->
        <integer-array name="config_perDeviceStateRotationLockDefaults">
            <item>0:1</item> <!-- CLOSED -> LOCKED -->
            <item>1:0:2</item> <!-- HALF_OPENED -> IGNORED and fallback to
                device posture OPENED -->
            <item>2:2</item> <!-- OPENED -> UNLOCKED -->
            <item>3:0:0</item> <!-- REAR_DISPLAY -> IGNORED and fallback to
                device posture CLOSED -->
        </integer-array>
    </resources>
    

    fallback-key เป็นการอ้างอิงถึงท่าทางของอุปกรณ์อื่น และคุณต้องระบุ เมื่อค่าสำหรับท่าทางเป็น Settings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED เมื่อกำหนดค่าท่าทางในลักษณะนี้ ระบบจะเปลี่ยนเส้นทางคำขอรับหรือตั้งค่ากำหนดการหมุนอัตโนมัติของท่าทางนั้นไปยังท่าทางสำรอง

    เช่น หากท่าทาง HALF_OPENED เปลี่ยนกลับเป็นท่าทาง OPENED

    • การอ่านการตั้งค่าการหมุนอัตโนมัติสำหรับ HALF_OPENED จะแสดงการตั้งค่าปัจจุบันสำหรับ OPENED
    • การเขียนค่ากำหนดการหมุนอัตโนมัติใหม่ขณะที่อุปกรณ์HALF_OPENEDอัปเดต ค่ากำหนดสำหรับท่าทางOPENED
  2. กำหนดค่าคำอธิบายสำหรับท่าทางของอุปกรณ์แต่ละท่าทางที่ผู้ใช้ตั้งค่าได้ ป้อน config_settableAutoRotationDeviceStatesDescriptionsอาร์เรย์สตริงในการซ้อนทับแอปการตั้งค่าของอุปกรณ์

    <!-- In your device's Settings app overlay -->
    <resources>
        <!-- The settings/preference description for each settable device
            posture defined in the array
            "config_perDeviceStateRotationLockDefaults".
            The item in position "i" describes the auto-rotation setting for the
            device posture also in position "i" in the array
            "config_perDeviceStateRotationLockDefaults". -->
        <string-array name="config_settableAutoRotationDeviceStatesDescriptions">
            <item>Auto-rotate when folded</item>
            <item>@null</item> <!-- No description for state in position 1 (it
            is not settable by the user) -->
            <item>Auto-rotate when unfolded</item>
        </string-array>
    </resources>
    
  3. คุณต้องใช้ API ที่ถูกต้องเพื่อแก้ไขการตั้งค่าเหล่านี้โดยอัตโนมัติ แทนที่จะเขียนไปยังผู้ให้บริการการตั้งค่าโดยตรง เพื่อป้องกัน ลักษณะการทำงานที่ไม่สอดคล้องกัน

    • วิธีเปลี่ยนสถานะการล็อกการหมุนปัจจุบัน (แก้ไข ACCELEROMETER_ROTATION)

      • จาก SystemUI หรือ Launcher ให้ใช้ RotationPolicy#setRotationLock(...)
      • จากตัวจัดการหน้าต่าง ให้ใช้ DisplayRotation#freezeRotation() หรือ thawRotation()
    • วิธีเปลี่ยนค่ากำหนดการล็อกการหมุนสำหรับสถานะอุปกรณ์ที่เฉพาะเจาะจง (แก้ไข DEVICE_STATE_ROTATION_LOCK):

รายละเอียดการติดตั้งใช้งาน

การตั้งค่าและคลาสคีย์หลักที่ควบคุมลักษณะการหมุนอัตโนมัติสำหรับ อุปกรณ์แบบพับได้อธิบายไว้ในส่วนต่อไปนี้

การตั้งค่า

ระบบใช้การตั้งค่า 2 อย่างต่อไปนี้เพื่อจัดการการหมุนอัตโนมัติ

  • Settings.System.ACCELEROMETER_ROTATION: นี่คือการตั้งค่าการหมุนอัตโนมัติหลัก สำหรับอุปกรณ์แบบพับได้ ค่าจะแสดงว่ามีการเปิดใช้ หมุนอัตโนมัติสำหรับท่าทางปัจจุบันของอุปกรณ์หรือไม่

  • Settings.Secure.DEVICE_STATE_ROTATION_LOCK: การตั้งค่านี้จะจัดเก็บค่ากำหนดการหมุนอัตโนมัติของ ผู้ใช้สำหรับท่าทางของอุปกรณ์แต่ละท่า (เช่น พับ หรือไม่พับ) ซึ่งจะช่วยให้ระบบใช้ค่ากำหนดที่ถูกต้องเมื่อ ท่าทางของอุปกรณ์เปลี่ยนแปลง

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

    <device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...

    ค่าสำหรับการหมุนมีดังนี้

    • 0: ไม่สนใจ (ใช้การตั้งค่าสำหรับท่าทางสำรอง)
    • 1: ล็อกอยู่ (ปิดการหมุนอัตโนมัติ)
    • 2: ปลดล็อก (เปิดการหมุนอัตโนมัติ)

    เช่น สตริง "0:2:2:1" หมายถึง

    • สำหรับสถานะพับ (ท่าทาง 0) การหมุนอัตโนมัติจะปลดล็อก (2)
    • สำหรับสถานะที่กางออก (ท่าทาง 2) การหมุนอัตโนมัติจะล็อก (1)

คลาสที่สำคัญ

ตรรกะสำหรับการจัดการการตั้งค่าการหมุนอัตโนมัติที่อิงตามสถานะอุปกรณ์จะได้รับการจัดการโดยคลาสต่อไปนี้

  • DeviceStateAutoRotateSettingManagerImpl: จัดการการตั้งค่า DEVICE_STATE_ROTATION_LOCK โดยมีวิธีการอัปเดต การตั้งค่า ดึงค่า และลงทะเบียน Listener สำหรับการเปลี่ยนแปลง

  • DeviceStateAutoRotateSettingController (Window Manager): ซิงค์ ACCELEROMETER_ROTATION และ DEVICE_STATE_ROTATION_LOCK เมื่อ ท่าทางของอุปกรณ์เปลี่ยนไป ระบบจะอัปเดตACCELEROMETER_ROTATIONตาม ค่ากำหนดของผู้ใช้สำหรับสถานะใหม่ ซึ่งจะช่วยให้มั่นใจได้ว่าการเปลี่ยนแปลงใดๆ ใน ACCELEROMETER_ROTATION จะได้รับการบันทึกกลับไปยัง DEVICE_STATE_ROTATION_LOCK สำหรับ ท่าทางของอุปกรณ์ปัจจุบัน และในทำนองเดียวกัน การเปลี่ยนแปลงใน DEVICE_STATE_ROTATION_LOCK สำหรับท่าทางปัจจุบันจะแสดงใน ACCELEROMETER_ROTATION

  • DeviceStateAutoRotateSettingController (แอปการตั้งค่า): ควบคุม UI ในหน้าการตั้งค่าการหมุนอัตโนมัติโดยอิงตามสถานะของอุปกรณ์

  • PostureDeviceStateConverter: แปลงระหว่างตัวระบุสถานะอุปกรณ์ทั่วไปกับตัวระบุท่าทางของอุปกรณ์ที่ฟีเจอร์นี้ใช้

การตรวจสอบความถูกต้อง

เนื่องจากลักษณะการทำงานของฟีเจอร์นี้ขึ้นอยู่กับการกำหนดค่าของ OEM เป็นอย่างมาก จึงไม่มีการทดสอบ CTS เฉพาะสำหรับฟีเจอร์นี้ คุณต้องทำการทดสอบด้วยตนเองเพื่อ ยืนยันว่าการตั้งค่าหมุนอัตโนมัติเปลี่ยนตามที่คาดไว้เมื่ออุปกรณ์ เปลี่ยนสถานะทางกายภาพต่างๆ ที่คุณกำหนดค่าไว้