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 registrato come display su Android) e un'uscita USB per il touchscreen (che verrebbe registrato come dispositivo di input). Se erano connessi più dispositivi In questo modo, non c'è modo di determinare a quale dispositivo di input appartenga quali mostrare. Lo stesso problema vale per i dispositivi pieghevoli con più funzioni integrate vengono visualizzati i video.

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

Ad esempio, se un dispositivo Android ha due porte HDMI etichettate come hdmi1 e hdmi2, i valori di Display Port 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 l'assemblaggio ed eseguire l'upgrade dei 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 il display sia connesso. input="usb-xhci-hcd.0.auto-1.1/input0" specifica la porta a cui è collegato il dispositivo di input. per individuare le porte associati a dispositivi specifici, usa il seguente comando del terminale esamina la proprietà location di questi dispositivi nello stato dell'hub eventi.

adb shell dumpsys input

Se sono connessi molti dispositivi, toccane uno specifico per esaminare la Array RecentQueue nello stato del supervisore di input. Puoi quindi identificare i dispositivi che hanno generato l'evento più recente. Puoi quindi trovare 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, usa adb shell dumpsys SurfaceFlinger --display-id per eseguire il dump informazioni di identificazione per tutti i display collegati. Vedi anche Identificatori di visualizzazione statici.

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

Routing per più display dinamici

Android 10 ti consente di configurare dispositivi statici con più display. 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 e fornendo ulteriori informazioni di routing a questi dispositivi virtuali. Se l'implementazione di un dispositivo supporta:

  • Un'esperienza simile a quella di un computer con una docking station, quindi potrebbe essere necessario configurare il routing fornito all'input di destinazione dall'accessorio di ingresso collegato alla base (identificato in modo univoco in base alla 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 è impostato sull'area visibile corrispondente alla porta specificata per InputDevice.location.
  • Se nel file di mappatura è specificata una porta del dispositivo di input e al momento non esiste un riquadro con una porta di visualizzazione corrispondente, il dispositivo di input su quella porta viene disattivato.
  • Se non è specificata una porta per un determinato dispositivo di input, il viewport viene impostato in base alle regole esistenti.
  • Non sono necessarie modifiche al kernel nei driver di input.
  • Le porte del dispositivo di input vengono determinate utilizzando lo strumento EVIOCGPHYS ioctl.