Enrutamiento de entrada

En Android 9 y versiones anteriores, no había forma de interactuar con varias pantallas a través del tacto, porque no había un mecanismo de asociación entre las pantallas y la entrada dispositivos. Por ejemplo, una pantalla táctil puede proporcionar una salida de video en HDMI. (que se registraría como una pantalla en Android) y una salida USB para pantalla táctil (que se registraría como un dispositivo de entrada). Si se conectaran varios dispositivos en de esta manera, no habría forma de determinar a qué dispositivo de entrada pertenece qué pantalla. El mismo problema se aplica a los dispositivos plegables con múltiples pantallas.

Android 10 agregó un mecanismo para especificar qué entrada o dispositivos pertenecen a qué pantallas. La asociación se realiza con números de puerto en los que port se refiere al puerto físico al que está conectada una pantalla.

Por ejemplo, si un dispositivo Android tiene dos puertos HDMI con la etiqueta hdmi1. y hdmi2, los valores de puerto de visualización podrían ser 1 y 2 Los valores del puerto son los mismos incluso cuando se cambia la pantalla conectada (por ejemplo, un modelo de pantalla o un fabricante diferentes) al mismo dispositivo físico Puerto HDMI. Esto permite a los fabricantes de dispositivos proporcionar instrucciones para ensamblarlos y actualizar pantallas.

La asociación se configura en /vendor/etc/input-port-associations.xml. Por ejemplo:

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

En el ejemplo anterior, display="0" especifica el puerto al que pantalla está conectada. input="usb-xhci-hcd.0.auto-1.1/input0" especifica el puerto al que se conecta el dispositivo de entrada. Para determinar los puertos asociados con dispositivos específicos, usa el siguiente comando terminal y, luego, revisa la propiedad location de esos dispositivos en el estado del centro de eventos.

adb shell dumpsys input

Si hay muchos dispositivos conectados, presiona un dispositivo específico para examinar Arreglo RecentQueue en el estado Despachador de entrada. Así podrás identificar los dispositivos que generaron el evento más reciente. Luego, puedes encontrar dispositivo correspondiente en el estado del centro de eventos.

Para determinar los puertos de visualización asignados a las pantallas conectadas, usa adb shell dumpsys display y, luego, busca address. propiedad de DisplayDeviceInfo para cada pantalla en Dispositivos de visualización. También puedes usar adb shell dumpsys SurfaceFlinger --display-id para volcar información de identificación para todas las pantallas conectadas. Consulta también Identificadores de visualización estáticos.

Si especificas una asociación para un dispositivo de entrada específico y su pantalla no está presente en el sistema, el dispositivo de entrada se inhabilita hasta que la pantalla aparecerá una pantalla. La asociación solo se realiza para dispositivos táctiles.

Enrutamiento para pantallas múltiples dinámicas

Android 10 te permite configurar pantallas múltiples estáticas dispositivos. Las asociaciones dinámicas aún no están habilitadas. Sin embargo, algunos casos de uso pueden proporcionando información de enrutamiento para pantallas y paneles de entrada que no estén siempre está presente o usa dispositivos de entrada virtuales y, luego, proporciona enrutamiento adicional información a esos dispositivos virtuales. Si la implementación de un dispositivo admite lo siguiente:

  • Tener una experiencia similar a la de una computadora de escritorio con una estación de conexión, entonces, se podría aplicar una configuración de enrutamiento. para la entrada de destino del accesorio de entrada conectado al conector (identificado únicamente por puerto) a la pantalla externa (identificada por puerto).
  • Pantalla principal que actúa como entrada (como un panel táctil) cuando está conectada a la pantalla externa, se podría proporcionar una configuración de enrutamiento a la entrada del panel táctil virtual (identificado con un ID virtual único) a la pantalla externa (identificado por puerto).

Implementación

  • Para dispositivos físicos, el puerto al que está conectado el dispositivo de entrada y la al que está conectada la pantalla, se utilizan para hacer coincidir las pantallas con pantallas táctiles.
  • Las asignaciones se almacenan en InputReaderConfiguration.
  • TouchInputMapper.mViewport se establece en el viewport que coincide. el puerto especificado para InputDevice.location.
  • Si se especifica un puerto de dispositivo de entrada en el archivo de asignación, y hay actualmente no es un viewport con un puerto de visualización coincidente, la entrada que el dispositivo en ese puerto esté inhabilitado.
  • Si no se especifica un puerto para un dispositivo de entrada en particular, entonces según las reglas existentes.
  • No se requieren cambios en el kernel en los controladores de entrada.
  • Los puertos del dispositivo de entrada se determinan usando la ioctl EVIOCGPHYS.