Входная маршрутизация

В Android 9 и более ранних версиях не было возможности взаимодействовать с несколькими дисплеями посредством касания, поскольку отсутствовал механизм ассоциации между дисплеями и устройствами ввода. Например, сенсорный дисплей мог иметь видеовыход HDMI (который регистрировался бы как дисплей в Android) и выход USB для сенсорного экрана (который регистрировался бы как устройство ввода). При таком подключении нескольких устройств невозможно было бы определить, какое устройство ввода принадлежит какому дисплею. Та же проблема характерна для складных устройств с несколькими встроенными дисплеями.

В Android 10 появился механизм, позволяющий определить, какие устройства ввода принадлежат к тем или иным дисплеям. Связь осуществляется по номерам портов, где порт — это физический порт, к которому подключен дисплей.

Например, если на устройстве Android есть два порта HDMI с обозначениями hdmi1 и hdmi2 , то значения порта дисплея могут быть 1 и 2 Значения порта остаются неизменными даже при подключении другого дисплея (например, другой модели или производителя) к тому же физическому порту 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 , а затем найдите свойство address в DisplayDeviceInfo для каждого дисплея в разделе «Устройства отображения». Также можно использовать adb shell dumpsys SurfaceFlinger --display-id для вывода идентификационной информации для всех подключенных дисплеев. См. также раздел Статические идентификаторы дисплеев .

Если вы указали привязку для конкретного устройства ввода, а соответствующий дисплей отсутствует в системе, устройство ввода будет отключено до появления соответствующего дисплея. Привязка выполняется только для сенсорных устройств.

Маршрутизация для динамических мультидисплеев

Android 10 позволяет настраивать статические многодисплейные устройства. Динамические связи пока не поддерживаются. Однако некоторые сценарии использования можно реализовать, предоставив информацию о маршрутизации для дисплеев и панелей ввода, которые не всегда присутствуют, или используя виртуальные устройства ввода с последующим предоставлением дополнительной информации о маршрутизации этим виртуальным устройствам. Если реализация устройства поддерживает:

  • Аналогично настольному компьютеру с док-станцией можно настроить конфигурацию маршрутизации для направления входных данных с устройства ввода, подключенного к док-станции (уникально идентифицируемого по порту), на внешний дисплей (идентифицируемый по порту).
  • Основной экран действует как источник ввода (например, сенсорная панель) при подключении к внешнему дисплею, затем можно предоставить конфигурацию маршрутизации для направления ввода с виртуальной сенсорной панели (идентифицируемой уникальным виртуальным идентификатором) на внешний дисплей (идентифицируемый портом).

Выполнение

  • Для физических устройств порт, к которому подключено устройство ввода, и порт, к которому подключен дисплей, используются для согласования дисплеев с сенсорными экранами.
  • Сопоставления хранятся в InputReaderConfiguration .
  • TouchInputMapper.mViewport устанавливается на область просмотра, соответствующую порту, указанному для InputDevice.location .
  • Если порт устройства ввода указан в файле сопоставления и в данный момент нет области просмотра с соответствующим портом отображения, то устройство ввода на этом порту отключается.
  • Если для конкретного устройства ввода порт не указан, то область просмотра устанавливается в соответствии с существующими правилами.
  • Никаких изменений в ядре драйверов ввода не требуется.
  • Порты входных устройств определяются с помощью ioctl EVIOCGPHYS.