इनपुट रूटिंग

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 का इस्तेमाल करके तय किए जाते हैं.