Di seguito sono riportati gli aggiornamenti apportati a queste aree specifiche per i display:
- App eseguite 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 visualizzazione su cui viene visualizzata l'app con lo stato attivo.
- Display predefinito mentre l'app con lo stato attivo è in esecuzione su un display non predefinito.
- Nessuna visualizzazione.
Il sistema determina quale modalità utilizzare in base alle impostazioni del display su cui viene visualizzata l'app attiva. Per ulteriori dettagli, consulta:
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 le dimensioni 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.- Viene selezionata una visualizzazione per l'IME. Se il display B supporta la visualizzazione dell'IME e è 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 eliminato e 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 la destinazione 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 viene ora 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()
. Questo chiamaViewGroup#addView()
per rivedere il layout della tastiera e adattarsi al display di destinazione controllando il contesto corrente.- Dopo aver chiamato
DisplayContent#setInputMethodWindowLocked()
, l'implementazione invia modifiche alla configurazione di visualizzazione a livello di processo utilizzando il processo daWindowProcessController
a IME per eseguire l'override delle risorse e visualizzare le metriche. - Il client
InputMethodService
riceve la configurazione corretta con le metriche di visualizzazione corrette dopoonConfigurationChanged()
e la chiamataViewGroup#addView()
per reinizializzare la vista di input.