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

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

ตั้งแต่ 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(...)
      • จาก Window Manager ให้ใช้ 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: แปลงระหว่างตัวระบุสถานะอุปกรณ์ทั่วไปกับตัวระบุท่าทางของอุปกรณ์ที่ฟีเจอร์นี้ใช้

การตรวจสอบ

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