Pembaruan yang dilakukan pada area khusus tampilan ini disediakan di bawah ini:
Android 10 mendukung keyboard perangkat lunak untuk aplikasi yang berjalan pada tampilan non-default.
Aplikasi berjalan pada tampilan non-default
Dalam hal tampilan yang menunjukkan keyboard perangkat lunak Editor Metode Input (IME), ada dua mode berbeda. Keyboard perangkat lunak ditampilkan pada:
- Tampilan yang sama di mana aplikasi yang difokuskan muncul.
- Tampilan default saat aplikasi yang difokuskan berjalan pada tampilan non-default.
Sistem menentukan mode mana yang akan digunakan berdasarkan pengaturan tampilan tempat aplikasi fokus muncul. Untuk lebih jelasnya, lihat:
-
DisplayWindowSettings#shouldShowImeLocked()
-
DisplayWindowSettings#setShouldShowImeLocked()
Gambar 1. Keyboard perangkat lunak IME seperti yang muncul di layar sekunder, termasuk aplikasi target
Sistem menggunakan satu IME, tetapi dapat berpindah antar tampilan untuk mengikuti fokus pengguna. Android 10 secara otomatis mengharapkan semua IME pihak pertama dan ketiga untuk merevisi tata letak dan mengubah ukuran sesuai dengan ukuran tampilan baru saat dibuat.
Jika ada koneksi aktif pada tampilan A, dan bidang input meminta fokus input pada tampilan B, maka aliran berikut terjadi:
- Sambungan input baru berasal dari bidang input pada tampilan B.
-
InputMethodManagerService
memeriksa apakah koneksi harus disetujui. - Tampilan dipilih untuk IME. Jika tampilan B mendukung menampilkan IME dan diizinkan untuk menampilkannya, maka B digunakan. Jika tidak, tampilan perangkat utama akan dipilih.
- Jika tampilan yang dipilih bukan dari tampilan A, maka koneksi dibuat kembali.
InputMethodService
dihancurkan dan kemudian dibuat lagi.
Pembatasan keamanan
Sistem tidak akan menampilkan IME pada tampilan virtual yang tidak dimiliki oleh sistem. Ini karena masalah keamanan bahwa aplikasi jahat dapat membuat tampilan virtual dengan Dukungan Dekorasi Sistem yang diaktifkan dan membaca informasi sensitif pengguna dari permukaan, seperti prediksi pengetikan dan latar belakang khusus.
Penerapan
Di Android 9 (dan lebih rendah), IME hanya tersedia di layar default, seperti yang dijelaskan dalam metode Input di Layar . Di Android 10 (dan lebih tinggi), pengguna dapat beralih di antara bidang teks input yang berbeda pada tampilan yang berbeda dengan mengalihkan fokus, dan jendela IME berpindah ke tampilan sekunder.
Implementasi di WindowManager
melacak jendela metode input (jendela IME tempat keyboard lunak digambar) dan target metode input (jendela tempat input IME berjalan) untuk mengelola status IME.
Untuk InputMethodManagerService
(IMMS), tidak ada mekanisme bawaan lain yang dapat menyebarkan 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 tampilan, Android 10 mengimplementasikan hal berikut:
- IME dan jendela target input sekarang dilacak per tampilan di
DisplayContent#mInputMethodWindow
danDisplayContent#mInputMethodTarget
, sehingga WindowManager (WM) dapat mengelola status fokus IME secara independen dari setiap tampilan. - Di sisi IMMS, ketika permintaan fokus klien aplikasi dari tampilan eksternal diterima melalui
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, itu pertama-tama melepaskan layanan metode input saat ini dan kemudian mengikat kembali layanan baru ke IME token jendela untuk tampilan eksternal dionServiceConnected()
. - Di sisi IMS, setelah
IMS#attachToken
diterima, terjadi alur berikut:-
ContextImpl#updateDisplay
dipanggil untuk memperbarui tampilan konteks layanan diInputMethodService#attachToken()
. Ini memanggilViewGroup#addView()
untuk merevisi tata letak keyboard dan beradaptasi dengan tampilan target yang memeriksa konteks saat ini. - Setelah
DisplayContent#setInputMethodWindowLocked()
dipanggil, implementasi mengirimkan perubahan konfigurasi tampilan tingkat proses menggunakan prosesWindowProcessController
ke IME untuk mengganti sumber daya dan metrik tampilan. - Klien
InputMethodService
mendapatkan konfigurasi yang benar dengan metrik tampilan yang benar setelah panggilanonConfigurationChanged()
danViewGroup#addView()
untuk menginisialisasi ulang tampilan input.
-
Dukungan Editor Metode Input multi-sesi
Implementasi perangkat dengan beberapa tampilan yang diharapkan dapat digunakan secara bersamaan oleh banyak pengguna untuk menyediakan sumber input yang sesuai dapat dikonfigurasi untuk secara bersamaan menampilkan beberapa editor metode input (IME), paling banyak satu per tampilan. Dua gambar berikut menunjukkan contoh IME multi-sesi pada dua tampilan:
Gambar 2. Contoh IME multi-sesi
Gambar 3. Contoh IME multi-sesi
Dukungan untuk fokus Per-tampilan merupakan prasyarat untuk fitur ini. Jika tidak, fitur ini tidak dapat diaktifkan. Karena batasan keamanan, batasan fokus per-tampilan membatasi fitur ini ke sebagian kecil perangkat.
Di Android 10, dukungan untuk IME multi-sesi diimplementasikan dengan layanan sistem terpisah dengan kumpulan API yang berbeda dan fungsionalitas yang dikurangi. IME multi-sesi tidak kompatibel dengan IME yang ada. Layanan multi-sesi atau satu-sesi dapat digunakan, tetapi tidak keduanya.
Tidak mungkin menggunakan IME Android yang sudah ada yang dibangun di atas kelas InputMethodService
karena asumsi bahwa satu klien IME dapat difokuskan pada saat yang sama dibuat sebelum Android IME API diperkenalkan di Android 1.5 dan banyak API publik di InputMethodService
telah sudah sangat bergantung pada asumsi itu. Namun, memperbarui kelas InputMethodService
untuk mendukung skenario multi-klien sulit karena:
- Melakukan hal itu akan menimbulkan kompleksitas yang tidak dapat diterima ke dalam
InputMethodService
, yang sudah sulit untuk dipertahankan. - Pengembang IME masih perlu memperbarui implementasinya untuk dapat mendukung permintaan paralel dari beberapa klien IME terfokus, yang mungkin memerlukan desain ulang nontrivial di pihak mereka (seperti dekoder masukan dan basis data riwayat pengetikan).
- Kasus penggunaan aktual untuk klien multi-IME diharapkan berkembang pesat, sehingga protokol baru tidak stabil dan belum siap untuk diekspos sebagai API publik.
Seperti IME sesi tunggal (reguler), kontrol untuk menampilkan IME pada tampilan individual dilakukan menggunakan DisplayWindowSettings
.
Ada contoh IME multi-sesi yang terletak di development/samples/MultiClientInputMethod
.
Untuk menguji IME multi-sesi:
- Setel
config_perDisplayFocusEnabled
ketrue
. - Jalankan perintah ini:
-
$ make -j MultiClientInputMethod
-
$ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
-
$ adb root
-
$ adb shell setprop persist.debug.multi_client_ime \
com.example.android.multiclientinputmethod/.MultiClientInputMethod -
$ adb reboot
-
- Coba beberapa skenario input teks.
Penerapan
Lihat MultiClientInputMethodManagerService
untuk detail implementasi.
Pembaruan yang dilakukan pada area khusus tampilan ini disediakan di bawah ini:
Android 10 mendukung keyboard perangkat lunak untuk aplikasi yang berjalan pada tampilan non-default.
Aplikasi berjalan pada tampilan non-default
Dalam hal tampilan yang menunjukkan keyboard perangkat lunak Editor Metode Input (IME), ada dua mode berbeda. Keyboard perangkat lunak ditampilkan pada:
- Tampilan yang sama di mana aplikasi yang difokuskan muncul.
- Tampilan default saat aplikasi yang difokuskan berjalan pada tampilan non-default.
Sistem menentukan mode mana yang akan digunakan berdasarkan pengaturan tampilan tempat aplikasi fokus muncul. Untuk lebih jelasnya, lihat:
-
DisplayWindowSettings#shouldShowImeLocked()
-
DisplayWindowSettings#setShouldShowImeLocked()
Gambar 1. Keyboard perangkat lunak IME seperti yang muncul di layar sekunder, termasuk aplikasi target
Sistem menggunakan satu IME, tetapi dapat berpindah antar tampilan untuk mengikuti fokus pengguna. Android 10 secara otomatis mengharapkan semua IME pihak pertama dan ketiga untuk merevisi tata letak dan mengubah ukuran sesuai dengan ukuran tampilan baru saat dibuat.
Jika ada koneksi aktif pada tampilan A, dan bidang input meminta fokus input pada tampilan B, maka aliran berikut terjadi:
- Sambungan input baru berasal dari bidang input pada tampilan B.
-
InputMethodManagerService
memeriksa apakah koneksi harus disetujui. - Tampilan dipilih untuk IME. Jika tampilan B mendukung menampilkan IME dan diizinkan untuk menampilkannya, maka B digunakan. Jika tidak, tampilan perangkat utama dipilih.
- Jika tampilan yang dipilih bukan dari tampilan A, maka koneksi dibuat kembali.
InputMethodService
dihancurkan dan kemudian dibuat lagi.
Pembatasan keamanan
Sistem tidak akan menampilkan IME pada tampilan virtual yang tidak dimiliki oleh sistem. Ini karena masalah keamanan bahwa aplikasi jahat dapat membuat tampilan virtual dengan Dukungan Dekorasi Sistem yang diaktifkan dan membaca informasi sensitif pengguna dari permukaan, seperti prediksi pengetikan dan latar belakang khusus.
Penerapan
Di Android 9 (dan lebih rendah), IME hanya tersedia di layar default, seperti yang dijelaskan dalam metode Input di Layar . Di Android 10 (dan lebih tinggi), pengguna dapat beralih di antara bidang teks input yang berbeda pada tampilan yang berbeda dengan mengalihkan fokus, dan jendela IME berpindah ke tampilan sekunder.
Implementasi di WindowManager
melacak jendela metode input (jendela IME tempat keyboard lunak digambar) dan target metode input (jendela tempat input IME berjalan) untuk mengelola status IME.
Untuk InputMethodManagerService
(IMMS), tidak ada mekanisme bawaan lain yang dapat menyebarkan 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 tampilan, Android 10 mengimplementasikan hal berikut:
- IME dan jendela target input sekarang dilacak per tampilan di
DisplayContent#mInputMethodWindow
danDisplayContent#mInputMethodTarget
, sehingga WindowManager (WM) dapat mengelola status fokus IME secara independen dari setiap tampilan. - Di sisi IMMS, ketika permintaan fokus klien aplikasi dari tampilan eksternal diterima melalui
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, itu pertama-tama melepaskan layanan metode input saat ini dan kemudian mengikat kembali layanan baru ke IME token jendela untuk tampilan eksternal dionServiceConnected()
. - Di sisi IMS, setelah
IMS#attachToken
diterima, terjadi alur berikut:-
ContextImpl#updateDisplay
dipanggil untuk memperbarui tampilan konteks layanan diInputMethodService#attachToken()
. Ini memanggilViewGroup#addView()
untuk merevisi tata letak keyboard dan beradaptasi dengan tampilan target yang memeriksa konteks saat ini. - Setelah
DisplayContent#setInputMethodWindowLocked()
dipanggil, implementasi mengirimkan perubahan konfigurasi tampilan tingkat proses menggunakan prosesWindowProcessController
ke IME untuk mengganti sumber daya dan metrik tampilan. - Klien
InputMethodService
mendapatkan konfigurasi yang benar dengan metrik tampilan yang benar setelah panggilanonConfigurationChanged()
danViewGroup#addView()
untuk menginisialisasi ulang tampilan input.
-
Dukungan Editor Metode Input multi-sesi
Implementasi perangkat dengan beberapa tampilan yang diharapkan dapat digunakan secara bersamaan oleh banyak pengguna untuk menyediakan sumber input yang sesuai dapat dikonfigurasi untuk secara bersamaan menampilkan beberapa editor metode input (IME), paling banyak satu per tampilan. Dua gambar berikut menunjukkan contoh IME multi-sesi pada dua tampilan:
Gambar 2. Contoh IME multi-sesi
Gambar 3. Contoh IME multi-sesi
Dukungan untuk fokus Per-tampilan merupakan prasyarat untuk fitur ini. Jika tidak, fitur ini tidak dapat diaktifkan. Karena batasan keamanan, batasan fokus per-tampilan membatasi fitur ini ke sebagian kecil perangkat.
Di Android 10, dukungan untuk IME multi-sesi diimplementasikan dengan layanan sistem terpisah dengan kumpulan API yang berbeda dan fungsionalitas yang dikurangi. IME multi-sesi tidak kompatibel dengan IME yang ada. Layanan multi-sesi atau satu-sesi dapat digunakan, tetapi tidak keduanya.
Tidak mungkin menggunakan IME Android yang sudah ada yang dibangun di atas kelas InputMethodService
karena asumsi bahwa satu klien IME dapat difokuskan pada saat yang sama dibuat sebelum Android IME API diperkenalkan di Android 1.5 dan banyak API publik di InputMethodService
telah sudah sangat bergantung pada asumsi itu. Namun, memperbarui kelas InputMethodService
untuk mendukung skenario multi-klien sulit karena:
- Melakukan hal itu akan menimbulkan kompleksitas yang tidak dapat diterima ke dalam
InputMethodService
, yang sudah sulit untuk dipertahankan. - Pengembang IME masih perlu memperbarui implementasinya untuk dapat mendukung permintaan paralel dari beberapa klien IME terfokus, yang mungkin memerlukan desain ulang nontrivial di pihak mereka (seperti dekoder masukan dan basis data riwayat pengetikan).
- Kasus penggunaan aktual untuk klien multi-IME diharapkan berkembang pesat, sehingga protokol baru tidak stabil dan belum siap untuk diekspos sebagai API publik.
Seperti IME sesi tunggal (reguler), kontrol untuk menampilkan IME pada tampilan individual dilakukan menggunakan DisplayWindowSettings
.
Ada contoh IME multi-sesi yang terletak di development/samples/MultiClientInputMethod
.
Untuk menguji IME multi-sesi:
- Setel
config_perDisplayFocusEnabled
ketrue
. - Jalankan perintah ini:
-
$ make -j MultiClientInputMethod
-
$ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
-
$ adb root
-
$ adb shell setprop persist.debug.multi_client_ime \
com.example.android.multiclientinputmethod/.MultiClientInputMethod -
$ adb reboot
-
- Coba beberapa skenario input teks.
Penerapan
Lihat MultiClientInputMethodManagerService
untuk detail implementasi.