Eingaberouting

In Android 9 und niedriger gab es keine Möglichkeit, mit mehreren Displays per Touch zu interagieren, da es keinen Zuordnungsmechanismus zwischen Displays und Eingabegeräten gab. Beispielsweise könnte ein Touchscreen-Display einen HDMI-Videoausgang (der sich unter Android als Display registrieren würde) und einen USB-Ausgang für den Touchscreen (der als Eingabegerät registriert würde) bereitstellen. Wenn mehrere Geräte auf diese Weise verbunden wären, wäre es nicht möglich festzustellen, welches Eingabegerät zu welchem ​​Display gehört. Das gleiche Problem gilt für faltbare Geräte mit mehreren integrierten Displays.

Android 10 hat einen Mechanismus hinzugefügt, um anzugeben, welche Eingabegeräte zu welchen Displays gehören. Die Zuordnung erfolgt über Portnummern, wobei sich Port auf den physischen Port bezieht, an den ein Display angeschlossen ist.

Wenn ein Android-Gerät beispielsweise über zwei HDMI-Anschlüsse mit der Bezeichnung hdmi1 und hdmi2 verfügt, könnten die Display-Port-Werte 1 und 2 lauten. Die Portwerte bleiben auch dann gleich, wenn ein anderes Display (z. B. ein anderes Displaymodell oder ein anderer Hersteller) an denselben physischen HDMI-Port angeschlossen wird. Dadurch können Gerätehersteller Anweisungen zum Zusammenbau und Aufrüsten von Displays bereitstellen.

Die Zuordnung wird in /vendor/etc/input-port-associations.xml konfiguriert. Zum Beispiel:

<ports>
    <port display="0" input="usb-xhci-hcd.0.auto-1.1/input0" />
    <port display="1" input="usb-xhci-hcd.0.auto-1.2/input0" />
</ports>

Im obigen Beispiel gibt display="0" den Port an, an den das Display angeschlossen ist. input="usb-xhci-hcd.0.auto-1.1/input0" gibt den Port an, an dem das Eingabegerät angeschlossen ist. Um die Ports zu ermitteln, die bestimmten Geräten zugeordnet sind, verwenden Sie den folgenden Terminalbefehl und überprüfen Sie dann die location dieser Geräte im Event Hub-Status.

adb shell dumpsys input

Wenn viele Geräte angeschlossen sind, tippen Sie auf ein bestimmtes Gerät, um das RecentQueue Array im Input Dispatcher State zu untersuchen. Anschließend können Sie die Geräte identifizieren, die das letzte Ereignis generiert haben. Anschließend finden Sie das entsprechende Gerät im Event Hub State.

Um die den angeschlossenen Displays zugewiesenen Display-Ports zu ermitteln, verwenden Sie adb shell dumpsys display und suchen Sie dann unter Display Devices nach der address von DisplayDeviceInfo für jedes Display. Alternativ können Sie adb shell dumpsys SurfaceFlinger --display-id verwenden, um Identifikationsinformationen für alle angeschlossenen Displays auszugeben. Siehe auch Statische Anzeigekennungen .

Wenn Sie eine Zuordnung für ein bestimmtes Eingabegerät angeben und die entsprechende Anzeige nicht im System vorhanden ist, wird das Eingabegerät deaktiviert, bis die entsprechende Anzeige erscheint. Die Zuordnung wird nur für Touch-Geräte durchgeführt.

Routing für dynamische Multi-Displays

Mit Android 10 können Sie statische Multi-Display-Geräte einrichten. Dynamische Zuordnungen sind noch nicht aktiviert. Einige Anwendungsfälle können jedoch gelöst werden, indem Routing-Informationen für Displays und Eingabefelder bereitgestellt werden, die nicht immer vorhanden sind, oder virtuelle Eingabegeräte verwendet werden und diesen virtuellen Geräten dann zusätzliche Routing-Informationen bereitgestellt werden. Wenn eine Geräteimplementierung Folgendes unterstützt:

  • Desktop-ähnliches Erlebnis mit einer Dockingstation, dann könnte eine Routing-Konfiguration bereitgestellt werden, um die Eingabe vom Eingabezubehör, das mit der Dockingstation verbunden ist (eindeutig durch den Port identifiziert), an das externe Display (identifiziert durch den Port) zu richten.
  • Der primäre Bildschirm fungiert als Eingabequelle (z. B. ein Touchpad), wenn er mit dem externen Display verbunden ist. Dann könnte eine Routing-Konfiguration bereitgestellt werden, um die Eingabe vom virtuellen Touchpanel (identifiziert durch eine eindeutige virtuelle ID) an das externe Display (identifiziert durch den Port) zu richten. .

Implementierung

  • Bei physischen Geräten werden der Anschluss, an den das Eingabegerät angeschlossen ist, und der Anschluss, an den das Display angeschlossen ist, verwendet, um die Displays mit Touchscreens abzugleichen.
  • Die Zuordnungen werden in InputReaderConfiguration gespeichert.
  • TouchInputMapper.mViewport ist auf den Ansichtsbereich eingestellt, der dem für InputDevice.location angegebenen Port entspricht.
  • Wenn in der Zuordnungsdatei ein Eingabegeräte-Port angegeben ist und derzeit kein Ansichtsfenster mit einem passenden Anzeigeport vorhanden ist, ist das Eingabegerät an diesem Port deaktiviert.
  • Wenn für ein bestimmtes Eingabegerät kein Port angegeben ist, wird der Viewport gemäß den vorhandenen Regeln festgelegt.
  • In den Eingabetreibern sind keine Kerneländerungen erforderlich.
  • Die Eingabegeräte-Ports werden mithilfe des EVIOCGPHYS ioctl bestimmt.