Routage d'entrée

Dans Android 9 et les versions antérieures, il n'y avait aucun moyen d'interagir avec plusieurs écrans via le toucher, car il n'y avait pas de mécanisme d'association entre les écrans et les périphériques d'entrée. Par exemple, un écran tactile pourrait fournir une sortie vidéo HDMI (qui s'enregistrerait en tant qu'écran sur Android) et une sortie USB pour écran tactile (qui s'enregistrerait en tant que périphérique d'entrée). Si plusieurs périphériques étaient connectés de cette manière, il n'y aurait aucun moyen de déterminer quel périphérique d'entrée appartient à quel écran. Le même problème s'applique aux appareils pliables avec plusieurs écrans intégrés.

Android 10 a ajouté un mécanisme pour spécifier quels périphériques d'entrée appartiennent à quels écrans. L'association se fait par numéros de port où port fait référence au port physique auquel un écran est connecté.

Par exemple, si un appareil Android possède deux ports HDMI étiquetés hdmi1 et hdmi2 , les valeurs du port d'affichage peuvent être 1 et 2 . Les valeurs de port restent les mêmes même lorsqu'un écran différent est connecté (comme un modèle ou un fabricant d'écran différent) au même port HDMI physique. Cela permet aux fabricants d'appareils de fournir des instructions pour assembler et mettre à niveau les écrans.

L'association est configurée dans /vendor/etc/input-port-associations.xml . Par example:

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

Dans l'exemple ci-dessus, display="0" spécifie le port auquel l'écran est connecté. input="usb-xhci-hcd.0.auto-1.1/input0" spécifie le port auquel le périphérique d'entrée est connecté. Pour déterminer les ports associés à des périphériques spécifiques, utilisez la commande de terminal suivante, puis examinez la propriété d' location de ces périphériques dans l'état Event Hub.

adb shell dumpsys input

Si de nombreux appareils sont connectés, appuyez sur un appareil spécifique pour examiner le tableau RecentQueue dans l'état du répartiteur d'entrée. Vous pouvez alors identifier les appareils qui ont généré l'événement le plus récent. Vous pouvez ensuite trouver l'appareil correspondant dans l'état Event Hub.

Pour déterminer les ports d'affichage attribués aux écrans connectés, utilisez adb shell dumpsys display , puis recherchez la propriété d' address de DisplayDeviceInfo pour chaque écran sous Périphériques d'affichage. Vous pouvez également utiliser adb shell dumpsys SurfaceFlinger --display-id pour vider les informations d'identification de tous les écrans connectés. Voir aussi Identificateurs d'affichage statiques .

Si vous spécifiez une association pour un périphérique d'entrée spécifique et que l'affichage correspondant n'est pas présent dans le système, le périphérique d'entrée est désactivé jusqu'à ce que l'affichage correspondant apparaisse. L'association est effectuée uniquement pour les appareils tactiles.

Routage pour multi-affichages dynamiques

Android 10 vous permet de configurer des appareils multi-affichages statiques. Les associations dynamiques ne sont pas encore activées. Cependant, certains cas d'utilisation peuvent être résolus en fournissant des informations de routage pour les écrans et les panneaux d'entrée qui ne sont pas toujours présents ou en utilisant des périphériques d'entrée virtuels, puis en fournissant des informations de routage supplémentaires à ces périphériques virtuels. Si une implémentation de périphérique prend en charge un :

  • Une expérience de type bureau avec une station d'accueil, puis une configuration de routage pourrait être fournie pour cibler l'entrée de l'accessoire d'entrée connecté à la station d'accueil (identifié uniquement par le port) vers l'écran externe (identifié par le port).
  • L'écran principal agit comme une source d'entrée (comme un pavé tactile) lorsqu'il est connecté à l'écran externe, puis une configuration de routage peut être fournie pour cibler l'entrée du panneau tactile virtuel (identifié par un ID virtuel unique) vers l'écran externe (identifié par le port) .

Mise en œuvre

  • Pour les périphériques physiques, le port auquel le périphérique d'entrée est connecté et le port auquel l'écran est connecté sont utilisés pour faire correspondre les écrans avec les écrans tactiles.
  • Les mappages sont stockés dans InputReaderConfiguration .
  • TouchInputMapper.mViewport est défini sur la fenêtre d'affichage qui correspond au port spécifié pour InputDevice.location .
  • Si un port de périphérique d'entrée est spécifié dans le fichier de mappage et qu'il n'y a actuellement pas de fenêtre d'affichage avec un port d'affichage correspondant, le périphérique d'entrée sur ce port est désactivé.
  • Si aucun port n'est spécifié pour un périphérique d'entrée particulier, la fenêtre d'affichage est définie conformément aux règles existantes.
  • Aucune modification du noyau n'est requise dans les pilotes d'entrée.
  • Les ports du périphérique d'entrée sont déterminés à l'aide de l'ioctl EVIOCGPHYS.