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 posisi seperti tablet, tetapi dikunci ke potret saat perangkat dilipat.

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

Halaman setelan putar otomatis berbasis status perangkat

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

Mengaktifkan setelan rotasi otomatis berdasarkan status perangkat

Untuk mengaktifkan dan mengonfigurasi rotasi 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 perangkat Anda 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 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, setiap permintaan untuk mendapatkan atau menyetel preferensi rotasi 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 rotasi otomatis baru saat perangkat berada dalam status HALF_OPENED akan memperbarui preferensi untuk postur OPENED.
  2. Konfigurasi deskripsi untuk setiap postur perangkat yang dapat disetel 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. Anda harus menggunakan 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 rotasi otomatis untuk perangkat foldable dijelaskan di bagian berikut.

Setelan

Sistem menggunakan dua setelan berikut untuk mengelola rotasi otomatis:

  • Settings.System.ACCELEROMETER_ROTATION: Ini adalah setelan putar otomatis utama. Untuk perangkat foldable, nilainya mencerminkan apakah rotasi 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). Dengan cara ini, sistem dapat 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: Terbuka (putar otomatis aktif)

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

    • Untuk status lipatan (postur 0), putar otomatis dibuka kuncinya (2).
    • Untuk status dibentangkan (postur 2), putar otomatis dikunci (1).

Class utama

Logika untuk mengelola setelan rotasi 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, ACCELEROMETER_ROTATION diperbarui berdasarkan preferensi pengguna untuk status baru. Hal ini memastikan bahwa setiap perubahan pada ACCELEROMETER_ROTATION disimpan kembali ke DEVICE_STATE_ROTATION_LOCK untuk postur perangkat saat ini dan dengan cara yang serupa, perubahan pada DEVICE_STATE_ROTATION_LOCK untuk postur saat ini tercermin dalam 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 beralih di antara berbagai status fisik yang telah Anda konfigurasi.