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).
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:
Konfigurasi perilaku putar otomatis default untuk postur perangkat yang berbeda dengan mengisi array bilangan bulat
config_perDeviceStateRotationLockDefaultsdi overlay perangkat Andaconfig.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-keyadalah referensi ke postur perangkat lain dan Anda harus menentukan kapan nilai untuk postur adalahSettings.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_OPENEDkembali ke posturOPENED:- Membaca setelan putar otomatis untuk
HALF_OPENEDakan menampilkan setelan saat ini untukOPENED. - Menulis preferensi rotasi otomatis baru saat perangkat berada dalam status
HALF_OPENEDakan memperbarui preferensi untuk posturOPENED.
- Membaca setelan putar otomatis untuk
Konfigurasi deskripsi untuk setiap postur perangkat yang dapat disetel pengguna. Isi array string
config_settableAutoRotationDeviceStatesDescriptionsdi 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>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):- Dari SystemUI atau Peluncur, gunakan
RotationPolicy#setRotationLock(...). - Dari Pengelola Jendela, gunakan
DisplayRotation#freezeRotation()atauthawRotation().
- Dari SystemUI atau Peluncur, gunakan
Untuk mengubah preferensi kunci rotasi untuk status perangkat tertentu (mengubah
DEVICE_STATE_ROTATION_LOCK):- Gunakan
requestDeviceStateAutoRotateSettingChange(...)dariRotationPolicyatauDeviceStateAutoRotateSettingManager.
- Gunakan
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 setelanDEVICE_STATE_ROTATION_LOCK. Class ini menyediakan metode untuk memperbarui setelan, mengambil nilainya, dan mendaftarkan pemroses untuk perubahan.DeviceStateAutoRotateSettingController(Pengelola Jendela): MenyinkronkanACCELEROMETER_ROTATIONdanDEVICE_STATE_ROTATION_LOCK. Saat postur perangkat berubah,ACCELEROMETER_ROTATIONdiperbarui berdasarkan preferensi pengguna untuk status baru. Hal ini memastikan bahwa setiap perubahan padaACCELEROMETER_ROTATIONdisimpan kembali keDEVICE_STATE_ROTATION_LOCKuntuk postur perangkat saat ini dan dengan cara yang serupa, perubahan padaDEVICE_STATE_ROTATION_LOCKuntuk postur saat ini tercermin dalamACCELEROMETER_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.