इनपुट रूटिंग

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

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

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

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

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

लागू करना

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