Pemilihan rute input

Di Android 9 dan yang lebih rendah, tidak ada cara untuk berinteraksi dengan beberapa layar melalui sentuhan, karena tidak ada mekanisme asosiasi antara layar dan perangkat input. Misalnya, layar sentuh dapat menyediakan output video HDMI (yang akan terdaftar sebagai layar di Android) dan output USB untuk layar sentuh (yang akan terdaftar sebagai perangkat input). Jika beberapa perangkat terhubung dengan cara ini, tidak akan ada cara untuk menentukan perangkat input mana yang termasuk dalam tampilan mana. Masalah yang sama berlaku untuk perangkat foldable dengan beberapa layar bawaan.

Android 10 menambahkan mekanisme untuk menentukan perangkat input mana yang termasuk dalam tampilan mana. Asosiasi dilakukan berdasarkan nomor port dengan port mengacu pada port fisik tempat layar terhubung.

Misalnya, jika perangkat Android memiliki dua port HDMI berlabel hdmi1 dan hdmi2, nilai port layar dapat berupa 1 dan 2. Nilai port tetap sama meskipun layar yang berbeda (seperti model atau produsen layar yang berbeda) terhubung ke port HDMI fisik yang sama. Hal ini memungkinkan produsen perangkat memberikan petunjuk untuk merakit dan mengupgrade layar.

Pengaitan dikonfigurasi di /vendor/etc/input-port-associations.xml. Contoh:

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

Pada contoh di atas, display="0" menentukan port tempat layar terhubung. input="usb-xhci-hcd.0.auto-1.1/input0" menentukan port tempat perangkat input terhubung. Untuk menentukan port yang terkait dengan perangkat tertentu, gunakan perintah terminal berikut, lalu tinjau properti location perangkat tersebut di Status Event Hub.

adb shell dumpsys input

Jika banyak perangkat terhubung, ketuk perangkat tertentu untuk memeriksa array RecentQueue di Status Pengiriman Input. Kemudian, Anda dapat mengidentifikasi perangkat yang menghasilkan peristiwa terbaru. Kemudian, Anda dapat menemukan perangkat yang sesuai di Status Hub Acara.

Untuk menentukan port layar yang ditetapkan ke layar yang terhubung, gunakan adb shell dumpsys display, lalu cari properti address dari DisplayDeviceInfo untuk setiap layar di bagian Perangkat Layar. Atau, gunakan adb shell dumpsys SurfaceFlinger --display-id untuk mengekstrak informasi identifikasi semua layar yang terhubung. Lihat juga ID tampilan statis.

Jika Anda menentukan asosiasi untuk perangkat input tertentu dan layar yang sesuai tidak ada dalam sistem, perangkat input akan dinonaktifkan hingga layar yang dimaksud muncul. Asosiasi hanya dilakukan untuk perangkat sentuh.

Pemilihan rute untuk multi-tampilan dinamis

Android 10 memungkinkan Anda menyiapkan perangkat multi-tampilan statis. Asosiasi dinamis belum diaktifkan. Namun, beberapa kasus penggunaan dapat ditangani dengan memberikan informasi perutean untuk tampilan dan panel input yang tidak selalu ada atau menggunakan perangkat input virtual, lalu memberikan informasi perutean tambahan ke perangkat virtual tersebut. Jika penerapan perangkat mendukung:

  • Pengalaman seperti desktop dengan docking station, lalu konfigurasi perutean dapat disediakan untuk menargetkan input dari aksesori input yang terhubung ke dock (diidentifikasi secara unik oleh port) ke layar eksternal (diidentifikasi oleh port).
  • Layar utama berfungsi sebagai sumber input (seperti touchpad) saat terhubung ke layar eksternal, lalu konfigurasi perutean dapat diberikan untuk menargetkan input dari panel sentuh virtual (diidentifikasi oleh ID virtual unik) ke layar eksternal (diidentifikasi oleh port).

Implementasi

  • Untuk perangkat fisik, port tempat perangkat input terhubung dan port tempat layar terhubung digunakan untuk mencocokkan layar dengan layar sentuh.
  • Pemetaan disimpan di InputReaderConfiguration.
  • TouchInputMapper.mViewport disetel ke area tampilan yang cocok dengan port yang ditentukan untuk InputDevice.location.
  • Jika port perangkat input ditentukan dalam file pemetaan, dan saat ini tidak ada area tampilan yang memiliki port layar yang cocok, perangkat input di port tersebut akan dinonaktifkan.
  • Jika port tidak ditentukan untuk perangkat input tertentu, maka area tampilan ditetapkan sesuai dengan aturan yang ada.
  • Tidak ada perubahan kernel yang diperlukan di driver input.
  • Port perangkat input ditentukan menggunakan ioctl EVIOCGPHYS.