Roteamento de entrada

No Android 9 e versões anteriores, não havia como interagir com vários monitores via toque, pois não havia mecanismo de associação entre monitores e dispositivos de entrada. Por exemplo, uma tela sensível ao toque poderia fornecer uma saída de vídeo HDMI (que seria registrada como uma tela no Android) e uma saída USB para tela sensível ao toque (que seria registrada como um dispositivo de entrada). Se vários dispositivos fossem conectados dessa maneira, não haveria como determinar qual dispositivo de entrada pertence a qual monitor. O mesmo problema se aplica a dispositivos dobráveis ​​com vários monitores integrados.

O Android 10 adicionou um mecanismo para especificar quais dispositivos de entrada pertencem a quais monitores. A associação é feita por números de porta, onde porta se refere à porta física à qual um monitor está conectado.

Por exemplo, se um dispositivo Android tiver duas portas HDMI identificadas como hdmi1 e hdmi2 , os valores da porta de vídeo poderão ser 1 e 2 . Os valores das portas permanecem os mesmos mesmo quando um monitor diferente é conectado (como um modelo ou fabricante de monitor diferente) à mesma porta HDMI física. Isso permite que os fabricantes de dispositivos forneçam instruções para montar e atualizar monitores.

A associação está configurada em /vendor/etc/input-port-associations.xml . Por exemplo:

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

No exemplo acima, display="0" especifica a porta à qual o monitor está conectado. input="usb-xhci-hcd.0.auto-1.1/input0" especifica a porta à qual o dispositivo de entrada está conectado. Para determinar as portas associadas a dispositivos específicos, utilize o seguinte comando de terminal e, em seguida, reveja a propriedade location desses dispositivos no Estado do Event Hub.

adb shell dumpsys input

Se muitos dispositivos estiverem conectados, toque em um dispositivo específico para examinar a matriz RecentQueue no estado do Input Dispatcher. Você pode então identificar os dispositivos que geraram o evento mais recente. Você pode então encontrar o dispositivo correspondente no Estado do Event Hub.

Para determinar as portas de exibição atribuídas aos monitores conectados, use adb shell dumpsys display e procure a propriedade address de DisplayDeviceInfo para cada monitor em Dispositivos de exibição. Como alternativa, use adb shell dumpsys SurfaceFlinger --display-id para despejar informações de identificação de todos os monitores conectados. Consulte também Identificadores de exibição estáticos .

Se você especificar uma associação para um dispositivo de entrada específico e o display correspondente não estiver presente no sistema, o dispositivo de entrada será desabilitado até que o respectivo display apareça. A associação é realizada apenas para dispositivos sensíveis ao toque.

Roteamento para vários monitores dinâmicos

O Android 10 permite configurar dispositivos estáticos com vários monitores. As associações dinâmicas ainda não estão habilitadas. No entanto, alguns casos de uso podem ser resolvidos fornecendo informações de roteamento para monitores e painéis de entrada que nem sempre estão presentes ou usando dispositivos de entrada virtuais e, em seguida, fornecendo informações de roteamento adicionais para esses dispositivos virtuais. Se uma implementação de dispositivo suportar:

  • Experiência semelhante à de desktop com uma dock station, então uma configuração de roteamento pode ser fornecida para direcionar a entrada do acessório de entrada conectado ao dock (identificado exclusivamente pela porta) para o monitor externo (identificado pela porta).
  • Tela primária agindo como uma fonte de entrada (como um touchpad) quando conectada ao monitor externo, então uma configuração de roteamento pode ser fornecida para direcionar a entrada do painel de toque virtual (identificado por ID virtual exclusivo) para o monitor externo (identificado pela porta) .

Implementação

  • Para dispositivos físicos, a porta à qual o dispositivo de entrada está conectado e a porta à qual o monitor está conectado são usadas para combinar os monitores com telas sensíveis ao toque.
  • Os mapeamentos são armazenados em InputReaderConfiguration .
  • TouchInputMapper.mViewport é definido como a janela de visualização que corresponde à porta especificada para InputDevice.location .
  • Se uma porta de dispositivo de entrada for especificada no arquivo de mapeamento e atualmente não houver uma viewport que tenha uma porta de exibição correspondente, o dispositivo de entrada nessa porta será desativado.
  • Se uma porta não for especificada para um dispositivo de entrada específico, a janela de visualização será definida de acordo com as regras existentes.
  • Nenhuma alteração de kernel é necessária nos drivers de entrada.
  • As portas do dispositivo de entrada são determinadas usando o ioctl EVIOCGPHYS.