Routing di 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 verrebbe registrata come display su Android) e un'uscita USB per il touchscreen (che verrebbe registrata come dispositivo di input). Se più dispositivi fossero connessi in questo modo, non sarebbe possibile determinare a quale display appartiene quale 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 in base ai 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 del display potrebbero essere 1 e 2. I valori della porta rimangono invariati anche quando viene 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 precedente, 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, quindi esamina la proprietàlocation di questi dispositivi in Event Hub State.

adb shell dumpsys input

Se sono connessi molti dispositivi, tocca un dispositivo specifico per esaminare l'array RecentQueue in Input Dispatcher State. Puoi quindi identificare i dispositivi che hanno generato l'evento più recente. Puoi quindi trovare il dispositivo corrispondente nello stato di Event Hub.

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 scaricare le informazioni di identificazione per tutti i display collegati. Vedi anche Identificatori di visualizzazione statica.

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

Routing per multi-display dinamici

Android 10 consente di configurare dispositivi statici multi-display. Le associazioni dinamiche non sono ancora attive. Tuttavia, alcuni casi d'uso possono essere gestiti fornendo informazioni di routing per display e pannelli di input che non sono sempre presenti o utilizzando dispositivi di input virtuali e fornendo poi informazioni di routing aggiuntive a questi dispositivi virtuali. Se l'implementazione di un dispositivo supporta:

  • Esperienza simile a quella di un computer con una docking station, quindi è possibile fornire una configurazione di routing per indirizzare l'input dall'accessorio di input collegato alla base di ricarica (identificato in modo univoco dalla porta) al display esterno (identificato dalla porta).
  • Lo schermo principale funge da sorgente di input (ad esempio un touchpad) quando è collegato al display esterno, quindi è possibile fornire una configurazione di routing per indirizzare l'input dal pannello tattile 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 sono memorizzate in InputReaderConfiguration.
  • TouchInputMapper.mViewport è impostato sull'area visibile corrispondente alla porta specificata per InputDevice.location.
  • Se nel file di mapping è specificata una porta del dispositivo di input e al momento non è presente un viewport con una porta di visualizzazione corrispondente, il dispositivo di input su quella porta è disattivato.
  • Se una porta non è specificata per un particolare dispositivo di input, la finestra viene impostata in base alle regole esistenti.
  • Non sono necessarie modifiche al kernel nei driver di input.
  • Le porte del dispositivo di input vengono determinate utilizzando l'ioctl EVIOCGPHYS.