অ্যান্ড্রয়েড ইনপুট সাবসিস্টেম নামমাত্র একটি ইভেন্ট পাইপলাইন নিয়ে গঠিত যা সিস্টেমের একাধিক স্তর অতিক্রম করে।
ইনপুট পাইপলাইন
সর্বনিম্ন স্তরে, ভৌত ইনপুট ডিভাইসটি সংকেত তৈরি করে যা রাজ্যের পরিবর্তনগুলি বর্ণনা করে যেমন কী প্রেস এবং স্পর্শের যোগাযোগ বিন্দু। ডিভাইস ফার্মওয়্যার এই সিগন্যালগুলিকে কিছু উপায়ে এনকোড করে এবং প্রেরণ করে যেমন সিস্টেমে USB HID রিপোর্ট পাঠিয়ে বা I2C বাসে বাধা তৈরি করে।
লিনাক্স কার্নেলের একটি ডিভাইস ড্রাইভার দ্বারা সংকেতগুলি ডিকোড করা হয়। Linux কার্নেল অনেক স্ট্যান্ডার্ড পেরিফেরালগুলির জন্য ড্রাইভার প্রদান করে, বিশেষ করে যেগুলি HID প্রোটোকল মেনে চলে। যাইহোক, একটি OEM প্রায়শই এমবেডেড ডিভাইসগুলির জন্য কাস্টম ড্রাইভার প্রদান করতে হবে যা একটি নিম্ন-স্তরে সিস্টেমে শক্তভাবে একত্রিত হয়, যেমন টাচ স্ক্রিন।
ইনপুট ডিভাইস ড্রাইভারগুলি লিনাক্স ইনপুট প্রোটোকলের মাধ্যমে ডিভাইস-নির্দিষ্ট সংকেতগুলিকে একটি স্ট্যান্ডার্ড ইনপুট ইভেন্ট ফরম্যাটে অনুবাদ করার জন্য দায়ী। লিনাক্স ইনপুট প্রোটোকল linux/input.h
কার্নেল হেডার ফাইলে ইভেন্টের ধরন এবং কোডগুলির একটি আদর্শ সেট সংজ্ঞায়িত করে। এইভাবে, কার্নেলের বাইরের উপাদানগুলিকে শারীরিক স্ক্যান কোড, HID ব্যবহার, I2C বার্তা, GPIO পিন এবং এর মতো বিশদ বিবরণের যত্ন নেওয়ার দরকার নেই।
এরপরে, Android EventHub
উপাদান প্রতিটি ইনপুট ডিভাইসের সাথে যুক্ত evdev
ড্রাইভার খুলে কার্নেল থেকে ইনপুট ইভেন্টগুলি পড়ে। অ্যান্ড্রয়েড ইনপুটরিডার কম্পোনেন্ট তারপর ডিভাইস ক্লাস অনুযায়ী ইনপুট ইভেন্টগুলি ডিকোড করে এবং অ্যান্ড্রয়েড ইনপুট ইভেন্টগুলির একটি স্ট্রীম তৈরি করে। এই প্রক্রিয়ার অংশ হিসাবে, লিনাক্স ইনপুট প্রোটোকল ইভেন্ট কোডগুলি ইনপুট ডিভাইস কনফিগারেশন, কীবোর্ড লেআউট ফাইল এবং বিভিন্ন ম্যাপিং টেবিল অনুসারে অ্যান্ড্রয়েড ইভেন্ট কোডগুলিতে অনুবাদ করা হয়।
অবশেষে, InputReader
ইনপুট ডিসপ্যাচারে ইনপুট ইভেন্টগুলি পাঠায় যা তাদের উপযুক্ত উইন্ডোতে ফরোয়ার্ড করে।
কন্ট্রোল পয়েন্ট
ইনপুট পাইপলাইনে বেশ কয়েকটি পর্যায় রয়েছে যা ইনপুট ডিভাইসের আচরণকে নিয়ন্ত্রণ করে।
ড্রাইভার এবং ফার্মওয়্যার কনফিগারেশন
ইনপুট ডিভাইস ড্রাইভাররা প্রায়শই রেজিস্টারে প্যারামিটার সেট করে বা ফার্মওয়্যার নিজেই আপলোড করে ইনপুট ডিভাইসের আচরণ কনফিগার করে। এটি বিশেষ করে টাচ স্ক্রিনগুলির মতো এমবেডেড ডিভাইসগুলির ক্ষেত্রে যেখানে ক্রমাঙ্কন প্রক্রিয়ার একটি বড় অংশে এই পরামিতিগুলি টিউন করা বা কাঙ্ক্ষিত নির্ভুলতা এবং প্রতিক্রিয়া প্রদান এবং শব্দ দমন করার জন্য ফার্মওয়্যার ঠিক করা জড়িত।
ড্রাইভার কনফিগারেশন বিকল্পগুলি প্রায়ই কার্নেল বোর্ড সমর্থন প্যাকেজ (BSP) এ মডিউল প্যারামিটার হিসাবে নির্দিষ্ট করা হয় যাতে একই ড্রাইভার একাধিক ভিন্ন হার্ডওয়্যার বাস্তবায়ন সমর্থন করতে পারে।
এই ডকুমেন্টেশন ড্রাইভার বা ফার্মওয়্যার কনফিগারেশন বর্ণনা করার চেষ্টা করে, কিন্তু এটি সাধারণভাবে ডিভাইস ক্রমাঙ্কন হিসাবে নির্দেশিকা প্রদান করে।
বোর্ড কনফিগারেশন বৈশিষ্ট্য
কার্নেল বোর্ড সমর্থন প্যাকেজ (BSP) SysFS এর মাধ্যমে বোর্ড কনফিগারেশন বৈশিষ্ট্যগুলি রপ্তানি করতে পারে যা Android InputReader উপাদান দ্বারা ব্যবহৃত হয়, যেমন একটি টাচ স্ক্রিনে ভার্চুয়াল কী স্থাপন করা।
বিভিন্ন ডিভাইস কিভাবে বোর্ড কনফিগারেশন বৈশিষ্ট্য ব্যবহার করে সে সম্পর্কে বিস্তারিত জানার জন্য ডিভাইস ক্লাস বিভাগগুলি পড়ুন।
সম্পদ ওভারলে
কিছু ইনপুট আচরণ config.xml
এ রিসোর্স ওভারলে যেমন ঢাকনা সুইচের অপারেশনের মাধ্যমে কনফিগার করা হয়।
এখানে কিছু উদাহরণ আছে:
config_lidKeyboardAccessibility
: হার্ডওয়্যার কীবোর্ড অ্যাক্সেসযোগ্য বা লুকানো কিনা তার উপর ঢাকনা সুইচের প্রভাব নির্দিষ্ট করে।config_lidNavigationAccessibility
: ট্র্যাকপ্যাড অ্যাক্সেসযোগ্য বা লুকানো কিনা তার উপর ঢাকনা সুইচের প্রভাব নির্দিষ্ট করে।config_longPressOnPowerBehavior
: ব্যবহারকারী যখন পাওয়ার বোতাম চেপে ধরে তখন কী ঘটবে তা নির্দিষ্ট করে।config_lidOpenRotation
: স্ক্রিন ওরিয়েন্টেশনে ঢাকনা সুইচের প্রভাব নির্দিষ্ট করে।
প্রতিটি কনফিগারেশন বিকল্প সম্পর্কে বিস্তারিত জানার জন্য frameworks/base/core/res/res/values/config.xml
এর মধ্যে ডকুমেন্টেশন পড়ুন।
মূল মানচিত্র
কী, জয়স্টিক বোতাম এবং জয়স্টিক অক্ষের জন্য লিনাক্স ইভেন্ট কোড থেকে অ্যান্ড্রয়েড ইভেন্ট কোডে ম্যাপিং কনফিগার করতে Android EventHub
এবং InputReader
উপাদান দ্বারা কী ম্যাপ ব্যবহার করা হয়। ম্যাপিং ডিভাইস বা ভাষা নির্ভর হতে পারে।
বিভিন্ন ডিভাইস কীভাবে কী ম্যাপ ব্যবহার করে সে সম্পর্কে বিস্তারিত জানার জন্য ডিভাইস ক্লাস বিভাগগুলি পড়ুন।
ইনপুট ডিভাইস কনফিগারেশন ফাইল
ইনপুট ডিভাইস কনফিগারেশন ফাইলগুলি Android EventHub
এবং InputReader
উপাদানগুলি দ্বারা বিশেষ ডিভাইস বৈশিষ্ট্যগুলি কনফিগার করার জন্য ব্যবহার করা হয় যেমন স্পর্শ আকারের তথ্য কীভাবে রিপোর্ট করা হয়৷
বিভিন্ন ডিভাইস কিভাবে ইনপুট ডিভাইস কনফিগারেশন মানচিত্র ব্যবহার করে সে সম্পর্কে বিস্তারিত জানার জন্য ডিভাইস ক্লাস বিভাগগুলি পড়ুন।
HID ব্যবহার এবং ইভেন্ট কোড বুঝুন
একটি কীবোর্ডের যে কোনো প্রদত্ত কী, একটি গেম কন্ট্রোলারের বোতাম, জয়স্টিক অক্ষ বা অন্যান্য নিয়ন্ত্রণের জন্য প্রায়শই বিভিন্ন শনাক্তকারী ব্যবহার করা হয়। এই শনাক্তকারীদের মধ্যে সম্পর্ক সবসময় একরকম হয় না: তারা ম্যাপিং টেবিলের একটি সেটের উপর নির্ভরশীল, যার মধ্যে কিছু স্থির, এবং কিছু যা ডিভাইসের বৈশিষ্ট্য, ডিভাইস ড্রাইভার, বর্তমান লোকেল, সিস্টেম কনফিগারেশনের উপর ভিত্তি করে পরিবর্তিত হয়। ব্যবহারকারীর পছন্দ এবং অন্যান্য কারণ।
- শারীরিক স্ক্যান কোড
একটি শারীরিক স্ক্যান কোড হল একটি ডিভাইস-নির্দিষ্ট শনাক্তকারী যা প্রতিটি কী, বোতাম বা অন্যান্য নিয়ন্ত্রণের সাথে যুক্ত। যেহেতু শারীরিক স্ক্যান কোডগুলি প্রায়শই একটি ডিভাইস থেকে অন্য ডিভাইসে পরিবর্তিত হয়, ফার্মওয়্যার বা ডিভাইস ড্রাইভার তাদের মানক শনাক্তকারী যেমন HID ব্যবহার বা Linux কী কোডগুলিতে ম্যাপ করার জন্য দায়ী।
স্ক্যান কোডগুলি মূলত কীবোর্ডের জন্য আগ্রহের বিষয়। অন্যান্য ডিভাইসগুলি সাধারণত GPIO পিন, I2C বার্তা বা অন্যান্য উপায় ব্যবহার করে নিম্ন-স্তরে যোগাযোগ করে। ফলস্বরূপ, সফ্টওয়্যার স্ট্যাকের উপরের স্তরগুলি কী ঘটছে তা বোঝার জন্য ডিভাইস ড্রাইভারের উপর নির্ভর করে।
- HID ব্যবহার
একটি HID ব্যবহার হল একটি আদর্শ শনাক্তকারী যা একটি নিয়ন্ত্রণের অবস্থা যেমন একটি কীবোর্ড কী, জয়স্টিক অক্ষ, মাউস বোতাম, বা স্পর্শ যোগাযোগ বিন্দুর রিপোর্ট করতে ব্যবহৃত হয়। বেশিরভাগ ইউএসবি এবং ব্লুটুথ ইনপুট ডিভাইসগুলি HID স্পেসিফিকেশনের সাথে সামঞ্জস্যপূর্ণ, যা সিস্টেমটিকে তাদের সাথে একটি অভিন্ন পদ্ধতিতে ইন্টারফেস করতে সক্ষম করে।
অ্যান্ড্রয়েড ফ্রেমওয়ার্ক লিনাক্স কী কোড এবং অন্যান্য শনাক্তকারীতে HID ব্যবহারের কোডগুলি অনুবাদ করতে Linux কার্নেল HID ড্রাইভারের উপর নির্ভর করে। তাই HID ব্যবহারগুলি মূলত পেরিফেরাল নির্মাতাদের আগ্রহের বিষয়।
- লিনাক্স কী কোড
একটি লিনাক্স কী কোড একটি কী বা বোতামের জন্য একটি আদর্শ শনাক্তকারী। লিনাক্স কী কোডগুলিকে
linux/input.h
হেডার ফাইলে সংজ্ঞায়িত করা হয়KEY_
বাBTN_
উপসর্গ দিয়ে শুরু হওয়া ধ্রুবকগুলি ব্যবহার করে। লিনাক্স কার্নেল ইনপুট ড্রাইভারগুলি লিনাক্স কী কোডগুলিতে শারীরিক স্ক্যান কোড, HID ব্যবহার এবং অন্যান্য ডিভাইস-নির্দিষ্ট সংকেত অনুবাদ করার জন্য এবংEV_KEY
ইভেন্টগুলির অংশ হিসাবে তাদের সম্পর্কে তথ্য সরবরাহ করার জন্য দায়ী।অ্যান্ড্রয়েড এপিআই কখনও কখনও একটি কী এর সাথে যুক্ত লিনাক্স কী কোডটিকে তার "স্ক্যান কোড" হিসাবে উল্লেখ করে। এটি প্রযুক্তিগতভাবে ভুল কিন্তু এটি এপিআই-এর অ্যান্ড্রয়েড কী কোড থেকে Linux কী কোডগুলিকে আলাদা করতে সাহায্য করে।
- লিনাক্স আপেক্ষিক বা পরম অক্ষ কোড
একটি লিনাক্স আপেক্ষিক বা পরম অক্ষ কোড একটি অক্ষ বরাবর আপেক্ষিক গতিবিধি বা পরম অবস্থান রিপোর্ট করার জন্য একটি আদর্শ শনাক্তকারী, যেমন তার X অক্ষ বরাবর একটি মাউসের আপেক্ষিক নড়াচড়া বা তার X অক্ষ বরাবর একটি জয়স্টিকের পরম অবস্থান। লিনাক্স অক্ষ কোড
linux/input.h
শিরোনাম ফাইলে সংজ্ঞায়িত করা হয় কনস্ট্যান্ট ব্যবহার করে যাREL_
বাABS_
উপসর্গ দিয়ে শুরু হয়। লিনাক্স কার্নেল ইনপুট ড্রাইভারগুলি এইচআইডি ব্যবহার এবং অন্যান্য ডিভাইস-নির্দিষ্ট সংকেতগুলি লিনাক্স অক্ষ কোডগুলিতে অনুবাদ করার জন্য এবংEV_REL
এবংEV_ABS
ইভেন্টগুলির অংশ হিসাবে তাদের সম্পর্কে তথ্য সরবরাহ করার জন্য দায়ী।- লিনাক্স সুইচ কোড
একটি লিনাক্স সুইচ কোড একটি ডিভাইসে একটি সুইচের অবস্থা, যেমন একটি ঢাকনা সুইচ রিপোর্ট করার জন্য একটি আদর্শ শনাক্তকারী। লিনাক্স সুইচ কোডগুলিকে
linux/input.h
হেডার ফাইলে সংজ্ঞায়িত করা হয়েছে যেগুলিSW_
উপসর্গ দিয়ে শুরু হওয়া ধ্রুবকগুলি ব্যবহার করে। লিনাক্স কার্নেল ইনপুট ড্রাইভারEV_SW
ইভেন্ট হিসাবে সুইচ স্টেট পরিবর্তনের রিপোর্ট করে।অ্যান্ড্রয়েড অ্যাপ্লিকেশানগুলি সাধারণত সুইচগুলি থেকে ইভেন্টগুলি গ্রহণ করে না, তবে সিস্টেম বিভিন্ন ডিভাইস-নির্দিষ্ট ফাংশন নিয়ন্ত্রণ করতে অভ্যন্তরীণভাবে সেগুলি ব্যবহার করতে পারে৷
- অ্যান্ড্রয়েড কী কোড
একটি অ্যান্ড্রয়েড কী কোড হল 'হোম'-এর মতো একটি নির্দিষ্ট কী নির্দেশ করার জন্য অ্যান্ড্রয়েড এপিআই-তে সংজ্ঞায়িত একটি আদর্শ শনাক্তকারী। Android কী কোডগুলিকে
android.view.KeyEvent
ক্লাস দ্বারা সংজ্ঞায়িত করা হয় ধ্রুবক হিসাবে যাKEYCODE_
উপসর্গ দিয়ে শুরু হয়।কী লেআউটটি নির্দিষ্ট করে কিভাবে লিনাক্স কী কোডগুলি অ্যান্ড্রয়েড কী কোডগুলিতে ম্যাপ করা হয়। কীবোর্ড মডেল, ভাষা, দেশ, লেআউট বা বিশেষ ফাংশনের উপর নির্ভর করে বিভিন্ন কী লেআউট ব্যবহার করা যেতে পারে।
অ্যান্ড্রয়েড কী কোডগুলির সংমিশ্রণগুলি একটি ডিভাইস এবং লোকেল নির্দিষ্ট কী অক্ষর মানচিত্র ব্যবহার করে অক্ষর কোডে রূপান্তরিত হয়। উদাহরণস্বরূপ, যখন
KEYCODE_SHIFT
এবংKEYCODE_A
হিসাবে চিহ্নিত কীগুলি উভয়ই একসাথে চাপানো হয়, তখন সিস্টেম কী অক্ষর মানচিত্রে সংমিশ্রণটি সন্ধান করে এবং বড় অক্ষর 'A' খুঁজে পায়, যা বর্তমানে ফোকাস করা পাঠ্য উইজেটে ঢোকানো হয়।- অ্যান্ড্রয়েড অ্যাক্সিস কোড
একটি Android অক্ষ কোড একটি নির্দিষ্ট ডিভাইস অক্ষ নির্দেশ করার জন্য Android API এ সংজ্ঞায়িত একটি আদর্শ শনাক্তকারী। Android অক্ষ কোডগুলিকে
android.view.MotionEvent
শ্রেণী দ্বারা সংজ্ঞায়িত করা হয় ধ্রুবক হিসাবে যাAXIS_
উপসর্গ দিয়ে শুরু হয়।কী লেআউটটি উল্লেখ করে যে কীভাবে লিনাক্স অ্যাক্সিস কোডগুলি অ্যান্ড্রয়েড অক্ষ কোডগুলিতে ম্যাপ করা হয়। ডিভাইসের মডেল, ভাষা, দেশ, লেআউট বা বিশেষ ফাংশনের উপর নির্ভর করে বিভিন্ন কী লেআউট ব্যবহার করা যেতে পারে।
- অ্যান্ড্রয়েড মেটা স্টেট
একটি অ্যান্ড্রয়েড মেটা স্টেট হল একটি স্ট্যান্ডার্ড আইডেন্টিফায়ার যা Android API-এ সংজ্ঞায়িত করা হয়েছে তা বোঝানোর জন্য যে কোন মডিফায়ার কী টিপানো হয়েছে। Android মেটা স্টেটগুলিকে
android.view.KeyEvent
ক্লাস দ্বারা সংজ্ঞায়িত করা হয় ধ্রুবক হিসাবে যাMETA_
উপসর্গ দিয়ে শুরু হয়।বর্তমান মেটা অবস্থা Android InputReader উপাদান দ্বারা নির্ধারিত হয় যা
KEYCODE_SHIFT_LEFT
এর মতো সংশোধক কীগুলি কখন চাপা/মুক্ত করা হয় এবং উপযুক্ত মেটা স্টেট পতাকা সেট/রিসেট করা হয় তা পর্যবেক্ষণ করে।মডিফায়ার কী এবং মেটা স্টেটের মধ্যে সম্পর্ক হার্ডকোড করা হয়েছে কিন্তু কী লেআউট পরিবর্তন করতে পারে কিভাবে মডিফায়ার কীগুলিকে ম্যাপ করা হয় যা মেটা স্টেটকে প্রভাবিত করে।
- অ্যান্ড্রয়েড বোতামের অবস্থা
একটি অ্যান্ড্রয়েড বোতাম স্টেট হল একটি স্ট্যান্ডার্ড শনাক্তকারী যা Android API-এ সংজ্ঞায়িত করা হয়েছে কোন বোতামগুলি (একটি মাউস বা স্টাইলাসে) টিপে তা নির্দেশ করার জন্য৷ Android বোতামের অবস্থাগুলিকে
android.view.MotionEvent
ক্লাস দ্বারা সংজ্ঞায়িত করা হয় ধ্রুবক হিসাবে যাBUTTON_
উপসর্গ দিয়ে শুরু হয়।বর্তমান বোতামের অবস্থা অ্যান্ড্রয়েড ইনপুটরিডার উপাদান দ্বারা নির্ধারিত হয় যা মনিটর করে যখন বোতামগুলি (মাউস বা স্টাইলাসে) টিপে/মুক্ত করা হয় এবং উপযুক্ত বোতাম স্টেট পতাকা সেট/রিসেট করে।
বোতাম এবং বোতাম রাজ্যের মধ্যে সম্পর্ক হার্ডকোড করা হয়।