इनपुट रूटिंग

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" उस पोर्ट के बारे में बताता है जिससे इनपुट डिवाइस कनेक्ट किया गया है. किसी डिवाइस से जुड़े पोर्ट का पता लगाने के लिए, टर्मिनल में यह कमांड इस्तेमाल करें. इसके बाद, इवेंट हब स्टेटस में उन डिवाइसों की location प्रॉपर्टी की समीक्षा करें.

adb shell dumpsys input

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

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

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

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

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

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

लागू करना

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