OEM কাস্টম ইনপুট

নতুন এবং নন-স্ট্যান্ডার্ড অ্যান্ড্রয়েড ফিচারগুলোর জন্য নতুন কার ইনপুট ইভেন্ট যোগ করতে OEM কাস্টম ইনপুট ব্যবহার করুন। নন-স্ট্যান্ডার্ড ইনপুট ইভেন্টগুলো বিদ্যমান অ্যান্ড্রয়েড KeyEvent দ্বারা ম্যাপ করা হয় না, যা জেনেরিক হওয়ার জন্য এবং যেকোনো অ্যান্ড্রয়েড সারফেসে কাজ করার জন্য ডিজাইন করা হয়েছে, কিন্তু OEM-নির্দিষ্ট ফিচারগুলো বাস্তবায়নের জন্য এটিকে প্রসারিত করা হয়নি। উদাহরণস্বরূপ, স্টিয়ারিং হুইল কন্ট্রোলে অবস্থিত একটি বাটন, যা চাপলে (একটি ইন্টেন্টের মাধ্যমে) গাড়ির বর্তমান অবস্থানসহ একটি ম্যাপস অ্যাপ খোলে। এই ফিচারটি চালকদের গাড়ি চালানোর সময় মনোযোগ বিক্ষিপ্ত না করে তাদের বর্তমান অবস্থান দেখতে সক্ষম করে।

এই নিবন্ধে বর্ণনা করা হয়েছে কীভাবে একটি বিদ্যমান অ্যান্ড্রয়েড KeyEvent পুনরায় ব্যবহার করে একটি CustomInputEvent তৈরি করা যায়, যা শুধুমাত্র তখনই ব্যবহার করা যাবে যখন কোনো ফিচারকে উপস্থাপন করার জন্য অন্য কোনো অ্যান্ড্রয়েড KeyEvent ব্যবহার করা সম্ভব হবে না।

HW_CUSTOM_INPUT

একটি OEM কাস্টম ইনপুট HW_CUSTOM_INPUT এবং CustomInputEvent.java দ্বারা উপস্থাপিত হয়। HW_CUSTOM_INPUT হলো নেটিভ ইভেন্ট, যা গাড়ির হার্ডওয়্যার (Vehicle HAL) দ্বারা ইনস্ট্যানশিয়েট করা হয়। OEM-রাই নির্ধারণ করে যে এই ইভেন্টটি কীভাবে ইনস্ট্যানশিয়েট করা হবে। HW_CUSTOM_INPUT- এ অ্যাক্সেস [রিড অনলি] হিসেবে সেট করা থাকে, যেখানে VehiclePropertyAccess:READ থাকে।

ভেহিকেল HAL যাতে সর্বদা সর্বশেষ উপলব্ধ মান সম্প্রচার করতে পারে, তা নিশ্চিত করার জন্য HW_CUSTOM_INPUT নোটিফিকেশনটি ON_CHANGE হিসেবে সেট করা হয়, এবং এর সাথে VehiclePropertyChangeMode:ON_CHANGE

HW_CUSTOM_INPUT মানগুলি জেনেরিক int32 এর একটি অ্যারে দ্বারা গঠিত, যা GLOBAL ( VehicleArea:GLOBAL সহ) হিসাবে সেট করা থাকে। তিনটি জেনেরিক পূর্ণসংখ্যা হলো:

  1. প্রথম উপাদানটি OEM দ্বারা নির্ধারিতব্য ইনপুট কোডকে উপস্থাপন করে। আপনি ইনপুট কোডটির সাথে যেকোনো অর্থ যুক্ত করতে পারেন।

  2. দ্বিতীয় উপাদানটিতে লক্ষ্য প্রদর্শন, যেমন মূল প্রদর্শন বা ক্লাস্টার, সংরক্ষিত থাকে।

  3. তৃতীয় উপাদানটিতে ইভেন্টটি কতবার পুনরাবৃত্তি হয়েছে তার সংখ্যা থাকে। উদাহরণস্বরূপ, একটি বাটন কতবার চাপ দেওয়া হয়েছে তা নির্দেশ করতে।

কাস্টমইনপুটইভেন্ট এবং কার ইনপুট এপিআই

InputHalService হলো গাড়ির সেই সার্ভিস যা Vehicle HAL থেকে একটি ইনকামিং HW_CUSTOM_INPUT গ্রহণ করে।

InputHalService আগত HW_CUSTOM_INPUT , car-lib/src/android/car/input- এ অবস্থিত একটি জাভা পার্সেলযোগ্য ক্লাস CustomInputEvent এবং এর সংশ্লিষ্ট aidl ইন্টারফেসে রূপান্তর করে।

CarInputService , একটি মূল গাড়ি ইনপুট পরিষেবা, আগত CustomInputEvents গ্রহণ করে এবং তারপর সেগুলোকে যেকোনো নিবন্ধিত অ্যান্ড্রয়েড সিস্টেম পরিষেবাতে পাঠিয়ে দেয়।

আগত CustomInputEvents নিবন্ধন ও গ্রহণ করার জন্য, সিস্টেম পরিষেবাগুলিকে অবশ্যই:

নিম্নোক্ত ডায়াগ্রামটি একটি OEM কাস্টম ইনপুট ইভেন্টের কার্যপ্রবাহ তুলে ধরে।

OEM কাস্টম ইনপুট ওয়ার্কফ্লো

OEM অ্যান্ড্রয়েড সিস্টেম পরিষেবা

OEM-রা CarInputService থেকে আগত CustomInputEvents পরিচালনা করার জন্য তাদের অ্যান্ড্রয়েড সিস্টেম পরিষেবা প্রদান করে।

শুধুমাত্র android.permission.INJECT_EVENTS প্রিভিলেজ পারমিশন দ্বারা চিহ্নিত সার্ভিসগুলোই কার ইনপুট এপিআই ( CarInputManager ) থেকে কাস্টম ইনপুট ইভেন্ট (CustomInputEvents) রেজিস্টার এবং গ্রহণ করতে পারে। কোনো থার্ড-পার্টি সার্ভিস বা অ্যাপ্লিকেশন এই অ্যান্ড্রয়েড সিস্টেম পারমিশন দ্বারা সাইন করা যায় না (শুধুমাত্র OEM সার্ভিসগুলো পারে)। অতএব, কোনো থার্ড-পার্টি সার্ভিস বা অ্যাপ্লিকেশন কার ইনপুট এপিআই-এর বিরুদ্ধে রেজিস্টার করতে পারে না।

OEM অ্যান্ড্রয়েড সিস্টেম সার্ভিসগুলো SystemApi এবং পাবলিক মেথডগুলো অ্যাক্সেস করতে পারে।

রেফারেন্স বাস্তবায়ন

packages/services/Car/tests/SampleCustomInputService- এ রেফারেন্স ইমপ্লিমেন্টেশনটি দেখুন, যা একটি উদাহরণ এবং নির্দেশিকা হিসেবে দেওয়া হয়েছে। যেমন, স্টিয়ারিং হুইল কন্ট্রোলে একটি নতুন বাটন যোগ করতে পারেন। এই নতুন বাটনটি চাপলে, গাড়ির বর্তমান অবস্থানসহ ম্যাপস অ্যাপটি চালু হবে।

এই উদাহরণে, OEM এই নতুন বৈশিষ্ট্যটি (গাড়ির বর্তমান অবস্থান সহ ম্যাপ অ্যাপ খোলা) উপস্থাপন করার জন্য INPUT_CODE_F1 (প্রথম CustomInputEvent সুবিধামূলক ফাংশন) নির্বাচন করেছে।

চালু হওয়ার সময়, এই সার্ভিসটি requestInputEventCapture এর মাধ্যমে CarInputManager কাছে নিজেকে রেজিস্টার করে ( রেফারেন্স ইমপ্লিমেন্টেশন রেজিস্ট্রেশন কোডটি দেখুন)।

ইনকামিং CustomInputEvents গ্রহণ করার সময়, এই সার্ভিসটি ম্যাপস অ্যাপটি চালু করার জন্য ইন্টেন্ট পাঠায়। এটি কীভাবে করা হয় তা জানতে, CustomInputEventListener.java দেখুন।