Instradamento degli ingressi

In Android 9 e versioni precedenti non c'era modo di interagire con più display tramite touch, 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 touchscreen (che verrebbe registrata come dispositivo di input). Se più dispositivi fossero collegati in questo modo, non ci sarebbe modo di determinare quale dispositivo di input appartiene a quale display. Lo stesso problema si applica ai dispositivi pieghevoli con più display integrati.

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

Ad esempio, se un dispositivo Android dispone di due porte HDMI etichettate hdmi1 e hdmi2 , i valori della porta display potrebbero essere 1 e 2 . I valori della porta rimangono gli stessi anche quando è collegato un display diverso (ad esempio un modello o produttore di display 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 . Per 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, utilizzare il comando del terminale seguente, quindi esaminare la proprietà location di tali dispositivi nello stato dell'hub eventi.

adb shell dumpsys input

Se sono collegati molti dispositivi, toccare un dispositivo specifico per esaminare l'array RecentQueue nello stato del dispatcher di input. È quindi possibile identificare i dispositivi che hanno generato l'evento più recente. È quindi possibile trovare il dispositivo corrispondente nello stato dell'hub eventi.

Per determinare le porte di visualizzazione assegnate ai display collegati, utilizzare adb shell dumpsys display e quindi cercare 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 statici .

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

Routing per multi-display dinamici

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

  • Esperienza simile a un desktop con una docking station, quindi potrebbe essere fornita una configurazione di routing per indirizzare l'input dall'accessorio di input collegato al dock (identificato in modo univoco dalla porta) al display esterno (identificato dalla porta).
  • Lo schermo principale che funge da sorgente di input (come un touchpad) quando è collegato al display esterno, potrebbe essere fornita una configurazione di routing per indirizzare l'input dal touch panel 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 sulla viewport che corrisponde alla porta specificata per InputDevice.location .
  • Se nel file di mappatura viene specificata una porta del dispositivo di input e attualmente non esiste una finestra con una porta di visualizzazione corrispondente, il dispositivo di input su quella porta viene disabilitato.
  • Se non viene specificata una porta per un particolare dispositivo di input, la visualizzazione 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 EVIOCGPHYS ioctl.