Setelan rotasi otomatis berbasis status perangkat

Untuk perangkat foldable, pengalaman pengguna dapat dioptimalkan dengan menyesuaikan perilaku rotasi layar dengan status fisik perangkat. Misalnya, Anda dapat menyetel layar untuk berputar secara otomatis saat perangkat dibuka dalam postur seperti tablet, tetapi terkunci ke mode potret saat perangkat dilipat.

Mulai Android 13, Android memiliki kemampuan untuk menyesuaikan setelan putar otomatis berdasarkan status perangkat, seperti dilipat, dibuka, atau dilipat sebagian (mode tabletop).

Halaman setelan putar otomatis berbasis status perangkat

Gambar 1. Setelan putar otomatis berbasis status perangkat seperti yang dilihat oleh pengguna.

Mengaktifkan setelan putar otomatis berbasis status perangkat

Untuk mengaktifkan dan mengonfigurasi putar otomatis berbasis status perangkat, buat overlay perangkat untuk file config.xml framework, sebagai berikut:

  1. Konfigurasi perilaku putar otomatis default untuk postur perangkat yang berbeda dengan mengisi array bilangan bulat config_perDeviceStateRotationLockDefaults di overlay config.xml perangkat Anda:

    <!-- 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 adalah referensi ke postur perangkat lain dan Anda harus menentukan kapan nilai untuk postur adalah Settings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED. Jika postur dikonfigurasi dengan cara ini, semua permintaan untuk mendapatkan atau menetapkan preferensi putar otomatisnya akan dialihkan ke postur penggantian.

    Misalnya, jika postur HALF_OPENED kembali ke postur OPENED

    • Membaca setelan putar otomatis untuk HALF_OPENED akan menampilkan setelan saat ini untuk OPENED.
    • Menulis preferensi putar otomatis baru saat perangkat HALF_OPENED akan memperbarui preferensi untuk postur OPENED.
  2. Konfigurasi deskripsi untuk setiap postur perangkat yang dapat ditetapkan pengguna. Isi array string config_settableAutoRotationDeviceStatesDescriptions di overlay aplikasi Setelan perangkat Anda:

    <!-- 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. Gunakan API yang benar untuk mengubah setelan ini secara terprogram, bukan menulis ke penyedia setelan secara langsung, untuk mencegah perilaku yang tidak konsisten:

    • Untuk mengubah status kunci rotasi saat ini (mengubah ACCELEROMETER_ROTATION):

    • Untuk mengubah preferensi kunci rotasi untuk status perangkat tertentu (mengubah DEVICE_STATE_ROTATION_LOCK):

Detail implementasi

Setelan dan class kunci inti yang mengontrol perilaku putar otomatis untuk perangkat foldable dijelaskan di bagian berikut.

Setelan

Sistem menggunakan dua setelan berikut untuk mengelola putar otomatis:

  • Settings.System.ACCELEROMETER_ROTATION: Ini adalah setelan putar otomatis utama. Untuk perangkat foldable, nilainya mencerminkan apakah putar otomatis diaktifkan untuk postur perangkat saat ini.

  • Settings.Secure.DEVICE_STATE_ROTATION_LOCK: Setelan ini menyimpan preferensi putar otomatis pengguna untuk setiap postur perangkat (misalnya, dilipat atau dibuka). Hal ini memungkinkan sistem menerapkan preferensi yang benar saat postur perangkat berubah.

    Setelan disimpan sebagai string yang dibatasi titik dua. Setiap pasangan nilai mewakili postur perangkat dan setelan rotasi yang sesuai. Formatnya adalah:

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

    Nilai untuk rotasi adalah:

    • 0: Diabaikan (setelan untuk postur penggantian digunakan)
    • 1: Terkunci (putar otomatis nonaktif)
    • 2: Tidak terkunci (putar otomatis aktif)

    Misalnya, string "0:2:2:1" berarti:

    • Untuk status dilipat (postur 0), putar otomatis tidak terkunci (2).
    • Untuk status dibuka (postur 2), putar otomatis terkunci (1).

Class utama

Logika untuk mengelola setelan putar otomatis berbasis status perangkat ditangani oleh class berikut:

  • DeviceStateAutoRotateSettingManagerImpl: Mengelola setelan DEVICE_STATE_ROTATION_LOCK. Class ini menyediakan metode untuk memperbarui setelan, mengambil nilainya, dan mendaftarkan pemroses untuk perubahan.

  • DeviceStateAutoRotateSettingController (Pengelola Jendela): Menyinkronkan ACCELEROMETER_ROTATION dan DEVICE_STATE_ROTATION_LOCK. Saat postur perangkat berubah, setelan ini akan memperbarui ACCELEROMETER_ROTATION berdasarkan preferensi pengguna untuk status baru. Setelan ini memastikan bahwa setiap perubahan pada ACCELEROMETER_ROTATION disimpan kembali ke DEVICE_STATE_ROTATION_LOCK untuk postur perangkat saat ini dan dengan cara yang sama, perubahan pada DEVICE_STATE_ROTATION_LOCK untuk postur saat ini akan ditampilkan di ACCELEROMETER_ROTATION.

  • DeviceStateAutoRotateSettingController (aplikasi Setelan): Mengontrol UI di halaman setelan putar otomatis berbasis status perangkat.

  • PostureDeviceStateConverter: Mengonversi antara ID status perangkat generik dan ID postur perangkat yang digunakan oleh fitur ini.

Validasi

Karena perilaku fitur ini sangat bergantung pada konfigurasi OEM, tidak ada pengujian CTS khusus untuk fitur ini. Anda harus melakukan pengujian manual untuk memverifikasi bahwa setelan putar otomatis berubah seperti yang diharapkan saat perangkat bertransisi antara status fisik yang berbeda yang telah Anda konfigurasi.