Enrutamiento de entrada

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

Android 10 agregó un mecanismo para especificar qué dispositivos de entrada pertenecen a qué pantallas. La asociación se realiza por números de puerto, en los que puerto hace referencia al puerto físico al que se conecta una pantalla.

Por ejemplo, si un dispositivo Android tiene dos puertos HDMI etiquetados como hdmi1 y hdmi2, los valores de los puertos de pantalla podrían ser 1 y 2. Los valores de los puertos siguen siendo los mismos incluso cuando se conecta una pantalla diferente (como un modelo o fabricante de pantalla diferente) al mismo puerto HDMI físico. Esto permite que los fabricantes de dispositivos proporcionen instrucciones para ensamblar 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 está conectada la pantalla. input="usb-xhci-hcd.0.auto-1.1/input0" especifica el puerto al que está conectado el dispositivo de entrada. Para determinar los puertos asociados con dispositivos específicos, usa el siguiente comando de la terminal y, luego, revisa la propiedadlocation de esos dispositivos en el estado del centro de eventos.

adb shell dumpsys input

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

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

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

Enrutamiento para pantallas múltiples dinámicas

Android 10 te permite configurar dispositivos multipantalla estáticos. Aún no se habilitaron las asociaciones dinámicas. Sin embargo, algunos casos de uso se pueden abordar proporcionando información de enrutamiento para pantallas y paneles de entrada que no siempre están presentes, o bien usando dispositivos de entrada virtuales y, luego, proporcionando información de enrutamiento adicional a esos dispositivos virtuales. Si la implementación de un dispositivo admite lo siguiente:

  • Experiencia similar a la de una computadora de escritorio con una estación de conexión. Luego, se podría proporcionar una configuración de enrutamiento para dirigir la entrada desde el accesorio de entrada conectado a la estación de conexión (identificado de forma única por el puerto) a la pantalla externa (identificada por el puerto).
  • La pantalla principal actúa como fuente de entrada (como un panel táctil) cuando se conecta a la pantalla externa. Luego, se puede proporcionar una configuración de enrutamiento para dirigir la entrada desde el panel táctil virtual (identificado por un ID virtual único) a la pantalla externa (identificada por el puerto).

Implementación

  • En el caso de los dispositivos físicos, el puerto al que se conecta el dispositivo de entrada y el puerto al que se conecta la pantalla se usan para hacer coincidir las pantallas con las pantallas táctiles.
  • Las asignaciones se almacenan en InputReaderConfiguration.
  • TouchInputMapper.mViewport se establece en el viewport que coincide con el puerto especificado para InputDevice.location.
  • Si se especifica un puerto de dispositivo de entrada en el archivo de asignación y, actualmente, no hay un viewport que tenga un puerto de pantalla coincidente, se inhabilita el dispositivo de entrada en ese puerto.
  • Si no se especifica un puerto para un dispositivo de entrada en particular, la ventana gráfica se establece según las reglas existentes.
  • No se requieren cambios en el kernel de los controladores de entrada.
  • Los puertos del dispositivo de entrada se determinan con el ioctl EVIOCGPHYS.