No Android 9 e versões anteriores, não havia como interagir com várias telas por toque, porque não havia um mecanismo de associação entre telas e dispositivos de entrada. Por exemplo, uma tela touchscreen pode fornecer uma saída de vídeo HDMI (que seria registrada como uma tela no Android) e uma saída USB para touchscreen (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 tela. 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 porta se refere à porta física a que uma tela está conectada.
Por exemplo, se um dispositivo Android tiver duas portas HDMI identificadas como 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 para montar
e atualizar 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 comando do terminal abaixo e
analise 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 agente de entrada. Você pode identificar os dispositivos que geraram o evento mais recente. Em seguida, você encontra 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 tela estática.
Se você especificar uma associação para um dispositivo de entrada específico e a tela correspondente não estiver presente no sistema, o dispositivo de entrada será desativado até que a tela apareça. A associação é realizada apenas para dispositivos com tela touch.
Roteamento para várias telas dinâmicas
O Android 10 permite configurar dispositivos estáticos de várias telas. 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:
- Com uma experiência semelhante à de um computador com uma dock station, uma configuração de roteamento pode ser fornecida para a entrada de destino do acessório de entrada conectado à base (identificado exclusivamente pela porta) para a tela externa (identificada pela porta).
- Tela primária que atua como origem de entrada (como um touchpad) quando conectada à tela externa, então uma configuração de roteamento pode ser fornecida para direcionar a entrada do painel de toque virtual (identificado pelo 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
é definido como a janela de visualização que corresponde à porta especificada paraInputDevice.location
.- Se uma porta de dispositivo de entrada for especificada no arquivo de mapeamento e não houver atualmente 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 dispositivo de entrada específico, a viewport será definida de acordo com as regras atuais.
- Nenhuma mudança no kernel é necessária nos drivers de entrada.
- As portas do dispositivo de entrada são determinadas usando o ioctl EVIOCGPHYS.