Chế độ tự động xoay dựa trên trạng thái thiết bị

Đối với thiết bị có thể gập lại, bạn có thể tối ưu hoá trải nghiệm người dùng bằng cách điều chỉnh hành vi xoay màn hình cho phù hợp với trạng thái vật lý của thiết bị. Ví dụ: bạn có thể đặt màn hình tự động xoay khi thiết bị mở ra ở tư thế giống như máy tính bảng, nhưng khoá ở hướng dọc khi thiết bị gập lại.

Kể từ Android 13, Android có khả năng tuỳ chỉnh chế độ tự động xoay dựa trên trạng thái của thiết bị, chẳng hạn như gập, mở hoặc gập một nửa (chế độ trên mặt bàn).

Trang cài đặt chế độ tự động xoay dựa trên trạng thái thiết bị

Hình 1: Chế độ tự động xoay dựa trên trạng thái thiết bị mà người dùng nhìn thấy.

Bật chế độ cài đặt tự động xoay dựa trên trạng thái thiết bị

Để bật và định cấu hình tính năng tự động xoay dựa trên trạng thái thiết bị, hãy tạo một lớp phủ thiết bị cho tệp config.xml của khung, như sau:

  1. Định cấu hình hành vi tự động xoay mặc định cho các tư thế thiết bị khác nhau bằng cách điền vào mảng số nguyên config_perDeviceStateRotationLockDefaults trong lớp phủ config.xml của thiết bị:

    <!-- 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 là một tham chiếu đến tư thế của một thiết bị khác và bạn phải chỉ định khi giá trị cho một tư thế là Settings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED. Khi một tư thế được định cấu hình theo cách này, mọi yêu cầu nhận hoặc đặt lựa chọn ưu tiên xoay tự động của tư thế đó sẽ được chuyển hướng đến tư thế dự phòng.

    Ví dụ: nếu tư thế HALF_OPENED quay lại tư thế OPENED:

    • Đọc chế độ cài đặt tự động xoay cho HALF_OPENED sẽ trả về chế độ cài đặt hiện tại cho OPENED.
    • Việc ghi một lựa chọn ưu tiên mới về chế độ tự động xoay trong khi thiết bị đang ở trạng thái HALF_OPENED sẽ cập nhật lựa chọn ưu tiên cho tư thế OPENED.
  2. Định cấu hình nội dung mô tả cho từng tư thế thiết bị mà người dùng có thể đặt. Điền vào mảng chuỗi config_settableAutoRotationDeviceStatesDescriptions trong lớp phủ ứng dụng Cài đặt của thiết bị:

    <!-- 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. Bạn phải sử dụng đúng API để sửa đổi các chế độ cài đặt này theo phương thức lập trình, thay vì ghi trực tiếp vào trình cung cấp chế độ cài đặt, để ngăn chặn hành vi không nhất quán:

    • Cách thay đổi trạng thái khoá xoay hiện tại (sửa đổi ACCELEROMETER_ROTATION):

      • Từ SystemUI hoặc Trình chạy, hãy sử dụng RotationPolicy#setRotationLock(...).
      • Trong Trình quản lý cửa sổ, hãy dùng DisplayRotation#freezeRotation() hoặc thawRotation().
    • Cách thay đổi lựa chọn ưu tiên khoá hướng xoay cho một trạng thái thiết bị cụ thể (sửa đổi DEVICE_STATE_ROTATION_LOCK):

Thông tin chi tiết về việc triển khai

Các chế độ cài đặt và lớp khoá cốt lõi kiểm soát hành vi tự động xoay cho thiết bị có thể gập lại được mô tả trong các phần sau.

Cài đặt

Hệ thống sử dụng 2 chế độ cài đặt sau để quản lý tính năng tự động xoay:

  • Settings.System.ACCELEROMETER_ROTATION: Đây là chế độ cài đặt tự động xoay chính. Đối với thiết bị có thể gập lại, giá trị này phản ánh việc tính năng tự động xoay có được bật cho tư thế hiện tại của thiết bị hay không.

  • Settings.Secure.DEVICE_STATE_ROTATION_LOCK: Chế độ cài đặt này lưu trữ lựa chọn ưu tiên tự động xoay của người dùng cho từng tư thế thiết bị (ví dụ: gập hoặc mở). Điều này cho phép hệ thống áp dụng lựa chọn ưu tiên chính xác khi tư thế của thiết bị thay đổi.

    Chế độ cài đặt này được lưu trữ dưới dạng một chuỗi phân cách bằng dấu hai chấm. Mỗi cặp giá trị đại diện cho một tư thế thiết bị và chế độ xoay tương ứng. Định dạng là:

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

    Các giá trị cho chế độ xoay là:

    • 0: Bị bỏ qua (chế độ cài đặt cho tư thế dự phòng được dùng)
    • 1: Đã khoá (tắt tính năng tự động xoay)
    • 2: Đã mở khoá (bật tính năng tự động xoay)

    Ví dụ: chuỗi "0:2:2:1" có nghĩa là:

    • Đối với trạng thái gập (tư thế 0), chế độ tự động xoay sẽ được mở khoá (2).
    • Đối với trạng thái mở (tư thế 2), chế độ tự động xoay sẽ bị khoá (1).

Các lớp chính

Logic quản lý chế độ cài đặt tự động xoay dựa trên trạng thái thiết bị do các lớp sau xử lý:

  • DeviceStateAutoRotateSettingManagerImpl: Quản lý chế độ cài đặt DEVICE_STATE_ROTATION_LOCK. Nó cung cấp các phương thức để cập nhật chế độ cài đặt, truy xuất giá trị của chế độ cài đặt và đăng ký trình nghe cho các thay đổi.

  • DeviceStateAutoRotateSettingController (Trình quản lý cửa sổ): Đồng bộ hoá ACCELEROMETER_ROTATIONDEVICE_STATE_ROTATION_LOCK. Khi tư thế của thiết bị thay đổi, thành phần này sẽ cập nhật ACCELEROMETER_ROTATION dựa trên lựa chọn ưu tiên của người dùng cho trạng thái mới. Thao tác này đảm bảo rằng mọi thay đổi đối với ACCELEROMETER_ROTATION đều được lưu lại vào DEVICE_STATE_ROTATION_LOCK cho tư thế hiện tại của thiết bị và tương tự, các thay đổi đối với DEVICE_STATE_ROTATION_LOCK cho tư thế hiện tại đều được phản ánh trong ACCELEROMETER_ROTATION.

  • DeviceStateAutoRotateSettingController (Ứng dụng Cài đặt): Kiểm soát giao diện người dùng trên trang cài đặt tự động xoay dựa trên trạng thái thiết bị.

  • PostureDeviceStateConverter: Chuyển đổi giữa các giá trị nhận dạng trạng thái thiết bị chung và giá trị nhận dạng tư thế thiết bị mà tính năng này sử dụng.

Xác nhận kết quả

Vì hành vi của tính năng này phụ thuộc nhiều vào cấu hình của OEM, nên không có các kiểm thử CTS cụ thể cho tính năng này. Bạn phải thực hiện kiểm thử thủ công để xác minh rằng chế độ cài đặt tự động xoay thay đổi như mong đợi khi thiết bị chuyển đổi giữa các trạng thái vật lý mà bạn đã định cấu hình.