入力ルーティング

Android 9 以前は、ディスプレイと入力デバイスを関連付けるメカニズムがなかったため、タップで複数のディスプレイを操作することはできませんでした。たとえば、タッチスクリーン ディスプレイは、HDMI ビデオ出力(Android でディスプレイとして登録)とタッチスクリーン用 USB 出力(入力デバイスとして登録)を提供できましたが、複数のデバイスがこのように接続されている場合、どの入力デバイスがどのディスプレイに属しているかを判断することはできませんでした。複数の内蔵ディスプレイを備えた折りたたみ式デバイスにも同じ問題が当てはまります。

Android 10 では、どの入力デバイスがどのディスプレイに属しているかを指定するメカニズムが追加されました。関連付けはポート番号で行います(このポートはディスプレイが接続されている物理ポートを指します)。

たとえば、Android デバイスに hdmi1hdmi2 のラベルが付いた 2 つの HDMI ポートがある場合、ディスプレイ ポートの値は 12 です。同じ物理 HDMI ポートに別のディスプレイ(ディスプレイ モデルやメーカーが異なるなど)が接続されても、ポートの値は変わりません。これにより、デバイス メーカーはディスプレイのアセンブルとアップグレードの手順を提供できます。

関連付けは /vendor/etc/input-port-associations.xml で設定します。例:

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

上の例では、display="0" はディスプレイを接続するポートを指定します。input="usb-xhci-hcd.0.auto-1.1/input0" は、入力デバイスを接続するポートを指定します。特定のデバイスに関連付けられたポートを確認するには、次のターミナル コマンドを使用して、イベントハブ状態のデバイスの location プロパティを調べます。

adb shell dumpsys input

多くのデバイスが接続されている場合は、特定のデバイスをタップして入力ディスパッチャ状態の RecentQueue 配列を確認し、最新のイベントを生成したデバイスを特定できます。次に、イベントハブ状態の対応するデバイスを見つけます。

接続されたディスプレイに割り当てられているディスプレイ ポートを確認するには、adb shell dumpsys display を使用してから、Display Devices のディスプレイごとに DisplayDeviceInfoaddress プロパティを探します。または adb shell dumpsys SurfaceFlinger --display-id を使用して、接続されているすべてのディスプレイの識別情報をダンプします。静的ディスプレイ ID もご覧ください。

特定の入力デバイスの関連付けが指定されていて、対応するディスプレイがシステムに存在しない場合、入力デバイスはそのディスプレイが表示されるまで無効になります。関連付けは、タッチデバイスに対してのみ実行されます。

動的マルチディスプレイのルーティング

Android 10 では、静的マルチディスプレイ デバイスを設定できます。動的関連付けはまだ有効になっていません。ただし、常に存在するわけではないディスプレイと入力パネルのルーティング情報を指定するか、仮想入力デバイスを使用してそれらの仮想デバイスに追加のルーティング情報を提供することで、一部のユースケースに対処できます。デバイスの実装でのサポートに応じて、以下が行われます。

  • ドッキング ステーションによるデスクトップのようなエクスペリエンスがサポートされている場合、ホルダーに接続された入力アクセサリ(ポートによって一意に識別される)から外部ディスプレイ(ポートによって識別される)への入力をターゲットとするルーティング設定が提供されます。
  • 外部ディスプレイに接続されたときに入力ソース(タッチパッドなど)として機能するプライマリ画面がサポートされている場合、仮想タッチパネル(一意の仮想 ID で識別される)から外部ディスプレイ(ポートによって識別される)への入力をターゲットとするルーティング設定が提供されます。

実装

  • 物理デバイスの場合、入力デバイスが接続されるポートとディスプレイが接続されるポートは、ディスプレイとタッチスクリーンを一致させるために使用されます。
  • マッピングは InputReaderConfiguration に保存されます。
  • TouchInputMapper.mViewport は、InputDevice.location に指定されたポートに一致するビューポートに設定されます。
  • マッピング ファイルで入力デバイスポートが指定されており、一致するディスプレイ ポートを含むビューポートが現在存在しない場合、そのポートの入力デバイスは無効になります。
  • 特定の入力デバイスに対してポートが指定されていない場合、ビューポートは既存のルールに従って設定されます。
  • 入力ドライバでのカーネルの変更は不要です。
  • 入力デバイスポートは、EVIOCGPHYS ioctl を使用して決定されます。