OEM-এর জন্য ইন্টিগ্রেশন গাইড

এই পৃষ্ঠায় বর্ণনা করা হয়েছে কীভাবে VHAL-এ রোটারি ইনপুটগুলি প্রসেস করতে হয়, রোটারি পরিষেবা অন্তর্ভুক্ত করার জন্য আপনার বিল্ড কনফিগার করতে হয় এবং সমস্ত অ্যাপ জুড়ে রোটারি অভিজ্ঞতা কাস্টমাইজ করতে হয়। আগে থেকে ইনস্টল করা OEM অ্যাপগুলির জন্য, যেমন OEM-প্রদত্ত লঞ্চার, কার UI লাইব্রেরি (car-ui-library) দেখুন।

VHAL

একটি রোটারি কন্ট্রোলার নিম্নলিখিত ক্রিয়াগুলি সমর্থন করে:

  • উপরে, নিচে, বামে এবং ডানে সরান।
  • ঘড়ির কাঁটার দিকে এবং ঘড়ির কাঁটার বিপরীত দিকে ঘোরান।
  • মাঝের বোতামটি চাপুন।
  • ব্যাক বাটনটি চাপুন।
  • হোম বাটনটি চাপুন।
  • ফোন ও মিডিয়ার মতো অন্যান্য বাটনগুলো চাপুন।

সিস্টেম প্রোপার্টি এবং সংশ্লিষ্ট int32Values ​​সম্পর্কিত ডকুমেন্টেশনের জন্য hardware/interfaces/automotive/vehicle/2.0/types.hal দেখুন।

VHAL-এর এই কাজগুলো পরিচালনা করা উচিত:

নজ

যখন ব্যবহারকারী রোটারি কন্ট্রোলারটি ডানদিকে চাপবেন, তখন VHAL অ্যান্ড্রয়েডে একটি ইভেন্ট পাঠানোর জন্য HW_KEY_INPUT প্রপার্টিতে নিম্নলিখিত int32Values ​​ব্যবহার করবে:

  1. ACTION_DOWN
  2. KEYCODE_SYSTEM_NAVIGATION_RIGHT
  3. লক্ষ্যবস্তু প্রদর্শন।

যখন ব্যবহারকারী রোটারি কন্ট্রোলারটি ছেড়ে দেবেন, তখন VHAL-এর ACTION_UP জন্য একই প্রপার্টি এবং কীকোড ব্যবহার করা উচিত। অন্যান্য দিকে নজ করার জন্য সংশ্লিষ্ট কীকোডগুলো ব্যবহার করা উচিত।

ডায়াগোনালের জন্য কোনো কীকোড নেই, কিন্তু হার্ডওয়্যারটি ডায়াগোনাল সমর্থন করলে VHAL একটি হরাইজন্টাল এবং একটি ভার্টিকাল ইভেন্টকে একত্রিত করে একটি ডায়াগোনাল তৈরি করতে পারে। উদাহরণস্বরূপ, উপরে এবং বাম দিকে সামান্য নাড়ালে যা তৈরি হবে তা হলো:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN

যেকোনো ক্রমে (এবং পরবর্তীতে) রোটারি কন্ট্রোলারটি ছেড়ে দিলে নিম্নলিখিত ফলাফল পাওয়া যাবে:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_UP
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_UP

ব্যবহারকারী রোটারি কন্ট্রোলারটি ছাড়ার আগে লম্বভাবে চাপ দিতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত পরিস্থিতিটি:

লম্ব দিক
চিত্র ১. লম্ব দিক

এর ফলে নিম্নলিখিত ঘটনাক্রমটি ঘটবে:

  1. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
  2. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN
  3. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_UP
  4. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_UP

রোটারি কন্ট্রোলারটি এক দিকে ধরে রাখা অবস্থায় কোনো পুনরাবৃত্ত ইভেন্ট তৈরি হওয়া উচিত নয়।

ঘোরান

যখন ব্যবহারকারী রোটারি কন্ট্রোলারটিকে ঘড়ির কাঁটার দিকে এক ডিটেন্ট (ক্লিক) ঘোরান, তখন VHAL-কে অ্যান্ড্রয়েডে একটি ইভেন্ট পাঠানোর জন্য HW_ROTARY_INPUT প্রপার্টিতে নিম্নলিখিত int32Values ​​ব্যবহার করতে হবে:

  1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
  2. এক (1) টি ডিটেন্ট।
  3. লক্ষ্যবস্তু প্রদর্শন।

ইভেন্টের টাইমস্ট্যাম্পটি ন্যানোসেকেন্ডে অতিবাহিত সময়ে সেট করতে হবে।

একটি (1) ডিটেন্ট ঘড়ির কাঁটার বিপরীত দিকে ঘোরালে একই ইভেন্ট তৈরি হবে কিন্তু ডিটেন্টের সংখ্যা -1 হবে।

যদি একই দিকে একাধিক ঘূর্ণন বিরতি দ্রুত পরপর ঘটে, তবে সিস্টেমকে ইভেন্টের ভারে জর্জরিত না করার জন্য VHAL-এর উচিত বিরতিগুলোকে একটি একক ইভেন্টে একত্রিত করা। এক্ষেত্রে, ইভেন্টের টাইমস্ট্যাম্পটি হবে প্রথম ঘূর্ণন বিরতি ঘটার সময়। int32Values এ পরপর দুটি ঘূর্ণন বিরতির মধ্যবর্তী ন্যানোসেকেন্ডের সংখ্যা অন্তর্ভুক্ত থাকতে হবে।

উদাহরণস্বরূপ, ঘূর্ণনের নিম্নলিখিত ক্রমটি:

  • t0 সময়ে, ব্যবহারকারী একটি ডিটেন্টকে ঘড়ির কাঁটার বিপরীত দিকে ঘুরিয়েছিলেন।
  • t0 + 5 ns সময়ে, ব্যবহারকারী একটি ডিটেন্টকে ঘড়ির কাঁটার বিপরীত দিকে ঘুরিয়েছেন।
  • t0 + 8 ns সময়ে, ব্যবহারকারী একটি ডিটেন্টকে ঘড়ির কাঁটার বিপরীত দিকে ঘুরিয়েছেন।

এই ইভেন্টটি তৈরি করা উচিত:

  • সম্পত্তি: HW_ROTARY_INPUT
  • টাইমস্ট্যাম্প: t0
  • int32Values ​​:
    1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
    2. -৩ (ঘড়ির কাঁটার বিপরীত দিকে তিনটি ডিটেন্ট)।
    3. লক্ষ্যবস্তু প্রদর্শন।
    4. প্রথম ও দ্বিতীয় ডিটেন্টের মধ্যে ৫ ন্যানোসেকেন্ডের ব্যবধান।
    5. দ্বিতীয় ও তৃতীয় ডিটেন্টের মধ্যে ৩ ন্যানোসেকেন্ড।

মাঝের বোতাম

যখন ব্যবহারকারী সেন্টার বাটনটি চাপবেন, তখন VHAL-কে অ্যান্ড্রয়েডে একটি ইভেন্ট পাঠানোর জন্য HW_KEY_INPUT প্রপার্টিতে নিম্নলিখিত int32Values ব্যবহার করতে হবে:

  1. ACTION_DOWN
  2. KEYCODE_DPAD_CENTER
  3. লক্ষ্যবস্তু প্রদর্শন।

যখন ব্যবহারকারী রোটারি কন্ট্রোলারটি ছেড়ে দেন, তখন VHAL-এর ACTION_UP সাথে একই প্রপার্টি এবং কীকোড ব্যবহার করা উচিত।

সেন্টার বাটন চেপে ধরে রাখলে পুনরাবৃত্তিমূলক ইভেন্ট তৈরি করবেন না।

ব্যাক বাটন

যখন ব্যবহারকারী ব্যাক বাটন চাপবেন, তখন VHAL-কে অ্যান্ড্রয়েডে একটি ইভেন্ট পাঠানোর জন্য HW_KEY_INPUT প্রপার্টিতে নিম্নলিখিত int32Values ব্যবহার করতে হবে:

  1. ACTION_DOWN
  2. KEYCODE_BACK
  3. লক্ষ্যবস্তু প্রদর্শন।

যখন ব্যবহারকারী রোটারি কন্ট্রোলারটি ছেড়ে দেন, তখন VHAL-এর ACTION_UP সাথে একই প্রপার্টি এবং কীকোড ব্যবহার করা উচিত।

সেন্টার বাটনটি চেপে ধরে রাখা অবস্থায় কোনো পুনরাবৃত্তিমূলক ইভেন্ট তৈরি হওয়া উচিত নয়।

হোম বোতাম

হোম বাটনটিকে ব্যাক বাটনের মতোই ব্যবহার করুন, তবে KEYCODE_BACK এর পরিবর্তে KEYCODE_HOME ব্যবহার করুন।

অন্যান্য বোতাম

যদি রোটারি কন্ট্রোলারে কোনো অতিরিক্ত বাটন থাকে, তবে VHAL সেগুলোকে OEM-এর পছন্দমতো পরিচালনা করতে পারে, কারণ অ্যান্ড্রয়েডের দৃষ্টিকোণ থেকে সেগুলোকে রোটারির অংশ হিসেবে গণ্য করা হয় না। এগুলোকে সাধারণত ব্যাক এবং হোম বাটনের মতোই পরিচালনা করা হয়, তবে ভিন্ন কীকোড ব্যবহার করে। উদাহরণস্বরূপ, KEYCODE_CALL বা KEYCODE_MUSIC

বিল্ড কনফিগারেশন

রোটারি নেভিগেশন ' RotaryService নামক একটি অ্যাক্সেসিবিলিটি সার্ভিসের মাধ্যমে প্রদান করা হয়। আপনার ডিভাইসের সিস্টেম ইমেজে এই সার্ভিসটি অন্তর্ভুক্ত করতে, আপনার মেকফাইলে নিম্নলিখিত লাইনটি যোগ করুন:

PRODUCT_PACKAGES += CarRotaryController

ডিবাগ বিল্ডে আপনি নিম্নলিখিত প্যাকেজগুলোও অন্তর্ভুক্ত করতে চাইতে পারেন:

ডিভাইসটি বুট করার সময় এবং ব্যবহারকারী সুইচ করলে রোটারি পরিষেবাটি স্বয়ংক্রিয়ভাবে সক্রিয় হয়। এর ফলে ব্যবহারকারী সেট-আপের সময় রোটারি কন্ট্রোলারটি ব্যবহার করতে পারেন।

যদি আপনি রোটারি কন্ট্রোলার সহ এবং রোটারি কন্ট্রোলার ছাড়া গাড়ির জন্য একই বিল্ড ব্যবহার করেন, তাহলে উপরে দেখানো অনুযায়ী CarRotaryController যোগ করুন, যাতে প্রয়োজনীয় কোডটি বিল্ডে অন্তর্ভুক্ত হয়। রোটারি নয় এমন গাড়িতে রোটারি সার্ভিস চালু হওয়া আটকাতে, packages/services/Car/service এ থাকা rotaryService স্ট্রিং রিসোর্সটিকে একটি খালি স্ট্রিং দিয়ে ওভারলে করার জন্য একটি স্ট্যাটিক RRO তৈরি করুন। আপনি একই বিল্ড ব্যবহার করবেন, কিন্তু রোটারি এবং নন-রোটারি ডিভাইসের জন্য আলাদা প্রোডাক্ট কনফিগারেশন থাকবে। শুধুমাত্র পরেরটিতেই ওভারলে অন্তর্ভুক্ত থাকবে।

কাস্টমাইজেশন

OEM-রা নিম্নলিখিত স্থানগুলিতে রিসোর্স ওভারলে-র মাধ্যমে ফোকাস ফাইন্ডিং লজিক, ফোকাস হাইলাইট এবং কিছু অতিরিক্ত আইটেম কাস্টমাইজ করতে পারে:

  • car-ui-library টি packages/apps/Car/libs/car-ui-lib এ অবস্থিত।
  • RotaryService packages/apps/Car/RotaryController এ অবস্থিত।
  • Core frameworks/base/core এ অবস্থিত।

নজ ইতিহাস

OEM দুই ধরনের নাজ হিস্ট্রির প্রত্যেকটি চালু থাকবে কি না এবং যদি থাকে, তবে ক্যাশের আকার ও মেয়াদোত্তীর্ণ হওয়ার নীতি নির্ধারণ করতে পারে। এই সবকিছু বিভিন্ন কার-ইউআই-লাইব্রেরি রিসোর্স ওভাররাইড করার মাধ্যমে করা হয়।

ফোকাস হিস্ট্রি ক্যাশে

( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
এই প্রতি- FocusArea ক্যাশে FocusArea মধ্যে সর্বশেষ ফোকাস করা ভিউটিকে সংরক্ষণ করে, যাতে FocusArea ফিরে আসার সময় সেটিকে পুনরায় ফোকাস করা যায়। নিম্নলিখিত car-ui-library রিসোর্সগুলি ওভারলে করার মাধ্যমে এই ক্যাশেটি কনফিগার করা যেতে পারে:

  • car_ui_focus_history_cache_type :
    1. ক্যাশ নিষ্ক্রিয় করা হয়েছে।
    2. কিছু সময় পর ক্যাশের মেয়াদ শেষ হয়ে যাবে (নিচে দেখুন)।
    3. ক্যাশের মেয়াদ কখনো শেষ হবে না।
  • car_ui_focus_history_expiration_period_ms : ক্যাশের ধরণ দুই (2) এ সেট করা থাকলে (উপরে দেখুন) ক্যাশে মেয়াদ শেষ হওয়ার আগে কত মিলিসেকেন্ড বাকি থাকবে।

ফোকাসএরিয়া ইতিহাস ক্যাশে

( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
এই ক্যাশে নজগুলির একটি ইতিহাস সংরক্ষণ করে, যাতে বিপরীত দিকে নজ করলে ফোকাস একই FocusArea ফিরে আসতে পারে। নিম্নলিখিত car-ui-library রিসোর্সগুলি ওভারলে করে এই ক্যাশেটি কনফিগার করা যেতে পারে:

  • car_ui_focus_area_history_cache_type :
    1. ক্যাশ নিষ্ক্রিয় করা হয়েছে।
    2. কিছু সময় পর ক্যাশের মেয়াদ শেষ হয়ে যায় (নিচে দেখুন)।
    3. ক্যাশের মেয়াদ কখনো শেষ হয় না।
  • car_ui_focus_area_history_expiration_period_ms : ক্যাশের ধরন ২-এ সেট করা থাকলে (উপরে দেখুন), কত মিলিসেকেন্ডের মধ্যে ক্যাশের মেয়াদ শেষ হবে।
  • car_ui_clear_focus_area_history_when_rotating : ব্যবহারকারী যখন কন্ট্রোলারটি ঘোরান, তখন ক্যাশে বাতিল করা হবে কিনা।

ঘূর্ণন

( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
ঘূর্ণনের জন্য ত্বরণ, যেমন মাউস ত্বরণ, থাকবে কি না তা নির্দিষ্ট করতে OEM RotaryService এর দুটি পূর্ণসংখ্যা রিসোর্সকে ওভাররাইড করতে পারে:

  • rotation_acceleration_3x_ms : একটি ডিটেন্ট অফ রোটেশনের জন্য গুগল কন্ট্রোলার রোটেশনকে ত্বরান্বিত করবে কিনা, তা নির্ধারণ করতে ব্যবহৃত সময় ব্যবধান (মিলিসেকেন্ডে)। যদি এই ডিটেন্ট এবং পূর্ববর্তী ডিটেন্ট অফ রোটেশনের মধ্যবর্তী ব্যবধান এই মানের চেয়ে কম হয়, তবে এটিকে তিনটি ডিটেন্ট অফ রোটেশন হিসেবে গণ্য করা হবে। ৩× অ্যাক্সিলারেশন নিষ্ক্রিয় করতে এটিকে 2147483647-এ সেট করুন।
  • rotation_acceleration_2x_ms : rotation_acceleration_3x_ms এর অনুরূপ। ২× ত্বরণের জন্য ব্যবহৃত হয়। ২× ত্বরণ নিষ্ক্রিয় করতে এটিকে 2147483647 এ সেট করুন।

VHAL-এর প্রয়োজন অনুযায়ী, ঘূর্ণনের প্রতিটি ডিটেন্টের জন্য স্বতন্ত্র টাইমস্ট্যাম্প থাকলে ত্বরণ সবচেয়ে ভালোভাবে কাজ করে। যদি এগুলি উপলব্ধ না থাকে, তাহলে RotaryService ধরে নেয় যে ঘূর্ণনের ডিটেন্টগুলি সমান ব্যবধানে অবস্থিত।

/**
     * Property to feed H/W rotary events to android
     *
     * int32Values[0] : RotaryInputType identifying which rotary knob rotated
     * int32Values[1] : number of detents (clicks), positive for clockwise,
     *                  negative for counterclockwise
     * int32Values[2] : target display defined in VehicleDisplay. Events not
     *                  tied to specific display must be sent to
     *                  VehicleDisplay#MAIN.
     * int32values[3 .. 3 + abs(number of detents) - 2]:
     *                  nanosecond deltas between pairs of consecutive detents,
     *                  if the number of detents is > 1 or < -1
     *
     * VehiclePropValue.timestamp: when the rotation occurred. If the number of
     *                             detents is > 1 or < -1, this is when the
     *                             first detent of rotation occurred.
     *
     * @change_mode VehiclePropertyChangeMode:ON_CHANGE
     * @data_enum RotaryInputType
     * @access VehiclePropertyAccess:READ
     */
    HW_ROTARY_INPUT = (
        0x0A20
        | VehiclePropertyGroup:SYSTEM
        | VehiclePropertyType:INT32_VEC
        | VehicleArea:GLOBAL),

ফোকাস হাইলাইট

OEM অ্যান্ড্রয়েড ফ্রেমওয়ার্কে ডিফল্ট ফোকাস হাইলাইট এবং car-ui-library-তে থাকা বিভিন্ন ফোকাস হাইলাইট রিসোর্সকে ওভাররাইড করতে পারে।

ডিফল্ট ফোকাস হাইলাইট

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক selectableItemBackground অ্যাট্রিবিউটের মাধ্যমে একটি ডিফল্ট ফোকাস হাইলাইট প্রদান করে। Theme.DeviceDefault এ, এই অ্যাট্রিবিউটটি Core এর item_background.xml কে নির্দেশ করে। OEM ডিফল্ট ফোকাস হাইলাইট ড্রয়েবল পরিবর্তন করার জন্য item_background.xml ওভারলে করতে পারে।

এই ড্রয়েবলটি সাধারণত একটি StateListDrawable হওয়া উচিত, যা android:state_focused এবং android:state_pressed সহ বিভিন্ন স্টেটের সমন্বয়ের উপর ভিত্তি করে ব্যাকগ্রাউন্ড সামঞ্জস্য করে। যখন ব্যবহারকারী রোটারি কন্ট্রোলার ব্যবহার করে একটি ভিউ ফোকাস করেন, android:state_focused true হবে, কিন্তু android:state_pressed false হবে। এরপর যদি ব্যবহারকারী রোটারি কন্ট্রোলারের সেন্টার বাটনটি চাপেন, তাহলে বাটনটি চেপে ধরে রাখার সময় android:state_focused এবং android:state_pressed উভয়ই true থাকবে। যখন ব্যবহারকারী বাটনটি ছেড়ে দেবেন, তখন শুধুমাত্র android:state_focused true থাকবে।

car-ui-library, Theme.DeviceDefault থেকে উদ্ভূত একটি থিম ব্যবহার করে। ফলে, এই ওভারলেটি সেইসব অ্যাপকে প্রভাবিত করে যেগুলো এই লাইব্রেরিটি ব্যবহার করে এবং সেইসব অ্যাপকেও প্রভাবিত করে যেগুলো Theme.DeviceDefault থেকে উদ্ভূত যেকোনো থিম ব্যবহার করে। এটি সেইসব অ্যাপকে প্রভাবিত করবে না যেগুলো Theme.Material এর মতো কোনো সম্পর্কহীন থিম ব্যবহার করে।

car-ui-library-তে রিসোর্সগুলিকে ফোকাস হাইলাইট করুন।

OEM বিভিন্ন car-ui-library রিসোর্স ওভাররাইড করে নিয়ন্ত্রণ করতে পারে যে, আয়তক্ষেত্রাকার নয় এমন (যেমন গোলাকার বা পিল-আকৃতির) ফোকাস হাইলাইটযুক্ত ভিউতে এবং Theme.DeviceDefault থেকে উদ্ভূত নয় এমন থিম ব্যবহারকারী অ্যাপে ফোকাস হাইলাইটটি দেখতে কেমন হবে। এই রিসোর্সগুলিকে এমনভাবে ওভারলে করা উচিত যাতে ফোকাস হাইলাইটটি ডিফল্ট ফোকাস হাইলাইট ড্রয়েবলের সাথে সামঞ্জস্যপূর্ণ হয়।

( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
কোনো ভিউ ফোকাস করা থাকলেও চাপ দেওয়া হয়নি , তা নির্দেশ করতে নিম্নলিখিত রিসোর্সগুলো ব্যবহৃত হয়:

  • car_ui_rotary_focus_fill_color : ফিল কালার।
  • car_ui_rotary_focus_stroke_color : আউটলাইনের রঙ।
  • car_ui_rotary_focus_stroke_width : আউটলাইনের পুরুত্ব।

( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
কোনো ভিউতে ফোকাস করা হলে এবং সেটি চাপলে তা নির্দেশ করতে নিম্নলিখিত রিসোর্সগুলো ব্যবহৃত হয়:

  • car_ui_rotary_focus_pressed_fill_color : ফিল কালার।
  • car_ui_rotary_focus_pressed_stroke_color : আউটলাইনের রঙ।
  • car_ui_rotary_focus_pressed_stroke_width : আউটলাইনের পুরুত্ব।

কখনও কখনও ব্যবহারকারীর দৃষ্টি আকর্ষণ করার জন্য একটি বাটনকে একরঙা ব্যাকগ্রাউন্ড দেওয়া হয়, যেমনটি দেখানো উদাহরণে করা হয়েছে। এর ফলে ফোকাস হাইলাইটটি দেখতে অসুবিধা হতে পারে।

নিরেট পটভূমিযুক্ত বোতাম
চিত্র ২. নিরেট পটভূমিযুক্ত বোতাম

এই পরিস্থিতিতে, ডেভেলপার সেকেন্ডারি রঙ ব্যবহার করে একটি কাস্টম ফোকাস হাইলাইট নির্দিষ্ট করতে পারেন:
  • ( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
    car_ui_rotary_focus_fill_secondary_color
    car_ui_rotary_focus_stroke_secondary_color
  • ( অ্যান্ড্রয়েড ১২ )
    car_ui_rotary_focus_pressed_fill_secondary_color
    car_ui_rotary_focus_pressed_stroke_secondary_color

যেকোনো রঙ স্বচ্ছ হতে পারে এবং যেকোনো মাত্রা শূন্য হতে পারে, যদি, উদাহরণস্বরূপ, আপনি শুধু পূরণ বা শুধু রূপরেখা চান।

ফোকাস এলাকা হাইলাইট

( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
যখন FocusArea এর কোনো একটি ডিসেন্ডেন্ট ফোকাসড হয়, তখন এটি দুই ধরনের হাইলাইট আঁকতে পারে। চাইলে, উভয়ই একসাথে ব্যবহার করা যেতে পারে। AOSP-তে এই ফিচারটি ডিফল্টরূপে নিষ্ক্রিয় থাকে, কিন্তু car-ui-library-এর রিসোর্স ওভাররাইড করে এটি সক্রিয় করা যায়:

  • car_ui_enable_focus_area_foreground_highlight : FocusArea এবং এর অধীনস্থ এলাকাগুলোর উপরে একটি হাইলাইট আঁকুন। AOSP-তে, এই ড্রয়েবলটি হলো FocusArea চারপাশে একটি আউটলাইন। OEM-রা car_ui_focus_area_foreground_highlight ড্রয়েবলটিকে ওভাররাইড করতে পারেন।
  • car_ui_enable_focus_area_background_highlight : FocusArea উপরে কিন্তু এর অধীনস্থ এরিয়াগুলোর পিছনে একটি হাইলাইট আঁকুন। AOSP-তে, এই ড্রয়েবলটি একটি সলিড ফিল। OEM-রা car_ui_focus_area_background_highlight ড্রয়েবলটিকে ওভাররাইড করতে পারেন।

ইনপুট পদ্ধতি সম্পাদক

ইনপুট মেথড এডিটর (IME) হলো ইনপুট পদ্ধতি। উদাহরণস্বরূপ, অন-স্ক্রিন কীবোর্ড।

( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
টাচ-ভিত্তিক IME-এর ComponentName নির্দিষ্ট করার জন্য OEM-কে অবশ্যই RotaryServicedefault_touch_input_method স্ট্রিং রিসোর্সটি ওভারলে করতে হবে। উদাহরণস্বরূপ, যদি OEM, Android Automotive-এর সাথে প্রদত্ত IME ব্যবহার করে, তবে তাদের com.google.android.apps.automotive.inputmethod/.InputMethodService নির্দিষ্ট করতে হবে।

( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
যদি OEM বিশেষভাবে রোটারির জন্য একটি IME তৈরি করে থাকে, তবে তাদের rotary_input_method রিসোর্সে এর ComponentName উল্লেখ করতে হবে। যদি এই রিসোর্সটি ওভারলে করা থাকে, তবে ব্যবহারকারী যখনই রোটারি কন্ট্রোলারের নাজ, রোটেশন এবং সেন্টার বাটনের মাধ্যমে হেড ইউনিটের সাথে ইন্টারঅ্যাক্ট করেন, তখন নির্দিষ্ট IME-টি ব্যবহৃত হয়। ব্যবহারকারী যখন স্ক্রিনে টাচ করেন, তখন পূর্ববর্তী IME-টি ব্যবহৃত হবে। ব্যাক বাটন (এবং রোটারি কন্ট্রোলারের অন্যান্য বাটন) IME নির্বাচনের উপর কোনো প্রভাব ফেলে না। যদি এই রিসোর্সটি ওভারলে করা না থাকে, তবে কোনো IME পরিবর্তন হয় না। কার্ডবোর্ড রোটারি সমর্থন করে না, তাই যদি OEM কোনো রোটারি IME প্রদান না করে থাকে, তবে ব্যবহারকারী রোটারি কন্ট্রোলারের মাধ্যমে টেক্সট লিখতে পারবেন না।

RotaryIME হলো একটি ডেমো রোটারি আইএমই। এটি সাধারণ মানের হলেও, উপরে বর্ণিত স্বয়ংক্রিয় আইএমই স্যুইচিং পরীক্ষা করার জন্য যথেষ্ট। RotaryIME এর সোর্স কোড packages/apps/Car/tests/RotaryIME/ -এ পাওয়া যাবে।

অফ-স্ক্রিন ধাক্কা

ডিফল্টরূপে, যখন ব্যবহারকারী স্ক্রিনের প্রান্তের বাইরে ঠেলে দেওয়ার চেষ্টা করেন, তখন কিছুই ঘটে না। OEM নিম্নলিখিতগুলির যেকোনো সংমিশ্রণ নির্দিষ্ট করে চারটি দিকের প্রতিটির জন্য কী ঘটবে তা কনফিগার করতে পারে:

  1. AccessibilityService দ্বারা সংজ্ঞায়িত একটি গ্লোবাল অ্যাকশন। উদাহরণস্বরূপ, GLOBAL_ACTION_BACK
  2. একটি কী কোড, যেমন KEYCODE_BACK
  3. একটি URL হিসাবে উপস্থাপিত কোনো কার্যকলাপ চালু করার অভিপ্রায়।

( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
RotaryService এ নিম্নলিখিত অ্যারে রিসোর্সগুলিকে ওভারলে করার মাধ্যমে এগুলি নির্দিষ্ট করা হয়:

  • off_screen_nudge_global_actions : ব্যবহারকারী যখন স্ক্রিনের কিনারা থেকে উপরে, নিচে, বামে বা ডানে হাত সরিয়ে নেয়, তখন যে গ্লোবাল অ্যাকশনগুলো সম্পাদন করা হবে তার অ্যারে। এই অ্যারের প্রাসঙ্গিক উপাদানটি -১ হলে কোনো গ্লোবাল অ্যাকশন সম্পাদন করা হয় না।
  • off_screen_nudge_key_codes : ব্যবহারকারী যখন স্ক্রিনের কিনারা থেকে উপরে, নিচে, বামে বা ডানে স্ক্রিন নাড়াচাড়া করে, তখন যে ক্লিক ইভেন্টগুলো ইনজেক্ট করা হবে, তার কী-কোডগুলোর অ্যারে। এই অ্যারের প্রাসঙ্গিক উপাদানটি ০ ( KEYCODE_UNKNOWN ) হলে কোনো ইভেন্ট ইনজেক্ট করা হয় না।
  • off_screen_nudge_intents : ব্যবহারকারী যখন স্ক্রিনের কিনারা থেকে উপরে, নিচে, বামে বা ডানে হাত সরিয়ে নেয়, তখন একটি অ্যাক্টিভিটি চালু করার জন্য ইন্টেন্টগুলোর একটি অ্যারে। এই অ্যারের প্রাসঙ্গিক উপাদানটি খালি থাকলে কোনো অ্যাক্টিভিটি চালু হয় না।

অন্যান্য কনফিগারেশন

আপনাকে নিম্নলিখিত RotaryService রিসোর্সগুলি ওভারলে করতে হবে:

  • ( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
    config_showHeadsUpNotificationOnBottom : হেডস-আপ নোটিফিকেশন উপরে না দেখিয়ে নীচে দেখানো হবে কিনা, তা বোঝানোর জন্য একটি বুলিয়ান মান। এর মান অবশ্যই frameworks/base/packages/CarSystemUI/res/values/config.xml এ থাকা config_showHeadsUpNotificationOnBottom বুলিয়ান রিসোর্সের মানের সমান হতে হবে।
  • ( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
    notification_headsup_card_margin_horizontal : হেডস-আপ নোটিফিকেশন উইন্ডোর জন্য বাম এবং ডান মার্জিন। এর মান অবশ্যই packages/apps/Car/Notification/res/values/dimens.xml এ থাকা notification_headsup_card_margin_horizontal dimen রিসোর্সের মানের সমান হতে হবে।
  • ( অ্যান্ড্রয়েড ১২ )
    excluded_application_overlay_window_titles : এমন উইন্ডোগুলোর শিরোনামের একটি অ্যারে, যেগুলোকে ওভারলে উইন্ডো হিসেবে বিবেচনা করা উচিত নয়। এতে TaskViews বা TaskDisplayAreas উপস্থাপনকারী অ্যাপ উইন্ডোগুলোর শিরোনাম অন্তর্ভুক্ত থাকা উচিত। ডিফল্টরূপে, এই তালিকায় শুধুমাত্র "Maps" থাকে।

আপনি নিম্নলিখিত RotaryService রিসোর্সটি ওভারলে করতে পারেন:

  • ( অ্যান্ড্রয়েড ১১ কিউপিআর৩, অ্যান্ড্রয়েড ১১ কার, অ্যান্ড্রয়েড ১২ )
    long_press_ms : একটি পূর্ণসংখ্যা যা নির্দেশ করে যে লং-প্রেস ট্রিগার করার জন্য সেন্টার বাটনটি কত মিলিসেকেন্ড ধরে রাখতে হবে। শূন্য হলে সিস্টেমের ডিফল্ট লং-প্রেস টাইমআউট ব্যবহার করা হবে। এটিই ডিফল্ট মান।