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