Gli aggiornamenti apportati a queste aree specifiche del display sono forniti di seguito:
- App in esecuzione su un display non predefinito
- Supporto per l'editor del metodo di input 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
In termini di quale display mostra la tastiera software dell'Input Method Editor (IME), esistono diverse modalità. La tastiera software viene visualizzata su:
- Lo stesso display su cui appare l'app focalizzata.
- Visualizzazione predefinita mentre l'app focalizzata è in esecuzione su un display non predefinito.
- Nessuna visualizzazione.
Il sistema determina quale modalità utilizzare in base alle impostazioni del display su cui appare l'app focalizzata. Per maggiori dettagli vedere:
-
WindowManager#setDisplayImePolicy()
-
WindowManager#getDisplayImePolicy()
Figura 1. Tastiera software IME come appare sul display secondario, inclusa l'app di destinazione
Il sistema utilizza un singolo IME, ma può spostarsi tra i display per seguire l'attenzione dell'utente. Android 10 prevede automaticamente che tutti gli IME proprietari e di terze parti rivedano il layout e si ridimensionino in base alle nuove dimensioni di visualizzazione una volta create.
Se è presente una connessione attiva sul display A e un campo di input richiede il focus dell'input sul display B, si verifica il seguente flusso:
- Una nuova connessione di ingresso proviene dal campo di immissione 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 ed è autorizzato a mostrarlo, viene utilizzato B. Altrimenti viene selezionato il display del dispositivo principale.
- Se il display selezionato non appartiene al display A, la connessione verrà ristabilita.
InputMethodService
viene distrutto e quindi creato di nuovo.
Restrizione di sicurezza
Il sistema non mostrerà un IME sui display virtuali che non sono di proprietà del sistema. Ciò è dovuto a un problema di sicurezza legato al fatto che un'app dannosa potrebbe creare un display virtuale con il supporto delle decorazioni di sistema abilitato e leggere informazioni sensibili dell'utente dalla superficie, come previsioni di digitazione e 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 all'altro su diversi display spostando lo stato attivo 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 va l'input IME) per gestire lo stato dell'IME.
Per InputMethodManagerService
(IMMS), nessun altro meccanismo integrato può propagare la modifica del display 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 di attivazione dell'IME indipendentemente da ogni display. - Sul lato IMMS, quando la richiesta di focus di un client dell'app dal display esterno viene ricevuta tramite
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, prima separa il servizio del metodo di input corrente e quindi ricollega il servizio per ricollegare il nuovo IME token finestra per il display esterno inonServiceConnected()
. - Sul lato IMS, dopo la ricezione di
IMS#attachToken
, si verifica 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 alla visualizzazione di destinazione controllando il contesto corrente. - Dopo la chiamata
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 visualizzare le metriche. - Il client
InputMethodService
ottiene la configurazione corretta con le metriche di visualizzazione corrette dopo la chiamataonConfigurationChanged()
eViewGroup#addView()
per reinizializzare la vista di input.
-