Unterstützung für den Editor für Eingabemethoden

Im Folgenden finden Sie die Änderungen an diesen anzeigespezifischen Bereichen:

Android 10 unterstützt die Softwaretastatur für Apps, die auf einem nicht standardmäßigen Bildschirm ausgeführt werden.

Apps, die auf einem nicht standardmäßigen Bildschirm ausgeführt werden

Es gibt verschiedene Modi, in denen die Softwaretastatur des Eingabemethoden-Editors (IME) auf dem Display angezeigt wird. Die Softwaretastatur wird an folgenden Stellen angezeigt:

  • Auf dem selben Display, auf dem die App angezeigt wird, auf die der Fokus gerichtet ist.
  • Standard-Display, während die App im Fokus auf einem anderen Display ausgeführt wird.
  • Kein Display.

Das System bestimmt anhand der Einstellungen des Displays, auf dem die App mit Fokus angezeigt wird, welcher Modus verwendet werden soll. Weitere Informationen finden Sie hier:

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

Abbildung 1: Softwaretastatur der Eingabemethode, wie sie auf dem sekundären Display angezeigt wird, einschließlich Ziel-App

Das System verwendet eine einzelne IME, kann aber zwischen den Displays wechseln, um dem Nutzerfokus zu folgen. Unter Android 10 wird automatisch davon ausgegangen, dass alle IMEs von Drittanbietern und von Google das Layout überarbeiten und die Größe entsprechend der neuen Displaygröße anpassen, wenn sie erstellt werden.

Wenn auf Display A eine aktive Verbindung besteht und ein Eingabefeld den Eingabefokus auf Display B anfordert, geschieht Folgendes:

  1. Eine neue Eingabeverbindung kommt vom Eingabefeld auf Display B.
  2. InputMethodManagerService prüft, ob die Verbindung genehmigt werden soll.
  3. Für den IME wird ein Display ausgewählt. Wenn Display B die Anzeige der IME unterstützt und sie anzeigen darf, wird B verwendet. Andernfalls wird das primäre Display des Geräts ausgewählt.
  4. Wenn das ausgewählte Display nicht zu Display A gehört, wird die Verbindung wiederhergestellt. InputMethodService wird gelöscht und dann wieder erstellt.

Sicherheitseinschränkung

Das System zeigt auf virtuellen Displays, die nicht dem System gehören, keine IME an. Das liegt an einem Sicherheitsrisiko: Eine schädliche App könnte ein virtuelles Display mit aktivierter Unterstützung für Systemdekorationen erstellen und vertrauliche Informationen des Nutzers von der Oberfläche lesen, z. B. Vorschläge zur Textvervollständigung und benutzerdefinierte Hintergründe.

Implementierung

Unter Android 9 und niedriger war die IME nur auf dem Standardbildschirm verfügbar, wie unter Eingabemethoden auf dem Bildschirm beschrieben. Unter Android 10 (und höher) kann ein Nutzer durch Wechseln des Fokus zwischen verschiedenen Eingabetextfeldern auf verschiedenen Displays wechseln. Das IME-Fenster wird dann auf die sekundären Displays verschoben.

Die Implementierung in WindowManager überwacht das Fenster der Eingabemethode (das IME-Fenster, in dem die Soft-Tastatur gezeichnet wird) und das Ziel der Eingabemethode (das Fenster, in das die IME-Eingabe erfolgt), um den IME-Status zu verwalten.

Bei InputMethodManagerService (IMMS) kann kein anderer integrierter Mechanismus die Displayänderung an InputMethodService (IMS) weitergeben und das Tastaturlayout zur Laufzeit neu konfigurieren, wenn der Fokus auf ein anderes Display verschoben wird.

Damit das IME-Fenster zwischen Displays wechseln kann, werden in Android 10 folgende Funktionen implementiert:

  • Das IME- und Eingabezielfenster werden jetzt in DisplayContent#mInputMethodWindow und DisplayContent#mInputMethodTarget pro Display erfasst, damit der WindowManager (WM) den IME-Fokusstatus unabhängig von jedem Display verwalten kann.
  • Wenn auf IMMS-Seite die Fokusanfrage eines App-Clients vom externen Display über ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus empfangen wird, wird zuerst die Bindung des aktuellen Eingabemethodendienstes aufgehoben und dann wieder hergestellt, um das neue IME-Fenstertoken für das externe Display in onServiceConnected() wieder zu verknüpfen.
  • Auf der IMS-Seite erfolgt nach dem Empfang von IMS#attachToken der folgende Ablauf:
    • ContextImpl#updateDisplay wird aufgerufen, um die Anzeige des Dienstkontexts in InputMethodService#attachToken() zu aktualisieren. Dadurch wird ViewGroup#addView() aufgerufen, um das Layout der Tastatur zu überarbeiten und an das Zieldisplay anzupassen. Dabei wird der aktuelle Kontext geprüft.
    • Nach dem Aufruf von DisplayContent#setInputMethodWindowLocked() sendet die Implementierung Änderungen der Anzeigekonfiguration auf Prozessebene über WindowProcessController an den IME-Prozess, um Ressourcen und Anzeigemesswerte zu überschreiben.
    • Der InputMethodService-Client erhält nach onConfigurationChanged() und dem ViewGroup#addView()-Aufruf die richtige Konfiguration mit den richtigen Anzeigemesswerten, um die Eingabeansicht neu zu initialisieren.