Pembaruan yang dilakukan pada area khusus tampilan tersebut tercantum di bawah:
Android 10 mendukung keyboard virtual untuk aplikasi yang berjalan di layar non-default.
Aplikasi yang berjalan di layar non-default
Dalam hal layar yang menampilkan keyboard software Input Method Editor (IME), ada berbagai mode. Keyboard software ditampilkan di:
- Tampilan sama tempat aplikasi yang difokuskan muncul.
- Tampilan Default saat aplikasi yang difokuskan berjalan di layar non-default.
- Tidak ada tampilan sama sekali.
Sistem menentukan mode yang akan digunakan berdasarkan setelan layar tempat aplikasi yang difokuskan muncul. Untuk mengetahui detail selengkapnya, lihat:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
Gambar 1. Keyboard software IME seperti yang muncul di layar sekunder, termasuk aplikasi target
Sistem menggunakan satu IME, tetapi dapat beralih di antara layar untuk mengikuti fokus pengguna. Android 10 secara otomatis mengharapkan semua IME pihak pertama dan ketiga merevisi tata letak dan mengubah ukuran sesuai dengan ukuran tampilan baru saat dibuat.
Jika ada koneksi aktif di layar A, dan kolom input meminta fokus input di layar B, alur berikut akan terjadi:
- Koneksi input baru berasal dari kolom input di layar B.
InputMethodManagerService
akan memeriksa apakah koneksi harus disetujui.- Tampilan dipilih untuk IME. Jika layar B mendukung tampilan IME dan diizinkan untuk menampilkannya, B akan digunakan. Jika tidak, tampilan perangkat utama akan dipilih.
- Jika layar yang dipilih bukan dari layar A, koneksi akan
dibuat ulang.
InputMethodService
dihancurkan, lalu dibuat lagi.
Pembatasan keamanan
Sistem tidak akan menampilkan IME di layar virtual yang tidak dimiliki oleh sistem. Hal ini disebabkan oleh masalah keamanan bahwa aplikasi berbahaya dapat membuat layar virtual dengan dukungan dekorasi sistem yang diaktifkan dan membaca informasi sensitif pengguna dari platform, seperti prediksi pengetikan dan latar belakang kustom.
Implementasi
Di Android 9 (dan yang lebih lama), IME hanya tersedia di layar default, seperti yang dijelaskan dalam Metode Input di Layar. Di Android 10 (dan yang lebih tinggi), pengguna dapat beralih di antara kolom teks input yang berbeda pada tampilan yang berbeda dengan beralih fokus, dan jendela IME berpindah ke tampilan sekunder.
Implementasi di WindowManager
melacak jendela metode input (jendela IME tempat keyboard virtual digambar) dan target metode input (jendela tempat input IME ditempatkan) untuk mengelola status IME.
Untuk InputMethodManagerService
(IMMS), tidak ada mekanisme bawaan lain yang dapat
menerapkan perubahan tampilan ke InputMethodService
(IMS) dan
mengonfigurasi ulang tata letak keyboard saat runtime saat memindahkan fokus ke tampilan lain.
Untuk mencapai peralihan jendela IME di antara layar, Android 10 menerapkan hal berikut:
- Jendela target input dan IME kini dilacak per tampilan di
DisplayContent#mInputMethodWindow
danDisplayContent#mInputMethodTarget
, sehingga WindowManager (WM) dapat mengelola status fokus IME secara independen dari setiap tampilan. - Di sisi IMMS, saat permintaan fokus klien aplikasi dari layar eksternal
diterima melalui
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, klien akan terlebih dahulu membatalkan pengikatan layanan metode input saat ini, lalu mengikat ulang layanan untuk memasang kembali token jendela IME baru untuk layar eksternal dionServiceConnected()
. - Di sisi IMS, setelah
IMS#attachToken
diterima, alur berikut akan terjadi:ContextImpl#updateDisplay
dipanggil untuk memperbarui tampilan konteks layanan diInputMethodService#attachToken()
. Tindakan ini memanggilViewGroup#addView()
untuk merevisi tata letak keyboard dan beradaptasi dengan tampilan target yang memeriksa konteks saat ini.- Setelah
DisplayContent#setInputMethodWindowLocked()
dipanggil, implementasi akan mengirimkan perubahan konfigurasi tampilan tingkat proses menggunakan prosesWindowProcessController
ke IME guna mengganti resource dan metrik tampilan. - Klien
InputMethodService
mendapatkan konfigurasi yang benar dengan metrik tampilan yang benar setelahonConfigurationChanged()
dan panggilanViewGroup#addView()
untuk melakukan inisialisasi ulang tampilan input.