Routing wejściowy

W systemie Android 9 i niższych nie było możliwości interakcji z wieloma wyświetlaczami za pomocą dotyku, ponieważ nie było mechanizmu powiązania między wyświetlaczami a urządzeniami wejściowymi. Na przykład wyświetlacz z ekranem dotykowym może zapewnić wyjście wideo HDMI (które zarejestruje się jako wyświetlacz w systemie Android) i wyjście USB dla ekranu dotykowego (które zarejestruje się jako urządzenie wejściowe). Gdyby w ten sposób podłączono wiele urządzeń, nie byłoby możliwości określenia, które urządzenie wejściowe należy do którego wyświetlacza. Ten sam problem dotyczy składanych urządzeń z wieloma wbudowanymi wyświetlaczami.

Android 10 dodał mechanizm określania, które urządzenia wejściowe należą do których wyświetlaczy. Stowarzyszenie odbywa się za pomocą numerów portów, gdy przyłącze odnosi się do portu fizycznego, do którego podłączony jest wyświetlacz.

Na przykład, jeżeli urządzenie Android ma dwa porty HDMI oznaczone hdmi1 i hdmi2 , wartości portów graficznych może być 1 i 2 . Wartości portów pozostają takie same, nawet jeśli inny wyświetlacz jest podłączony (np. inny model wyświetlacza lub inny producent) do tego samego fizycznego portu HDMI. Umożliwia to producentom urządzeń dostarczanie instrukcji dotyczących montażu i aktualizacji wyświetlaczy.

Stowarzyszenie jest skonfigurowany w /vendor/etc/input-port-associations.xml . Na przykład:

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

W przykładzie powyżej, display="0" określa port, do którego podłączony jest wyświetlacz. input="usb-xhci-hcd.0.auto-1.1/input0" określa port, do którego podłączone jest urządzenie wejściowe. Aby określić porty związane z urządzeniami szczególnych, należy użyć następującego polecenia terminal, a następnie przejrzeć location własności tych urządzeń w piaście Event państwa.

adb shell dumpsys input

Jeśli wiele urządzeń są podłączone, wybierz urządzenie konkretnego celu zbadania RecentQueue tablicę na wejściu Dyspozytor państwa. Następnie możesz zidentyfikować te urządzenia, które wygenerowały najnowsze zdarzenie. Następnie możesz znaleźć odpowiednie urządzenie w stanie Centrum zdarzeń.

Aby określić porty przypisane do wyświetlania podłączonych wyświetlaczy, korzystanie adb shell dumpsys display , a następnie szukać address własności DisplayDeviceInfo dla każdego wyświetlacza pod Display Devices. Można także użyć adb shell dumpsys SurfaceFlinger --display-id do informacji identyfikacyjnej wysypisko dla wszystkich podłączonych monitorów. Zobacz także statyczne wyświetlania identyfikatorów .

Jeśli określisz powiązanie dla określonego urządzenia wejściowego, a odpowiadający mu wyświetlacz nie jest obecny w systemie, urządzenie wejściowe zostanie wyłączone do momentu pojawienia się odpowiedniego wyświetlacza. Asocjacja jest wykonywana tylko dla urządzeń dotykowych.

Routing dla dynamicznych wielu wyświetlaczy

Android 10 umożliwia konfigurowanie statycznych urządzeń z wieloma wyświetlaczami. Powiązania dynamiczne nie są jeszcze włączone. Jednak niektóre przypadki użycia można rozwiązać, dostarczając informacje o routingu dla wyświetlaczy i paneli wejściowych, które nie zawsze są obecne, lub używając wirtualnych urządzeń wejściowych, a następnie dostarczając dodatkowe informacje o routingu do tych wirtualnych urządzeń. Jeśli implementacja urządzenia obsługuje:

  • Przypomina komputer stacjonarny ze stacją dokującą, a następnie można zapewnić konfigurację routingu w celu kierowania danych wejściowych z akcesorium wejściowego podłączonego do stacji dokującej (identyfikowanej jednoznacznie przez port) do zewnętrznego wyświetlacza (identyfikowanego przez port).
  • Ekran główny działający jako źródło sygnału wejściowego (taki jak touchpad) po podłączeniu do zewnętrznego wyświetlacza, wówczas konfiguracja routingu może być dostarczona do docelowego wejścia z wirtualnego panelu dotykowego (identyfikowanego przez unikalny wirtualny identyfikator) do zewnętrznego wyświetlacza (identyfikowanego przez port) .

Realizacja

  • W przypadku urządzeń fizycznych port, do którego podłączone jest urządzenie wejściowe i port, do którego podłączony jest wyświetlacz, są używane do dopasowania wyświetlaczy do ekranów dotykowych.
  • Mapowania są przechowywane w InputReaderConfiguration .
  • TouchInputMapper.mViewport jest ustawiony na rzutni, który pasuje do portu określonego dla InputDevice.location .
  • Jeśli port urządzenia wejściowego jest określony w pliku mapowania, a obecnie nie ma rzutni, która ma pasujący port wyświetlania, urządzenie wejściowe na tym porcie jest wyłączone.
  • Jeśli port nie jest określony dla konkretnego urządzenia wejściowego, wtedy okno widoku jest ustawiane zgodnie z istniejącymi regułami.
  • W sterownikach wejściowych nie są wymagane żadne zmiany jądra.
  • Porty urządzeń wejściowych są określane za pomocą ioctl EVIOCGPHYS.