Routing degli input

In Android 9 e versioni precedenti, non era possibile interagire con più display tramite tocco, perché non c'era alcun meccanismo di associazione tra i display e l'input dispositivi mobili. 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 quale input a cui appartengono i dispositivi. 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 viene visualizzata una finestra diversa (ad esempio un produttore o un modello di display diverso) alla stessa rete fisica Porta HDMI. 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 è connesso il dispositivo di input. per individuare le porte associati a dispositivi specifici, usa il seguente comando nel 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 del display assegnate ai display collegati, utilizza adb shell dumpsys display e poi cerca 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 connessi. 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 multi-display statico dispositivi mobili. Le associazioni dinamiche non sono ancora attivate. Tuttavia, alcuni casi d'uso possono essere risolti fornendo informazioni sui percorsi per i display e i riquadri di input che non sono sempre presenti o che utilizzano dispositivi di input virtuale e quindi fornire routing aggiuntivo 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).
  • Schermata principale che funge da fonte di input (ad esempio un touchpad) quando è connesso al display esterno, potrebbe essere fornita 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 è connesso il dispositivo di input 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 corrispondente la porta specificata per InputDevice.location.
  • Se nel file di mappatura è specificata una porta del dispositivo di input e attualmente non è un'area visibile con una porta display corrispondente, l'input dispositivo su quella porta sia disabilitato.
  • Se non viene specificata una porta per un determinato dispositivo di input, l'area visibile è impostate 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.