इनपुट रूटिंग

Android 9 और इससे पहले के वर्शन में, कई डिसप्ले से इंटरैक्ट करने का कोई तरीका नहीं था टच के ज़रिए कॉल किया जा सकता है. ऐसा इसलिए, क्योंकि डिसप्ले और इनपुट के बीच किसी तरह का असोसिएशन नहीं था डिवाइस. उदाहरण के लिए, टचस्क्रीन डिसप्ले से एचडीएमआई वीडियो आउटपुट मिल सकता है (जो Android पर डिसप्ले के तौर पर रजिस्टर होगा) और टचस्क्रीन के लिए यूएसबी आउटपुट (जो इनपुट डिवाइस के रूप में रजिस्टर होगा). अगर कई डिवाइस इस तरह से, यह तय करने का कोई तरीका नहीं होगा कि जो दिखाई देते हैं. यही समस्या, फ़ोल्ड किए जा सकने वाले उन डिवाइसों पर भी लागू होती है जिनमें एक से ज़्यादा डिवाइस पहले से मौजूद होते हैं दिखाएं.

Android 10 में एक तरीका जोड़ा गया है, जिसकी मदद से यह तय किया जा सकता है कि कौनसा इनपुट किस डिसप्ले से जुड़े हैं. यह जुड़ाव, पोर्ट नंबर के ज़रिए किया जाता है. पोर्ट का मतलब उस फ़िज़िकल पोर्ट से है जिससे डिसप्ले कनेक्ट किया गया है.

उदाहरण के लिए, अगर किसी Android डिवाइस में hdmi1 लेबल वाले दो एचडीएमआई पोर्ट हैं और hdmi2 है, तो डिसप्ले पोर्ट की वैल्यू 1 और 2. किसी दूसरे डिसप्ले के होने पर भी पोर्ट की वैल्यू एक जैसी ही रहती हैं एक ही फ़िज़िकल से कनेक्ट (जैसे कि कोई दूसरा डिसप्ले मॉडल या मैन्युफ़ैक्चरर) एचडीएमआई पोर्ट. इससे डिवाइस बनाने वाली कंपनियां, असेंबल करने के लिए निर्देश दे पाती हैं और डिसप्ले अपग्रेड करें.

असोसिएशन को /vendor/etc/input-port-associations.xml में कॉन्फ़िगर किया गया है. उदाहरण के लिए:

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

ऊपर दिए गए उदाहरण में, display="0" वह पोर्ट तय करता है जिसमें डिसप्ले कनेक्ट है. input="usb-xhci-hcd.0.auto-1.1/input0" अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है उस पोर्ट के बारे में बताता है जिससे इनपुट डिवाइस कनेक्ट है. पोर्ट तय करने के लिए करने के लिए, नीचे दिए गए टर्मिनल निर्देश का इस्तेमाल करें. इसके बाद, Event Hub की स्थिति में उन डिवाइसों की location प्रॉपर्टी की समीक्षा करें.

adb shell dumpsys input

अगर कई डिवाइस कनेक्ट हैं, तो इनपुट डिस्पैचर की स्थिति में RecentQueue कलेक्शन. इसके बाद ही, वे डिवाइस जिनका सबसे हाल का इवेंट जनरेट हुआ था. इसके बाद, आपको इवेंट हब स्टेट में उस डिवाइस से जुड़ा होना चाहिए.

कनेक्ट किए गए डिसप्ले के लिए असाइन किए गए डिसप्ले पोर्ट का पता लगाने के लिए, इसका इस्तेमाल करें adb shell dumpsys display और फिर address देखें DisplayDeviceInfo की प्रॉपर्टी है. इसके अलावा, डंप करने के लिए adb shell dumpsys SurfaceFlinger --display-id का इस्तेमाल करें कनेक्ट किए गए सभी डिसप्ले की पहचान से जुड़ी जानकारी. इन्हें भी देखें स्टैटिक डिसप्ले आइडेंटिफ़ायर.

अगर किसी इनपुट डिवाइस और उससे जुड़े सिस्टम में डिस्प्ले मौजूद नहीं है, तो इनपुट डिवाइस तब तक अक्षम रहता है जब तक डिसप्ले दिखता है. कनेक्शन सिर्फ़ टच डिवाइसों के लिए किया जाता है.

डाइनैमिक मल्टी-डिसप्ले के लिए रूटिंग

Android 10 में स्टैटिक मल्टी-डिसप्ले सेट अप किया जा सकता है डिवाइस. डायनैमिक असोसिएशन अभी तक चालू नहीं किए गए हैं. हालांकि, इसके इस्तेमाल के कुछ उदाहरण उन डिसप्ले और इनपुट पैनल के लिए रूटिंग की जानकारी देकर पता लगाया जाता है जो हमेशा वर्चुअल इनपुट डिवाइस का इस्तेमाल करना या फिर अतिरिक्त रूटिंग उपलब्ध कराना उन वर्चुअल डिवाइसों को जानकारी देना. अगर डिवाइस पर ये सुविधाएं काम करती हैं, तो:

  • डॉकिंग स्टेशन के साथ डेस्कटॉप जैसा अनुभव मिलता है, तो रूटिंग कॉन्फ़िगरेशन डॉक से कनेक्ट की गई इनपुट ऐक्सेसरी से इनपुट को टारगेट करने के लिए दिया गया (पहचान की गई खास तौर पर पोर्ट के हिसाब से).
  • कनेक्ट होने पर, इनपुट सोर्स (जैसे कि टचपैड) की तरह काम करने वाली प्राइमरी स्क्रीन बाहरी डिसप्ले से कनेक्ट किया है, तो टारगेट इनपुट के लिए एक रूटिंग कॉन्फ़िगरेशन दिया जा सकता है वर्चुअल टच पैनल (यूनीक वर्चुअल आईडी से पहचाने जाने वाले) से बाहरी डिसप्ले तक (पोर्ट के ज़रिए पहचानी गई).

लागू करना

  • फ़िज़िकल डिवाइसों के लिए, वह पोर्ट जिससे इनपुट डिवाइस कनेक्ट है और जिस पोर्ट से डिस्प्ले कनेक्ट है, उसका उपयोग टचस्क्रीन वाले डिस्प्ले से मिलान करने के लिए किया जाता है.
  • मैपिंग, InputReaderConfiguration में सेव की जाती हैं.
  • TouchInputMapper.mViewport को उस व्यूपोर्ट पर सेट किया गया है जो मेल खाता है InputDevice.location के लिए तय किया गया पोर्ट.
  • यदि मैपिंग फ़ाइल में इनपुट डिवाइस पोर्ट के बारे में बताया गया है, और फ़िलहाल, ऐसा व्यूपोर्ट नहीं है जिसमें मिलता-जुलता डिसप्ले पोर्ट है, तो इनपुट उस पोर्ट के डिवाइस को बंद कर दिया गया हो.
  • अगर किसी इनपुट डिवाइस के लिए कोई पोर्ट तय नहीं किया गया है, तो व्यूपोर्ट को मौजूदा नियमों के अनुसार सेट किया जा सकता है.
  • इनपुट ड्राइवर में कर्नेल के बदलाव की ज़रूरत नहीं है.
  • इनपुट डिवाइस पोर्ट का पता, EVIOCGPHYS ioctl का इस्तेमाल करके लगाया जाता है.