Routing degli input

In Android 9 e versioni precedenti, non era possibile interagire con più display tramite tocco, perché non esisteva un meccanismo di associazione tra display e dispositivi di input. Ad esempio, un display touchscreen potrebbe fornire un'uscita video HDMI (che verrà registrata come display su Android) e un'uscita USB per il touchscreen (che verrà registrata come dispositivo di input). Se più dispositivi fossero collegati in questo modo, non ci sarebbe modo di determinare a quale display appartiene ciascun dispositivo di input. Lo stesso problema si applica ai dispositivi pieghevoli con più display integrati.

Android 10 ha aggiunto un meccanismo per specificare a quali display appartengono i dispositivi di input. L'associazione viene eseguita dai numeri di porta, dove porta si riferisce alla porta fisica a cui è collegato un display.

Ad esempio, se un dispositivo Android ha due porte HDMI etichettate hdmi1 e hdmi2, i valori della porta display potrebbero essere 1 e 2. I valori della porta rimangono invariati anche quando è collegato un display diverso (ad esempio un modello o un produttore diverso) alla stessa porta HDMI fisica. Ciò consente ai produttori di dispositivi di fornire istruzioni per assemblare e aggiornare i display.

L'associazione è configurata in /vendor/etc/input-port-associations.xml. Ad esempio:

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

Nell'esempio riportato sopra, display="0" specifica la porta a cui è collegato il display. input="usb-xhci-hcd.0.auto-1.1/input0" specifica la porta a cui è collegato il dispositivo di input. Per determinare le porte associate a dispositivi specifici, utilizza il seguente comando del terminale ed esamina la proprietà location di questi dispositivi nello stato dell'hub eventi.

adb shell dumpsys input

Se sono connessi molti dispositivi, tocca un dispositivo specifico per esaminare l'array RecentQueue nello stato di Input Dispatcher. Dopodiché puoi identificare i dispositivi che hanno generato l'evento più recente. Potrai quindi trovare il dispositivo corrispondente nello stato dell'hub eventi.

Per determinare le porte di visualizzazione assegnate ai display collegati, utilizza adb shell dumpsys display e poi cerca la proprietà address di DisplayDeviceInfo per ogni display in Dispositivi di visualizzazione. In alternativa, utilizza adb shell dumpsys SurfaceFlinger --display-id per eseguire il dump delle informazioni di identificazione di tutti i display connessi. Vedi anche Identificatori di visualizzazione statici.

Se specifichi un'associazione per uno specifico dispositivo di input e il display corrispondente non è presente nel sistema, il dispositivo di input viene disattivato finché non viene visualizzato il rispettivo display. L'associazione viene eseguita solo per i dispositivi touch.

Routing per più display dinamici

Android 10 ti consente di configurare dispositivi multi-display statici. Le associazioni dinamiche non sono ancora attivate. Tuttavia, alcuni casi d'uso possono essere affrontati fornendo informazioni di routing per display e pannelli di input non sempre presenti o utilizzando dispositivi di input virtuali, nonché fornendo ulteriori informazioni di routing a questi dispositivi virtuali. Se un'implementazione del dispositivo supporta:

  • Esperienza simile a un computer con una base di ricarica, quindi è possibile fornire una configurazione di routing per scegliere come target l'input dall'accessorio di input collegato alla base (identificato in modo univoco dalla porta) al display esterno (identificato dalla porta).
  • Lo schermo principale agisce come sorgente di input (ad esempio un touchpad) quando è collegato al display esterno. È quindi possibile fornire una configurazione di routing per l'input di destinazione dal pannello touch virtuale (identificato da un ID virtuale univoco) al display esterno (identificato dalla porta).

Implementazione

  • Per i dispositivi fisici, la porta a cui è collegato il dispositivo di input e la porta a cui è collegato il display vengono utilizzate per abbinare i display ai touchscreen.
  • Le mappature vengono archiviate in InputReaderConfiguration.
  • TouchInputMapper.mViewport è impostata sull'area visibile che corrisponde alla porta specificata per InputDevice.location.
  • Se nel file di mappatura è specificata la porta del dispositivo di input, ma al momento non è presente un'area visibile con una porta display corrispondente, il dispositivo di input su quella porta viene disattivato.
  • Se non viene specificata una porta per un determinato dispositivo di input, l'area visibile viene impostata in base alle regole esistenti.
  • Non sono richieste modifiche al kernel nei driver di input.
  • Le porte del dispositivo di input vengono determinate utilizzando lo strumento EVIOCGPHYS ioctl.