इनपुट रूटिंग

एंड्रॉइड 9 और उससे पहले के संस्करण में, टच के माध्यम से कई डिस्प्ले के साथ इंटरैक्ट करने का कोई तरीका नहीं था, क्योंकि डिस्प्ले और इनपुट डिवाइस के बीच कोई जुड़ाव तंत्र नहीं था। उदाहरण के लिए, एक टचस्क्रीन डिस्प्ले एक एचडीएमआई वीडियो आउटपुट (जो एंड्रॉइड पर डिस्प्ले के रूप में पंजीकृत होगा) और टचस्क्रीन के लिए एक यूएसबी आउटपुट (जो एक इनपुट डिवाइस के रूप में पंजीकृत होगा) प्रदान कर सकता है। यदि कई डिवाइस इस तरीके से जुड़े होते, तो यह निर्धारित करने का कोई तरीका नहीं होता कि कौन सा इनपुट डिवाइस किस डिस्प्ले से संबंधित है। यही समस्या कई बिल्ट-इन डिस्प्ले वाले फोल्डेबल डिवाइस पर भी लागू होती है।

एंड्रॉइड 10 ने यह निर्दिष्ट करने के लिए एक तंत्र जोड़ा कि कौन से इनपुट डिवाइस किस डिस्प्ले से संबंधित हैं। एसोसिएशन पोर्ट नंबरों द्वारा किया जाता है जहां पोर्ट उस भौतिक पोर्ट को संदर्भित करता है जिससे डिस्प्ले जुड़ा हुआ है।

उदाहरण के लिए, यदि किसी एंड्रॉइड डिवाइस में hdmi1 और hdmi2 लेबल वाले दो HDMI पोर्ट हैं, तो डिस्प्ले पोर्ट मान 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 उपयोग करें। स्टेटिक डिस्प्ले आइडेंटिफ़ायर भी देखें।

यदि आप किसी विशिष्ट इनपुट डिवाइस के लिए एसोसिएशन निर्दिष्ट करते हैं और संबंधित डिस्प्ले सिस्टम में मौजूद नहीं है, तो संबंधित डिस्प्ले दिखाई देने तक इनपुट डिवाइस अक्षम है। एसोसिएशन केवल स्पर्श उपकरणों के लिए किया जाता है।

गतिशील मल्टी-डिस्प्ले के लिए रूटिंग

एंड्रॉइड 10 आपको स्थिर मल्टी-डिस्प्ले डिवाइस सेट करने में सक्षम बनाता है। डायनामिक एसोसिएशन अभी तक सक्षम नहीं हैं. हालाँकि, कुछ उपयोग के मामलों को उन डिस्प्ले और इनपुट पैनल के लिए रूटिंग जानकारी प्रदान करके संबोधित किया जा सकता है जो हमेशा मौजूद नहीं होते हैं या वर्चुअल इनपुट डिवाइस का उपयोग करते हैं और फिर उन वर्चुअल डिवाइस को अतिरिक्त रूटिंग जानकारी प्रदान करते हैं। यदि कोई उपकरण कार्यान्वयन इसका समर्थन करता है:

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

कार्यान्वयन

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