Les modifications apportées à ces zones spécifiques à l'affichage sont décrites ci-dessous :
- Applications s'exécutant sur un écran autre que celui par défaut
- Compatibilité avec l'éditeur de méthode d'entrée multisession
Android 10 est compatible avec le clavier logiciel pour les applications s'exécutant sur un écran autre que celui par défaut.
Applications s'exécutant sur un écran autre que celui par défaut
Il existe différents modes pour déterminer sur quel écran le clavier logiciel de l'éditeur de méthode de saisie (IME) s'affiche. Le clavier logiciel s'affiche sur :
- Même : l'application sélectionnée s'affiche sur le même écran.
- Affichage par défaut lorsque l'application sélectionnée s'exécute sur un écran autre que celui par défaut.
- Aucun affichage.
Le système détermine le mode à utiliser en fonction des paramètres de l'écran sur lequel l'application sélectionnée s'affiche. Pour en savoir plus, consultez :
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
Figure 1 : Clavier logiciel IME tel qu'il apparaît sur l'écran secondaire, y compris l'application cible
Le système utilise un seul IME, mais peut passer d'un écran à l'autre pour suivre l'attention de l'utilisateur. Android 10 s'attend automatiquement à ce que tous les IME propriétaires et tiers révisent la mise en page et redimensionnent l'écran en fonction de la nouvelle taille d'affichage lors de leur création.
Si une connexion est active sur l'écran A et qu'un champ de saisie demande le focus sur l'écran B, le flux suivant se produit :
- Une nouvelle connexion d'entrée provient du champ de saisie de l'écran B.
InputMethodManagerService
vérifie si la connexion doit être approuvée.- Un écran est sélectionné pour l'IME. Si l'écran B est compatible avec l'IME et est autorisé à l'afficher, il est utilisé. Sinon, l'écran de l'appareil principal est sélectionné.
- Si l'écran sélectionné n'est pas l'écran A, la connexion est rétablie.
InputMethodService
est détruit, puis recréé.
Restriction de sécurité
Le système n'affiche pas d'IME sur les écrans virtuels qui ne lui appartiennent pas. Cela est dû à un problème de sécurité : une application malveillante pourrait créer un écran virtuel avec la prise en charge des décorations système activée et lire des informations sensibles de l'utilisateur à partir de la surface, telles que les prédictions de saisie et les arrière-plans personnalisés.
Implémentation
Dans Android 9 (et versions antérieures), l'IME n'était disponible que sur l'écran par défaut, comme décrit dans Méthodes de saisie à l'écran. Dans Android 10 (et versions ultérieures), un utilisateur peut passer d'un champ de saisie de texte à un autre sur différents écrans en changeant de champ sélectionné. La fenêtre IME se déplace alors vers les écrans secondaires.
L'implémentation dans WindowManager
suit la fenêtre de méthode de saisie (la fenêtre IME où le clavier virtuel est dessiné) et la cible de méthode de saisie (la fenêtre où la saisie IME est effectuée) pour gérer l'état de l'IME.
Pour InputMethodManagerService
(IMMS), aucun autre mécanisme intégré ne peut propager le changement d'affichage à InputMethodService
(IMS) et reconfigurer la disposition du clavier au moment de l'exécution lorsque le focus est déplacé vers un autre écran.
Pour que la fenêtre IME puisse basculer entre les écrans, Android 10 implémente les éléments suivants :
- L'IME et la fenêtre cible de saisie sont désormais suivis par écran dans
DisplayContent#mInputMethodWindow
etDisplayContent#mInputMethodTarget
, afin que le WindowManager (WM) puisse gérer l'état de focus de l'IME indépendamment de chaque écran. - Du côté de l'IMMS, lorsqu'une requête de focus d'un client d'application provenant de l'écran externe est reçue via
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, le service de méthode de saisie actuel est d'abord dissocié, puis le service est associé de nouveau pour rattacher le nouveau jeton de fenêtre IME pour l'écran externe dansonServiceConnected()
. - Du côté de l'IMS, une fois le
IMS#attachToken
reçu, le flux suivant se produit :ContextImpl#updateDisplay
est appelé pour mettre à jour l'affichage du contexte de service dansInputMethodService#attachToken()
. Cela appelleViewGroup#addView()
pour réviser la mise en page du clavier et l'adapter à l'affichage cible en vérifiant le contexte actuel.- Une fois
DisplayContent#setInputMethodWindowLocked()
appelé, l'implémentation envoie les modifications de configuration d'affichage au niveau du processus à l'aide deWindowProcessController
au processus IME pour remplacer les ressources et afficher les métriques. - Le client
InputMethodService
obtient la configuration correcte avec les métriques d'affichage appropriées aprèsonConfigurationChanged()
et l'appelViewGroup#addView()
pour réinitialiser la vue d'entrée.