Di seguito sono riportati gli aggiornamenti apportati a queste aree specifiche per il display:
- App in esecuzione su un display non predefinito
- Supporto dell'editor del metodo di input multiseduta
Android 10 supporta la tastiera software per le app eseguite su un display non predefinito.
App in esecuzione su un display non predefinito
Per quanto riguarda il display che mostra la tastiera software dell'Input Method Editor (IME), esistono diverse modalità. La tastiera software viene visualizzata su:
- Stessa visualizzazione in cui viene visualizzata l'app selezionata.
- Visualizzazione predefinita mentre l'app in primo piano è in esecuzione su un display non predefinito.
- Nessuna visualizzazione.
Il sistema determina la modalità da utilizzare in base alle impostazioni del display su cui viene visualizzata l'app in primo piano. Per ulteriori dettagli, vedi:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
Figura 1. Tastiera software IME visualizzata sul display secondario, inclusa l'app di destinazione
Il sistema utilizza un'unica IME, ma può spostarsi tra i display per seguire lo stato attivo dell'utente. Android 10 prevede automaticamente che tutti gli IME di prima e terza parte rivedano il layout e ridimensionino in base alle nuove dimensioni del display al momento della creazione.
Se è presente una connessione attiva sul display A e un campo di input richiede il focus di input sul display B, si verifica il seguente flusso:
- Una nuova connessione di input proviene dal campo di input sul display B.
InputMethodManagerService
controlla se la connessione deve essere approvata.- Viene selezionato un display per l'IME. Se il display B supporta la visualizzazione dell'IME e è autorizzato a mostrarlo, viene utilizzato B. In caso contrario, viene selezionato il display del dispositivo principale.
- Se il display selezionato non è il display A, la connessione viene
ristabilita.
InputMethodService
viene eliminato e poi ricreato.
Limitazione di sicurezza
Il sistema non mostrerà un IME su display virtuali non di proprietà del sistema. Ciò è dovuto a un problema di sicurezza: un'app dannosa potrebbe creare un display virtuale con il supporto delle decorazioni di sistema abilitato e leggere informazioni sensibili dell'utente dalla superficie, ad esempio le previsioni di digitazione e gli sfondi personalizzati.
Implementazione
In Android 9 (e versioni precedenti), l'IME era disponibile solo nella schermata predefinita, come descritto in Metodi di input su schermo. In Android 10 e versioni successive, un utente può passare da un campo di testo di input all'altro su display diversi cambiando il focus e la finestra IME si sposta sui display secondari.
L'implementazione in WindowManager
tiene traccia della finestra del metodo di input (la finestra IME in cui viene disegnata la tastiera virtuale) e della destinazione del metodo di input (la finestra in cui viene inserito l'input IME) per gestire lo stato dell'IME.
Per InputMethodManagerService
(IMMS), nessun altro meccanismo integrato può
propagare la modifica della visualizzazione a InputMethodService
(IMS) e
riconfigurare il layout della tastiera in fase di runtime quando si sposta lo stato attivo su un altro display.
Per ottenere il passaggio della finestra IME tra i display, Android 10 implementa quanto segue:
- L'IME e la finestra di destinazione dell'input vengono ora monitorati per display in
DisplayContent#mInputMethodWindow
eDisplayContent#mInputMethodTarget
, in modo che WindowManager (WM) possa gestire lo stato attivo dell'IME indipendentemente da ogni display. - Sul lato IMMS, quando la richiesta di messa a fuoco di un client app dal display esterno
viene ricevuta tramite
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, viene prima annullato il binding del servizio di metodo di input corrente e poi viene eseguito nuovamente il binding del servizio per ricollegare il nuovo token della finestra IME per il display esterno inonServiceConnected()
. - Sul lato IMS, dopo aver ricevuto
IMS#attachToken
, si verifica il seguente flusso:ContextImpl#updateDisplay
viene chiamato per aggiornare la visualizzazione del contesto del servizio inInputMethodService#attachToken()
. Questa chiamataViewGroup#addView()
per rivedere il layout della tastiera e adattarlo al display di destinazione controllando il contesto attuale.- Dopo la chiamata di
DisplayContent#setInputMethodWindowLocked()
, l'implementazione invia le modifiche alla configurazione di visualizzazione a livello di processo utilizzandoWindowProcessController
al processo IME per ignorare le risorse e visualizzare le metriche. - Il client
InputMethodService
ottiene la configurazione corretta con le metriche di visualizzazione corrette dopoonConfigurationChanged()
e la chiamataViewGroup#addView()
per reinizializzare la visualizzazione dell'input.