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. Powiązanie odbywa się za pomocą numerów portów, gdzie port odnosi się do portu fizycznego, do którego podłączony jest wyświetlacz.

Na przykład, jeśli urządzenie z systemem Android ma dwa porty HDMI oznaczone jako hdmi1 i hdmi2 , wartościami portów wyświetlacza mogą 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.

Powiązanie jest konfigurowane 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 powyższym przykładzie 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 skojarzone z określonymi urządzeniami, użyj następującego polecenia terminala, a następnie przejrzyj właściwość location tych urządzeń w stanie Centrum zdarzeń.

adb shell dumpsys input

Jeśli podłączonych jest wiele urządzeń, dotknij określonego urządzenia, aby sprawdzić tablicę RecentQueue w stanie Input Dispatcher. 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 wyświetlania przypisane do podłączonych wyświetlaczy, użyj wyświetlacza adb shell dumpsys display a następnie poszukaj właściwości address DisplayDeviceInfo dla każdego wyświetlacza w obszarze Urządzenia wyświetlające. Alternatywnie użyj adb shell dumpsys SurfaceFlinger --display-id , aby zrzucić informacje identyfikacyjne dla wszystkich podłączonych wyświetlaczy. Zobacz także Statyczne identyfikatory wyświetlania .

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:

  • Doświadczenie podobne do komputera stacjonarnego ze stacją dokującą, a następnie konfiguracja routingu może być zapewniona 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, oraz port, do którego podłączony jest wyświetlacz, służą do dopasowania wyświetlaczy do ekranów dotykowych.
  • Mapowania są przechowywane w InputReaderConfiguration .
  • TouchInputMapper.mViewport jest ustawiony na widok, który odpowiada portowi określonemu dla InputDevice.location .
  • Jeśli port urządzenia wejściowego jest określony w pliku mapowania, a aktualnie 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, to 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.