Supporto dell'editor del metodo di immissione

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

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:

  1. Una nuova connessione di input proviene dal campo di immissione sul display B.
  2. InputMethodManagerService controlla se la connessione deve essere approvata.
  3. 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.
  4. 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 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 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 in ViewRootImpl#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 in InputMethodService#attachToken(). Questo chiama ViewGroup#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 da WindowProcessController 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 dopo onConfigurationChanged() e la chiamata ViewGroup#addView() per reinizializzare la vista di input.