Android 9 এবং তার আগের ভার্সনে, টাচের মাধ্যমে একাধিক ডিসপ্লেতে ইন্টার্যাক্ট করার কোনও উপায় ছিল না, কারণ ডিসপ্লে এবং ইনপুট ডিভাইসের মধ্যে কোনও অ্যাসোসিয়েশন মেকানিজম ছিল না। যেমন, একটি টাচস্ক্রিন ডিসপ্লে HDMI ভিডিও আউটপুট (যা Android-এ ডিসপ্লে হিসেবে রেজিস্টার করবে) এবং টাচস্ক্রিনের জন্য USB আউটপুট (যা ইনপুট ডিভাইস হিসেবে রেজিস্টার করবে) প্রদান করতে পারে। একাধিক ডিভাইস এইভাবে কানেক্ট করা থাকলে, কোন ইনপুট ডিভাইস কোন ডিসপ্লের সাথে কানেক্ট করা আছে তা নির্ধারণ করার কোনও উপায় থাকবে না। একই সমস্যা একাধিক বিল্ট-ইন ডিসপ্লে সহ ফোল্ড করা যায় এমন ডিভাইসের ক্ষেত্রেও প্রযোজ্য।
কোন ইনপুট ডিভাইস কোন ডিসপ্লের সাথে সম্পর্কিত তা নির্দিষ্ট করার জন্য Android 10-এ একটি মেকানিজম যোগ করা হয়েছে। পোর্ট নম্বরের মাধ্যমে অ্যাসোসিয়েশন করা হয়, যেখানে পোর্ট বলতে সেই ফিজিক্যাল পোর্টকে বোঝানো হয় যার সাথে ডিসপ্লে কানেক্ট করা থাকে।
যেমন, কোনও Android ডিভাইসে hdmi1
এবং hdmi2 লেবেল সহ দুটি HDMI পোর্ট থাকলে, ডিসপ্লে পোর্ট ভ্যালু 1 এবং
2 হতে পারে। একই ফিজিক্যাল HDMI পোর্টে অন্য ডিসপ্লে (যেমন, অন্য ডিসপ্লে মডেল বা প্রস্তুতকারক) কানেক্ট করা হলেও পোর্ট ভ্যালু একই থাকে। এর ফলে ডিভাইস প্রস্তুতকারকরা ডিসপ্লে অ্যাসেম্বল
ও আপগ্রেড করার নির্দেশাবলী দিতে পারেন।
/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"
ইনপুট ডিভাইস যে পোর্টে কানেক্ট করা আছে সেটি নির্দিষ্ট করে। নির্দিষ্ট ডিভাইসের সাথে যুক্ত পোর্ট
নির্ধারণ করতে, নিম্নলিখিত টার্মিনাল কমান্ড ব্যবহার করুন এবং তারপরে
Event Hub State-এ সেইসব ডিভাইসেরlocation প্রপার্টি পর্যালোচনা করুন।
adb shell dumpsys input
অনেক ডিভাইস কানেক্ট করা থাকলে, Input Dispatcher State-এ
RecentQueue অ্যারে পরীক্ষা করতে কোনও নির্দিষ্ট ডিভাইসে ট্যাপ করুন। তারপর আপনি সেইসব ডিভাইস শনাক্ত করতে পারবেন
যেগুলি সবচেয়ে সাম্প্রতিক ইভেন্ট তৈরি করেছে। তারপর আপনি Event Hub State-এ
সংশ্লিষ্ট ডিভাইসটি খুঁজে পাবেন।
কানেক্ট করা ডিসপ্লেতে অ্যাসাইন করা ডিসপ্লে পোর্ট নির্ধারণ করতে, adb shell dumpsys display ব্যবহার করুন এবং তারপরে ডিসপ্লে ডিভাইসের অধীনে প্রতিটি ডিসপ্লের জন্য DisplayDeviceInfo-এর address
প্রপার্টি খুঁজুন।
অথবা, কানেক্ট করা সব ডিসপ্লের জন্য
পরিচয় সংক্রান্ত তথ্য ডাম্প করতে adb shell dumpsys SurfaceFlinger --display-id ব্যবহার করুন। এছাড়াও
স্ট্যাটিক ডিসপ্লে শনাক্তকারী দেখুন।
আপনি যদি কোনও নির্দিষ্ট ইনপুট ডিভাইসের জন্য একটি অ্যাসোসিয়েশন নির্দিষ্ট করেন এবং সংশ্লিষ্ট ডিসপ্লে সিস্টেমে উপস্থিত না থাকে, তাহলে সংশ্লিষ্ট ডিসপ্লে না আসা পর্যন্ত ইনপুট ডিভাইসটি বন্ধ থাকে। এই অ্যাসোসিয়েশন শুধুমাত্র টাচ ডিভাইসের জন্য করা হয়।
ডায়নামিক মাল্টি-ডিসপ্লের জন্য রাউটিং
Android 10 আপনাকে স্ট্যাটিক মাল্টি-ডিসপ্লে ডিভাইস সেট-আপ করতে দেয়। ডায়নামিক অ্যাসোসিয়েশন এখনও চালু করা হয়নি। তবে, কিছু ব্যবহারের ক্ষেত্রে ডিসপ্লে ও ইনপুট প্যানেলের জন্য রাউটিং সংক্রান্ত তথ্য প্রদান করে সমাধান করা যেতে পারে, যা সবসময় উপস্থিত থাকে না অথবা ভার্চুয়াল ইনপুট ডিভাইস ব্যবহার করে এবং তারপরে সেইসব ভার্চুয়াল ডিভাইসে অতিরিক্ত রাউটিং সংক্রান্ত তথ্য প্রদান করে সমাধান করা যেতে পারে। কোনও ডিভাইস ইমপ্লিমেন্টেশন যদি:
- ডকিং স্টেশনের সাথে ডেস্কটপের মতো অভিজ্ঞতা, তাহলে ডকে কানেক্ট করা ইনপুট অ্যাক্সেসরি (পোর্ট দ্বারা অনন্যভাবে চিহ্নিত করা হয়) থেকে এক্সটার্নাল ডিসপ্লেতে (পোর্ট দ্বারা চিহ্নিত করা হয়) টার্গেট ইনপুটের জন্য একটি রাউটিং কনফিগারেশন প্রদান করা যেতে পারে।
- এক্সটার্নাল ডিসপ্লের সাথে কানেক্ট করা হলে, প্রাইমারি স্ক্রিন ইনপুট সোর্স (যেমন টাচপ্যাড) হিসেবে কাজ করে। তখন ভার্চুয়াল টাচ প্যানেল (অনন্য ভার্চুয়াল আইডি দ্বারা শনাক্ত করা হয়) থেকে এক্সটার্নাল ডিসপ্লেতে (পোর্ট দ্বারা শনাক্ত করা হয়) ইনপুট টার্গেট করার জন্য রাউটিং কনফিগারেশন প্রদান করা যেতে পারে।
প্রয়োগ
- ফিজিক্যাল ডিভাইসের ক্ষেত্রে, ইনপুট ডিভাইস যে পোর্টে কানেক্ট করা আছে এবং ডিসপ্লে যে পোর্টে কানেক্ট করা আছে, সেগুলি টাচস্ক্রিনের সাথে ডিসপ্লে ম্যাচ করানোর জন্য ব্যবহার করা হয়।
- ম্যাপিং
InputReaderConfiguration-এ স্টোর করা হয়। TouchInputMapper.mViewportভিউপোর্টে সেট করা আছে যাInputDevice.location-এর জন্য নির্দিষ্ট করা পোর্টের সাথে ম্যাচ করে।- ম্যাপিং ফাইলে ইনপুট ডিভাইস পোর্ট উল্লেখ করা থাকলে এবং বর্তমানে ম্যাচিং ডিসপ্লে পোর্ট সহ কোনও ভিউপোর্ট না থাকলে, সেই পোর্টে ইনপুট ডিভাইস বন্ধ করা থাকে।
- কোনও নির্দিষ্ট ইনপুট ডিভাইসের জন্য পোর্ট উল্লেখ করা না থাকলে, ভিউপোর্ট আগে থেকে থাকা নিয়ম অনুযায়ী সেট করা হয়।
- ইনপুট ড্রাইভারের মধ্যে কোনও কার্নেল পরিবর্তন করার প্রয়োজন নেই।
- ইনপুট ডিভাইস পোর্ট EVIOCGPHYS ioctl ব্যবহার করে নির্ধারণ করা হয়।