Memutar saran

Di Android 8.0, pengguna dapat beralih antara mode putar otomatis dan putar potret menggunakan kartu Setelan cepat atau setelan Tampilan. Di Android 9, kami memperbarui mode rotasi potret untuk menghilangkan rotasi yang tidak disengaja dengan menyematkan rotasi layar saat ini meskipun posisi perangkat berubah. Pengguna dapat memicu rotasi secara manual jika diperlukan dengan menekan tombol baru di menu navigasi. Kami mengganti nama mode potret menjadi kunci rotasi dan mode ini akan aktif saat putar otomatis dinonaktifkan. Tidak ada perubahan pada mode putar otomatis.

Saat perangkat dalam mode kunci rotasi, pengguna dapat mengunci layar ke rotasi apa pun yang didukung oleh Aktivitas atas yang terlihat (mengingat batasan sistem saat ini). Jika Aktivitas teratas dapat dirender dalam beberapa rotasi dalam mode putar otomatis, opsi yang sama akan tersedia dalam mode rotasi terkunci, dengan beberapa pengecualian berdasarkan setelan screenOrientation Aktivitas.

Mode kunci rotasi berfungsi dengan menampilkan tombol di menu navigasi saat perubahan rotasi perangkat. Untuk melakukannya, sensor orientasi perangkat harus tetap aktif meskipun rotasi otomatis dinonaktifkan. Mengetuk tombol ini secara efektif menetapkan preferensi rotasi pengguna (Settings.System.USER_ROTATION). WindowManager menggunakan preferensi ini, bersama dengan detail lain tentang Aktivitas teratas dan status sistem, untuk mengubah rotasi sistem. WindowManager terus menggunakan preferensi rotasi pengguna saat menentukan rotasi yang akan merender sistem saat berpindah ke Aktivitas lain.

GIF ini menampilkan ponsel dalam orientasi lanskap dengan layar dalam
       orientasi potret. Ikon akan muncul untuk menanyakan kepada pengguna apakah mereka ingin
       mengubah orientasi layar menjadi lanskap.
Gambar 1. Memutar tombol saran dengan gestur "Geser ke atas pada tombol Layar utama" diaktifkan

Preferensi rotasi pengguna harus dipertahankan saat berpindah antar-Aktivitas. Namun, karena sebagian besar pengguna ponsel hanya ingin menggunakan mode lanskap dalam jangka waktu singkat dan sementara, kami menambahkan bias orientasi natural. Preferensi rotasi pengguna direset ke orientasi alami perangkat setiap kali rotasi sistem berubah ke orientasi alami perangkat. Untuk sebagian besar ponsel, orientasi alami perangkat adalah potret (0º). Mereset preferensi rotasi pengguna sering terjadi saat menggunakan aplikasi khusus potret, mengunci ponsel, atau kembali ke ruang kerja peluncur.

Interaksi rotasi untuk pengguna tidak banyak berubah dalam satu dekade terakhir. Pengguna mungkin merasa sulit menemukan fitur ini mengingat histori mereka sebelumnya dengan rotasi dan posisi tombol di menu navigasi. Oleh karena itu, kami telah menambahkan mode pengantar ke tombol putar yang menandainya saat muncul. Perilaku mode pengantar hanya terjadi untuk beberapa interaksi tombol pertama, setelah itu mode pengantar dinonaktifkan.

Sumber

Dukungan untuk saran rotasi telah ditambahkan ke Android 9. Sebagian besar perubahan terdapat dalam file berikut.

  • services/.../server/policy/PhoneWindowManager.java:
    • Hook yang menggunakan output WindowOrientationListener (MyOrientationListener, bertanggung jawab untuk memantau sensor guna menentukan apakah perangkat telah diputar)
    • Mempertahankan WindowOrientationListener aktif meskipun rotasi otomatis dinonaktifkan (lihat needSensorRunningLp())
    • Menghitung rotasi sistem berdasarkan preferensi rotasi pengguna, setelan screenOrientation Aktivitas teratas, dan status sistem (lihat rotationForOrientationLw())
    • Menentukan apakah Aktivitas atas dapat diputar ke rotasi tertentu (lihat isRotationChoicePossible())
  • SystemUI/.../statusbar/phone/NavigationBarFragment:
    • Menentukan apakah tombol menu navigasi harus ditampilkan pada callback saran rotasi dari PhoneWindowManager (lihat onRotationProposal())
    • Menangani kapan harus menyembunyikan tombol menu navigasi putar (lihat panggilan ke setRotateSuggestionButtonState(false))
    • Menangani waktu tunggu tombol, termasuk kasus khusus saat navbar disembunyikan (biasanya dalam layar penuh)
    • Mereset preferensi pengguna saat kembali ke orientasi alami perangkat (mRotationWatcher)
    • Memilih gaya yang sesuai untuk animasi tombol menu navigasi, yang diterapkan di NavigationBarView (lihat onRotationProposal())
    • Menambahkan logika mode pengantar, termasuk animasi khusus (lihat referensi ke Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED)
    • Menerapkan flag rotasi disable2 (lihat disable())
  • SystemUI/.../statusbar/phone/NavigationBarView.java:
    • Animasi ikon tombol gaya agar sesuai dengan rotasi yang tertunda (lihat updateRotateSuggestionButtonStyle())
    • Menangani perubahan visibilitas tombol (lihat setRotateButtonVisibility()), termasuk logika untuk menyembunyikan tombol putar jika layanan Aksesibilitas tertentu aktif (mempertimbangkan peringkat stack tombol menu samping paling kanan)
  • SystemUI/res/layout/menu_ime.xml:
    • Mencakup KeyButtonView baru untuk tombol putar, yang ditumpuk di atas menu dan pemilih IME/keyboard, tetapi di bawah tombol Aksesibilitas
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml:
    • AnimatedVectorDrawable kompleks yang digunakan untuk menganimasikan tombol menu navigasi putar
    • Gaya visual (di SystemUI/res/values/styles.xml) digunakan untuk menetapkan sudut awal dan akhir rotasi sehingga drawable yang sama dapat digunakan untuk menganimasikan berbagai rotasi awal dan akhir
    • Tinta ikon ditetapkan melalui TintedKeyButtonDrawable

Implementasi

Android 9 menyertakan semua perubahan yang diperlukan agar saran rotasi berfungsi untuk perangkat yang menggunakan tombol navigasi software (kembali, layar utama, dll.).

Produsen perangkat yang membuat perangkat dengan tombol navigasi hardware yang ingin menerapkan fitur ini harus mendesain dan menerapkan affordance UI Sistem mereka sendiri atau menonaktifkan fitur tersebut. Sebaiknya platform yang diperkenalkan mudah digunakan saat perangkat dipegang pada 90º atau 180º terhadap rotasi sistem saat ini dan dapat diakses dengan cepat. Oleh karena itu, penggunaan notifikasi (seperti yang dilakukan untuk pemilih IME/keyboard) tidak direkomendasikan.

Persyaratan hardware untuk menggunakan fitur ini sama dengan persyaratan untuk menggunakan putar otomatis.

Untuk konsistensi penerapan, preferensi rotasi pengguna (Settings.System.USER_ROTATION) harus direset ke rotasi alami perangkat saat sistem berubah ke rotasi alami perangkat karena alasan apa pun saat putar otomatis dinonaktifkan. Penerapan yang disediakan akan melakukannya (lihat NavigationBarFragment.mRotationWatcher).

Ada tanda baru di StatusBarManager.disable2 untuk sementara mencegah saran rotasi muncul. Lihat StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS. Flag ini harus dipatuhi dalam semua implementasi karena digunakan oleh aplikasi sistem penting, termasuk Wizard Penyiapan. Implementasi yang disediakan mendukung hal ini (lihat NavigationBarFragment.disable()).

Sebaiknya aktifkan fitur ini dan ikuti penerapan AOSP, jika memungkinkan. Kami ingin pengalaman rotasi tetap serupa di antara perangkat, yang mencerminkan keseragaman pengalaman di sebagian besar ponsel saat ini antara putar otomatis dan kunci potret.

Penyesuaian

Karena saran rotasi hanya muncul dalam mode rotasi terkunci (rotasi otomatis nonaktif), Anda dapat memilih apakah fitur tersebut diaktifkan secara default untuk penginstalan baru dengan memilih untuk menonaktifkan rotasi otomatis secara default. Lihat def_accelerometer_rotation di SettingsProvider/res/values/defaults.xml untuk membuat perubahan default.

Pengguna dapat dengan mudah mengubah apakah putar otomatis aktif atau tidak (terlepas dari setelan default) melalui kartu putar di Setelan cepat atau Setelan tampilan.

Validasi

Untuk pengujian, fitur ini dapat dinonaktifkan dan diaktifkan dengan mengubah nilai Settings.Secure pembatasan. Hal ini paling mudah dilakukan dengan menjalankan perintah berikut dari instance adb dengan hak istimewa:

adb shell settings put secure show_rotation_suggestions <x>

Tetapkan x ke 0 untuk nonaktif dan 1 untuk aktif.

Untuk pengujian, mode pengantar dapat direset dengan mengubah nilai Settings.Secure terkait. Hal ini paling mudah dilakukan dengan menjalankan perintah berikut dari instance adb dengan hak istimewa:

adb shell settings put secure num_rotation_suggestions_accepted 0