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

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

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

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

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

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

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

  1. กำหนดค่าลักษณะการทำงานของการหมุนอัตโนมัติเริ่มต้นสำหรับท่าทางต่างๆ ของอุปกรณ์โดย ป้อนข้อมูลอาร์เรย์จำนวนเต็ม [config_perDeviceStateRotationLockDefaults][7] ในการวางซ้อนของอุปกรณ์ 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(...)][5]
      • จาก Window Manager ให้ใช้ DisplayRotation#freezeRotation() หรือ thawRotation()
    • วิธีเปลี่ยนค่ากำหนดการล็อกการหมุนสำหรับสถานะอุปกรณ์ที่เฉพาะเจาะจง (แก้ไข DEVICE_STATE_ROTATION_LOCK):

      • ใช้ requestDeviceStateAutoRotateSettingChange(...) จาก RotationPolicy หรือ [DeviceStateAutoRotateSettingManager][6]

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

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

การตั้งค่า

ระบบใช้การตั้งค่า 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][1]: จัดการการตั้งค่า DEVICE_STATE_ROTATION_LOCK โดยมีวิธีการอัปเดต การตั้งค่า ดึงค่า และลงทะเบียน Listener สำหรับการเปลี่ยนแปลง

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

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

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

การตรวจสอบ

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

[1]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManagerImpl.java [2]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/services/core/java/com/android/server/wm/DeviceStateAutoRotateSettingController.java [3]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/src/com/android/settings/display/DeviceStateAutoRotateSettingController.java [4]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/provider/Settings.java [5]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/com/android/internal/view/RotationPolicy.java;bpv=0 [6]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManager.java [7]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/res/values/config.xml;l=674;drc=485b59a37c1cd0af72ca706e0ba1094f4e7fef0e;l=674