Supporto dell'editor di metodi di immissione

Di seguito sono riportati gli aggiornamenti apportati a queste aree specifiche per il display:

Android 10 supporta la tastiera su schermo 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 su schermo dell'Input Method Editor (IME), esistono diverse modalità. La tastiera su schermo viene visualizzata su:

  • Stessa visualizzazione in cui viene visualizzata l'app in primo piano.
  • Visualizzazione predefinita mentre l'app in primo piano è 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 in primo piano. Per ulteriori dettagli, vedi:

  • WindowManager#setDisplayImePolicy()
  • WindowManager#getDisplayImePolicy()

Figura 1. Tastiera su schermo IME visualizzata sul display secondario, inclusa l'app di destinazione

Il sistema utilizza un unico 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 di visualizzazione al momento della creazione.

Se è presente una connessione attiva sul display A e un campo di immissione richiede il focus di input sul display B, si verifica il seguente flusso:

  1. Una nuova connessione di input proviene dal campo di immissione sul display B.
  2. InputMethodManagerService controlla se la connessione deve essere approvata.
  3. È 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.
  4. 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 sullo 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 immissione (la finestra IME in cui viene disegnata la tastiera su schermo) e della destinazione del metodo di immissione (la finestra in cui viene inserito l'input IME) per gestire lo stato 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 cambio 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 e DisplayContent#mInputMethodTarget, in modo che WindowManager (WM) possa gestire lo stato di messa a fuoco dell'IME indipendentemente da ogni display.
  • Sul lato IMMS, quando una richiesta di messa a fuoco di un client app dal display esterno viene ricevuta tramite ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus, il servizio di metodo di input corrente viene prima scollegato e poi ricollegato per ricollegare il nuovo token della finestra IME per il display esterno in onServiceConnected().
  • 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 in InputMethodService#attachToken(). Questa chiamata ViewGroup#addView() per rivedere il layout della tastiera e adattarsi 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 utilizzando WindowProcessController al processo IME per ignorare le risorse e visualizzare le metriche.
    • Il client InputMethodService ottiene la configurazione corretta con le metriche di visualizzazione corrette dopo onConfigurationChanged() e la chiamata ViewGroup#addView() per reinizializzare la visualizzazione dell'input.