Roteamento de entrada

No Android 9 e versões anteriores, não havia como interagir com várias telas. via toque, porque não havia um mecanismo de associação entre telas e entradas dispositivos. Por exemplo, uma tela touchscreen pode ter uma saída de vídeo HDMI (que seria registrada como uma tela no Android) e uma saída USB para touchscreen (que seria registrado como um dispositivo de entrada). Se vários dispositivos estivessem conectados dessa forma, não seria possível determinar a qual dispositivo de entrada pertence quais serão exibidos. O mesmo problema se aplica a dispositivos dobráveis com várias telas integradas.

O Android 10 adicionou um mecanismo para especificar quais dispositivos de entrada pertencem a quais telas. A associação é feita por números de porta, em que port refere-se à porta física a que uma tela está conectada.

Por exemplo, se um dispositivo Android tiver duas portas HDMI com a etiqueta hdmi1 e hdmi2, os valores da porta de exibição poderão ser 1 e 2. Os valores da porta permanecem os mesmos, mesmo quando uma tela diferente é conectada (como um modelo ou fabricante de tela diferente) à mesma porta HDMI física. Isso permite que os fabricantes de dispositivos forneçam instruções de montagem e fazer upgrade das telas.

A associação está configurada em /vendor/etc/input-port-associations.xml. 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 a tela está conectada. 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, use o seguinte comando do terminal e revise a propriedade location desses dispositivos no estado do hub de eventos.

adb shell dumpsys input

Se muitos dispositivos estiverem conectados, toque em um dispositivo específico para examinar a matriz RecentQueue no estado do despachante de entrada. Em seguida, é possível identificar os dispositivos que geraram o evento mais recente. Em seguida, encontre o dispositivo correspondente no estado do hub de eventos.

Para determinar as portas de exibição atribuídas às telas conectadas, use adb shell dumpsys display e procure a propriedade address de DisplayDeviceInfo para cada tela em "Dispositivos de exibição". Como alternativa, use adb shell dumpsys SurfaceFlinger --display-id para despejar informações de identificação para todas as telas conectadas. Consulte também Identificadores de exibição estáticos.

Se você especificar uma associação para um dispositivo de entrada específico e o não estiver presente no sistema, o dispositivo de entrada ficará desativado até que o respectivo será exibido. A associação é realizada apenas para dispositivos touchscreen.

Roteamento para várias telas dinâmicas

O Android 10 permite configurar várias telas estáticas dispositivos. As associações dinâmicas ainda não estão ativadas. No entanto, alguns casos de uso podem ser resolvidos fornecendo informações de roteamento para telas e painéis de entrada que não estão sempre presentes ou usando dispositivos de entrada virtuais e fornecendo informações de roteamento adicionais a esses dispositivos virtuais. Se uma implementação de dispositivo oferece suporte a:

  • para uma experiência similar à de computador com uma dock station, uma configuração de roteamento poderia ser fornecido para a entrada de destino do acessório de entrada conectado à base (identificado exclusivamente por porta) à tela externa (identificada pela porta).
  • A tela principal atuando como uma fonte de entrada (como um touchpad) quando conectada à tela externa. Em seguida, uma configuração de roteamento pode ser fornecida para direcionar a entrada do painel de toque virtual (identificado por um ID virtual exclusivo) para a tela externa (identificada pela porta).

Implementação

  • Para dispositivos físicos, a porta a que o dispositivo de entrada está conectado e a porta a que a tela está conectada são usadas para combinar as telas com as telas touchscreen.
  • Os mapeamentos são armazenados em InputReaderConfiguration.
  • TouchInputMapper.mViewport está definido para a janela de visualização que corresponde a porta especificada para InputDevice.location.
  • Se uma porta de dispositivo de entrada for especificada no arquivo de mapeamento e não houver uma janela de visualização com uma porta de exibição correspondente, o dispositivo de entrada nessa porta será desativado.
  • Se uma porta não for especificada para um determinado dispositivo de entrada, a janela de visualização será definido de acordo com as regras existentes.
  • Nenhuma mudança no kernel é necessária nos drivers de entrada.
  • As portas do dispositivo de entrada são determinadas usando o ioctl EVIOCGPHYS.