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

В 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 .
  • Если в файле сопоставления указан порт устройства ввода, и в настоящее время нет области просмотра с соответствующим портом дисплея, то устройство ввода на этом порту отключается.
  • Если для конкретного устройства ввода не указан порт, то область просмотра устанавливается в соответствии с существующими правилами.
  • Никаких изменений ядра во входных драйверах не требуется.
  • Порты устройств ввода определяются с помощью EVIOCGPHYS ioctl.