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

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