Perutean masukan

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, tampilan layar sentuh dapat menyediakan output video HDMI (yang akan didaftarkan sebagai tampilan di Android) dan output USB untuk layar sentuh (yang akan didaftarkan sebagai perangkat input). Jika beberapa perangkat dihubungkan dengan cara ini, tidak akan ada cara untuk menentukan perangkat input mana yang termasuk dalam tampilan mana. Masalah yang sama juga berlaku pada perangkat lipat dengan beberapa layar internal.

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

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

Asosiasi dikonfigurasikan di /vendor/etc/input-port-associations.xml . Misalnya:

<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 yang terhubung dengan layar. input="usb-xhci-hcd.0.auto-1.1/input0" menentukan port yang terhubung dengan perangkat input. 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 yang terhubung, ketuk perangkat tertentu untuk memeriksa larik RecentQueue di Status Input Dispatcher. Anda kemudian dapat mengidentifikasi perangkat yang menghasilkan peristiwa terbaru. Anda kemudian dapat menemukan perangkat yang sesuai di Status Event Hub.

Untuk menentukan port tampilan yang ditetapkan ke layar yang terhubung, gunakan adb shell dumpsys display lalu cari properti address DisplayDeviceInfo untuk setiap tampilan di bawah Perangkat Tampilan. Alternatifnya, gunakan adb shell dumpsys SurfaceFlinger --display-id untuk membuang informasi identifikasi untuk semua layar yang terhubung. Lihat juga Pengidentifikasi tampilan statis .

Jika Anda menentukan asosiasi untuk perangkat input tertentu dan tampilan terkait tidak ada di sistem, perangkat input akan dinonaktifkan hingga tampilan terkait muncul. Penggabungan dilakukan hanya untuk perangkat sentuh.

Perutean untuk multi-display dinamis

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

  • Pengalaman seperti desktop dengan stasiun dok, maka konfigurasi perutean dapat diberikan untuk menargetkan input dari aksesori input yang tersambung ke dok (diidentifikasi secara unik berdasarkan port) ke layar eksternal (diidentifikasi berdasarkan port).
  • Layar utama bertindak sebagai sumber masukan (seperti bidang sentuh) saat tersambung ke layar eksternal, lalu konfigurasi perutean dapat diberikan untuk menargetkan masukan dari panel sentuh virtual (diidentifikasi dengan ID virtual unik) ke layar eksternal (diidentifikasi berdasarkan port) .

Penerapan

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