इनपुट रूटिंग

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 का इस्तेमाल करके, इनपुट डिवाइस के पोर्ट तय किए जाते हैं.