Routing wejścia

W Androidzie 9 i starszych wersjach nie było możliwości interakcji z kilkoma wyświetlaczami dotykiem, ponieważ nie istniał mechanizm powiązania między wyświetlaczami a danymi wejściowymi urządzenia. Ekran dotykowy może np. mieć wyjście wideo HDMI. (które rejestrować jako wyświetlacz w Androidzie) i wyjście USB dla ekranu dotykowego (które zostałyby zarejestrowane jako urządzenie wejściowe). Jeśli w ten sposób połączysz kilka urządzeń, nie będzie można określić, 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.

W Androidzie 10 dodano mechanizm umożliwiający określenie, które urządzenia wejściowe należą do których wyświetlaczy. Powiązanie jest wykonywane na podstawie numerów portów, gdzie port odnosi się do fizycznego portu, do którego jest podłączony wyświetlacz.

Jeśli na przykład urządzenie z Androidem ma 2 porty HDMI z etykietą hdmi1 i hdmi2, wyświetlane wartości portów mogłyby mieć wartość 1, 2 Wartości portu pozostają takie same, nawet jeśli do tego samego fizycznego portu HDMI podłączony jest inny wyświetlacz (np. inny model lub inny producent). Dzięki temu producenci urządzeń mogą przekazywać instrukcje dotyczące montażu i uaktualnianie wyświetlaczy.

Powiązanie jest skonfigurowane w pliku /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 jest podłączony wyświetlacz. input="usb-xhci-hcd.0.auto-1.1/input0" określa port, do którego jest podłączone urządzenie wejściowe. Aby określić porty powiązanego z konkretnymi urządzeniami, użyj poniższego polecenia terminala, sprawdzić właściwość location tych urządzeń w stanie Centrum zdarzeń.

adb shell dumpsys input

Jeśli jest połączonych wiele urządzeń, kliknij konkretne urządzenie, aby sprawdzić tablicę RecentQueue w stanie modułu Input Dispatcher. Dzięki temu możesz zidentyfikować te urządzenia, które wygenerowały ostatnie zdarzenie. Odpowiednie urządzenie znajdziesz w stanie Event Hub.

Aby określić porty wyświetlacza przypisane do podłączonych wyświetlaczy, użyj polecenia adb shell dumpsys display, a następnie poszukaj właściwości address w przypadku DisplayDeviceInfo dla każdego wyświetlacza w sekcji Urządzenia wyświetlacza. Do wykonania zrzutu możesz też użyć polecenia adb shell dumpsys SurfaceFlinger --display-id danych identyfikacyjnych wszystkich podłączonych wyświetlaczy. Zobacz też Statyczne identyfikatory displayowe.

Jeśli określisz powiązanie z konkretnym urządzeniem wejściowym, a odpowiednia wyświetlacz nie jest obecny w systemie, urządzenie wejściowe jest wyłączone, dopóki nie pojawi się odpowiedni wyświetlacz. Powiązanie jest wykonywane tylko w przypadku urządzeń dotykowych.

Routing dla dynamicznych wyświetlaczy

Android 10 umożliwia konfigurowanie statycznych urządzeń z wieloma wyświetlaczami. Powiązania dynamiczne nie są jeszcze włączone. Jednak w niektórych przypadkach przez udostępnianie informacji routingu przez wyświetlacze i panele wejściowe, które nie są zawsze wyświetlać lub używać wirtualnych urządzeń wejściowych, a następnie zapewnić dodatkowy routing; i wysyłanie informacji do tych urządzeń wirtualnych. Jeśli implementacja urządzenia obsługuje:

  • W przypadku stacji dokującej ze stacją dokującą, konfiguracja routingu przekazane do kierowania z akcesorium wejściowego podłączonego do stacji dokującej (zidentyfikowane wyłącznie przez port) do wyświetlacza zewnętrznego (identyfikowanego na podstawie portu).
  • Ekran główny działający jako źródło sygnału (np. touchpad) po podłączeniu do wyświetlacza zewnętrznego, można by skonfigurować routing dla docelowych danych wejściowych z wirtualnego panelu dotykowego (identyfikowanego na podstawie unikalnego identyfikatora wirtualnego) do wyświetlacza zewnętrznego. (identyfikowany na podstawie portu).

Implementacja

  • W przypadku urządzeń fizycznych porty, do których podłączone są urządzenia wejściowe i wyświetlacze, są używane do dopasowywania wyświetlaczy do ekranów dotykowych.
  • Mapowania są przechowywane w regionie InputReaderConfiguration.
  • TouchInputMapper.mViewport jest ustawiony na widoczny obszar, który pasuje port określony dla: InputDevice.location.
  • Jeśli w pliku mapowania jest określony port urządzenia wejściowego i tam Obecnie nie jest to widoczny obszar z pasującym portem wyświetlacza, urządzenie z tym portem jest wyłączone.
  • Jeśli port nie został określony dla danego urządzenia wejściowego, widoczny obszar będzie ustaw zgodnie z obowiązującymi regułami.
  • Nie trzeba wprowadzać żadnych zmian w jądrze w sterownikach danych wejściowych.
  • Porty urządzenia wejściowego są określane za pomocą ioctl EVIOCGPHYS.