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ários modelos integrados é exibido.
O Android 10 adicionou um mecanismo para especificar qual entrada dispositivos 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 chamadas 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 é
conectados (como um fabricante ou modelo de tela diferente) ao mesmo
Porta HDMI. 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 para a qual o
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, use o seguinte comando do terminal e
revise a propriedade location
desses dispositivos no estado do hub de eventos.
adb shell dumpsys input
Se houver vários dispositivos conectados, toque em um dispositivo específico para examinar
Matriz RecentQueue
no estado do agente de entrada. Você pode então identificar
os dispositivos que geraram o evento mais recente. Em seguida, você encontra
dispositivo correspondente no estado do hub de eventos.
Para determinar as portas de tela atribuídas às telas conectadas, use
adb shell dumpsys display
e depois procure o address
de DisplayDeviceInfo
para cada tela em "Dispositivos de display".
Como alternativa, use adb shell dumpsys SurfaceFlinger --display-id
para despejar
de identificação pessoal 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 a 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 são 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 virtual e, em seguida, fornecendo informações para esses dispositivos virtuais. Se uma implementação de dispositivo for compatível com:
- 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).
- Tela principal que atua como fonte de entrada (como um touchpad) quando conectada à tela externa, uma configuração de roteamento poderá ser fornecida para direcionar do painel de toque virtual (identificado pelo ID virtual exclusivo) até a tela externa (identificado pela porta).
Implementação
- Para dispositivos físicos, a porta à qual o dispositivo de entrada está conectado e a porta à qual a tela está conectada, são usadas para fazer a correspondência entre as telas e as touchscreens.
- 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 do dispositivo de entrada for especificada no arquivo de mapeamento e houver não for uma janela de visualização que tenha uma porta de exibição correspondente, na porta está 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 de kernel é necessária nos drivers de entrada.
- As portas do dispositivo de entrada são determinadas usando o ioctl EVIOCGPHYS.