Pemilihan rute input

Di Android 9 dan yang lebih lama, tidak ada cara untuk berinteraksi dengan beberapa layar melalui sentuhan, karena tidak ada mekanisme pengaitan antara layar dan perangkat input. Misalnya, layar sentuh dapat memberikan 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 dalam dengan cara ini, tidak akan ada cara untuk menentukan perangkat input mana yang memiliki yang ditampilkan. Masalah yang sama berlaku untuk perangkat foldable dengan beberapa layar.

Android 10 menambahkan mekanisme untuk menentukan input perangkat yang termasuk dalam layar tertentu. Pengaitan dilakukan oleh nomor porta di mana port mengacu pada port fisik yang terhubung dengan layar.

Misalnya, jika perangkat Android memiliki dua port HDMI berlabel hdmi1 dan hdmi2, nilai port layar dapat berupa 1 dan 2. Nilai porta tetap sama meskipun tampilan yang berbeda tersambung (seperti model tampilan atau produsen yang berbeda) ke perangkat Port HDMI. Hal ini memungkinkan produsen perangkat memberikan petunjuk untuk memasang 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 porta yang terhubung dengan perangkat input. Untuk menentukan port yang terkait dengan perangkat tertentu, gunakan perintah terminal berikut, lalu tinjau propertilocation perangkat tersebut di Status Event Hub.

adb shell dumpsys input

Jika banyak perangkat terhubung, ketuk perangkat tertentu untuk memeriksa array RecentQueue di Status Pengendali Input. 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 address DisplayDeviceInfo untuk setiap tampilan pada Perangkat Display. Atau, gunakan adb shell dumpsys SurfaceFlinger --display-id untuk membuang informasi identifikasi untuk semua layar yang terhubung. Lihat juga ID tampilan statis.

Jika Anda menetapkan pengaitan untuk perangkat input tertentu dan elemen tidak ada dalam sistem, perangkat input dinonaktifkan sampai masing-masing akan muncul. Pengaitan hanya dilakukan untuk perangkat sentuh.

Pemilihan rute untuk multi-tampilan dinamis

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

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

Implementasi

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