इनपुट रूटिंग

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

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

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

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

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

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

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

लागू करना

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