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 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:

  1. Una nuova connessione di input proviene dal campo di input sul display B.
  2. InputMethodManagerService controlla se la connessione deve essere approvata.
  3. 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.
  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 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 e DisplayContent#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 in onServiceConnected().
  • 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 in InputMethodService#attachToken(). Questa chiamata ViewGroup#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 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.