Di seguito sono riportati gli aggiornamenti apportati a queste aree specifiche per i display:
- App in esecuzione su un display non predefinito
- Supporto dell'editor dei metodi di inserimento multisessione
Android 10 supporta la tastiera software per le app in esecuzione su un display non predefinito.
App in esecuzione su un display non predefinito
Esistono diverse modalità per quanto riguarda il display che mostra la tastiera software dell'editor di metodi di inserimento (IME). La tastiera software viene visualizzata su:
- Stessa schermata su cui viene visualizzata l'app attiva.
- Visualizzazione predefinita mentre l'app attiva è in esecuzione su una visualizzazione non predefinita.
- Nessuna visualizzazione.
Il sistema determina quale modalità utilizzare in base alle impostazioni del display su cui viene visualizzata l'app attiva. Per ulteriori dettagli, vedi:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
Figura 1. Tastiera software IME così come appare sul display secondario, inclusa l'app target
Il sistema utilizza un singolo IME, ma può passare da un display all'altro per seguire lo stato attivo dell'utente. Android 10 si aspetta automaticamente che tutti gli IME proprietari e di terze parti 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 immissione richiede il fuoco di immissione sul display B, si verifica il seguente flusso:
- Una nuova connessione di input proviene dal campo di immissione sul display B.
InputMethodManagerService
controlla se la connessione deve essere approvata.- È selezionato un display per l'IME. Se il display B supporta la visualizzazione dell'IME ed è autorizzato a farlo, viene utilizzato B. In caso contrario, viene selezionato il display del dispositivo principale.
- Se il display selezionato non è il display A, la connessione viene reintegrata.
InputMethodService
viene distrutto e poi creato di nuovo.
Limitazione di sicurezza
Il sistema non mostrerà un IME sui display virtuali che non sono di proprietà del sistema. Questo è 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 piattaforma, ad esempio le previsioni di battitura 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 sullo schermo. In Android 10 (e versioni successive), un utente può passare da un campo di testo di immissione all'altro su display diversi cambiando lo stato attivo e la finestra dell'IME si sposta sui display secondari.
L'implementazione in WindowManager
monitora la finestra del metodo di inserimento (la finestra dell'IME in cui viene disegnata la tastiera virtuale) e il target del metodo di inserimento (la finestra in cui viene inserito l'input dell'IME) per gestire lo stato dell'IME.
Per InputMethodManagerService
(IMMS), nessun altro meccanismo integrato può propagare la modifica del display a InputMethodService
(IMS) e ricollegare il layout della tastiera in fase di esecuzione quando si sposta lo stato attivo su un altro display.
Per consentire il passaggio della finestra dell'IME tra i display, Android 10 implementa quanto segue:
- La finestra di destinazione dell'IME e dell'input ora viene monitorata per display in
DisplayContent#mInputMethodWindow
eDisplayContent#mInputMethodTarget
, in modo che WindowManager (WM) possa gestire lo stato di messa a fuoco dell'IME indipendentemente da ogni display. - Sul lato IMMS, quando la richiesta di messa a fuoco di un client di app dal display esterno viene ricevuta tramite
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, viene prima sganciato il servizio di metodo di inserimento corrente e poi il servizio viene ricollegato per ricollegare il nuovo token finestra IME per il display esterno inViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
.onServiceConnected()
- Sul lato IMS, dopo la ricezione di
IMS#attachToken
, avviene il seguente flusso:ContextImpl#updateDisplay
viene chiamato per aggiornare la visualizzazione del contesto del servizio inInputMethodService#attachToken()
. Viene chiamatoViewGroup#addView()
per rivedere il layout della tastiera e adattarlo al display target controllando il contesto corrente.- Dopo l'esecuzione della chiamata a
DisplayContent#setInputMethodWindowLocked()
, l'implementazione invia le modifiche alla configurazione di visualizzazione a livello di processo utilizzandoWindowProcessController
al processo IME per eseguire l'override delle risorse e delle metriche di visualizzazione. - Il client
InputMethodService
ottiene la configurazione corretta con le metriche di visualizzazione corrette dopoonConfigurationChanged()
e la chiamataViewGroup#addView()
per reinizializzare la visualizzazione di input.