ইনস্ট্রুমেন্ট ক্লাস্টার API

গাড়ির কোনো সেকেন্ডারি ডিসপ্লেতে, যেমন স্টিয়ারিং হুইলের পিছনে ইন্সট্রুমেন্ট প্যানেলে, গুগল ম্যাপস সহ নেভিগেশন অ্যাপ প্রদর্শন করতে ইন্সট্রুমেন্ট ক্লাস্টার এপিআই (একটি অ্যান্ড্রয়েড এপিআই) ব্যবহার করুন। এই পৃষ্ঠায় বর্ণনা করা হয়েছে কীভাবে সেই সেকেন্ডারি ডিসপ্লেটি নিয়ন্ত্রণ করার জন্য একটি সার্ভিস তৈরি করতে হয় এবং সার্ভিসটিকে CarService সাথে ইন্টিগ্রেট করতে হয়, যাতে নেভিগেশন অ্যাপগুলো একটি ইউজার ইন্টারফেস প্রদর্শন করতে পারে।

পরিভাষা

এই পৃষ্ঠায় নিম্নলিখিত পরিভাষাগুলো ব্যবহৃত হয়েছে।

গাড়ির ইন্সট্রুমেন্ট ক্লাস্টার ম্যানেজার
CarManager এর এমন একটি ইনস্ট্যান্স যা বাহ্যিক অ্যাপগুলিকে ইন্সট্রুমেন্ট ক্লাস্টারে একটি অ্যাক্টিভিটি চালু করতে এবং ইন্সট্রুমেন্ট ক্লাস্টার অ্যাক্টিভিটিগুলি প্রদর্শনের জন্য প্রস্তুত হলে কলব্যাক গ্রহণ করতে সক্ষম করে।
গাড়ি ব্যবস্থাপক
CarService দ্বারা বাস্তবায়িত গাড়ি-নির্দিষ্ট পরিষেবাগুলোর সাথে যোগাযোগ করার জন্য বাহ্যিক অ্যাপগুলো যে সমস্ত ম্যানেজার ব্যবহার করে, তাদের সকলের মূল শ্রেণি।
গাড়ি পরিষেবা
অ্যান্ড্রয়েড প্ল্যাটফর্ম পরিষেবা যা বাহ্যিক অ্যাপ (গুগল ম্যাপস সহ) এবং গাড়ির নির্দিষ্ট বৈশিষ্ট্য, যেমন ইন্সট্রুমেন্ট ক্লাস্টার অ্যাক্সেসের মধ্যে সংযোগ স্থাপন করে।
গন্তব্য
চূড়ান্ত গন্তব্য যেখানে যানবাহনটি যাবে।
আনুমানিক পৌঁছানোর সময় (ETA)
গন্তব্যে পৌঁছানোর আনুমানিক সময়।
হেড ইউনিট (HU)
গাড়িতে স্থাপিত প্রধান কম্পিউটেশনাল ইউনিট। এই ইউনিটটি সমস্ত অ্যান্ড্রয়েড কোড পরিচালনা করে এবং গাড়ির কেন্দ্রীয় ডিসপ্লের সাথে সংযুক্ত থাকে।
যন্ত্রগুচ্ছ
সেকেন্ডারি ডিসপ্লেটি স্টিয়ারিং হুইলের পিছনে এবং গাড়ির ইন্সট্রুমেন্টগুলোর মাঝখানে অবস্থিত। এটি গাড়ির অভ্যন্তরীণ নেটওয়ার্ক (CAN বাস)-এর মাধ্যমে HU-এর সাথে সংযুক্ত একটি স্বাধীন কম্পিউটেশনাল ইউনিট অথবা HU-এর সাথে সংযুক্ত একটি সেকেন্ডারি ডিসপ্লে হতে পারে।
InstrumentClusterRenderingService
ইন্সট্রুমেন্ট ক্লাস্টার ডিসপ্লের সাথে ইন্টারফেস করার জন্য ব্যবহৃত সার্ভিসের বেস ক্লাস। OEM-দের অবশ্যই এই ক্লাসের একটি এক্সটেনশন প্রদান করতে হবে যা OEM-নির্দিষ্ট হার্ডওয়্যারের সাথে ইন্টারঅ্যাক্ট করে।
কিচেনসিঙ্ক অ্যাপ
অ্যান্ড্রয়েড অটোমোটিভ-এর সাথে টেস্ট অ্যাপ অন্তর্ভুক্ত রয়েছে।
রুট
একটি নির্দিষ্ট পথ, যে পথ ধরে যানবাহন কোনো গন্তব্যে পৌঁছায়।
সিঙ্গেলটন পরিষেবা
android:singleUser অ্যাট্রিবিউটযুক্ত একটি অ্যান্ড্রয়েড সার্ভিস। যেকোনো নির্দিষ্ট সময়ে, অ্যান্ড্রয়েড সিস্টেমে সার্ভিসটির সর্বাধিক একটি ইনস্ট্যান্স চালু থাকে।

পূর্বশর্ত

এগিয়ে যাওয়ার আগে, এই উপাদানগুলো অবশ্যই সাথে রাখুন:

  • অ্যান্ড্রয়েড ডেভেলপমেন্ট এনভায়রনমেন্ট। অ্যান্ড্রয়েড ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করার জন্য, বিল্ড রিকোয়ারমেন্টস দেখুন।
  • অ্যান্ড্রয়েড সোর্স কোড ডাউনলোড করুন। https://android.googlesource.com থেকে pi-car-release ব্রাঞ্চের (বা তার পরবর্তী) সর্বশেষ সংস্করণটি সংগ্রহ করুন।
  • হেড ইউনিট (HU)। একটি অ্যান্ড্রয়েড ডিভাইস যা অ্যান্ড্রয়েড ৯ (বা তার পরবর্তী সংস্করণ) চালাতে সক্ষম। এই ডিভাইসটির নিজস্ব ডিসপ্লে থাকতে হবে এবং অ্যান্ড্রয়েডের নতুন বিল্ড দিয়ে ডিসপ্লেটি ফ্ল্যাশ করতে সক্ষম হতে হবে।
  • ইন্সট্রুমেন্ট ক্লাস্টার নিম্নলিখিতগুলির মধ্যে একটি:
    • হেড ইউনিটের সাথে সংযুক্ত ফিজিক্যাল সেকেন্ডারি ডিসপ্লে। যদি ডিভাইস হার্ডওয়্যার এবং কার্নেল একাধিক ডিসপ্লে পরিচালনা সমর্থন করে।
    • স্বাধীন ইউনিট। নেটওয়ার্ক সংযোগের মাধ্যমে HU-এর সাথে সংযুক্ত যেকোনো কম্পিউটেশনাল ইউনিট, যা তার নিজস্ব ডিসপ্লেতে একটি ভিডিও স্ট্রিম গ্রহণ ও প্রদর্শন করতে সক্ষম।
    • অনুকৃত প্রদর্শন। ডেভেলপমেন্টের সময়, আপনি এই অনুকৃত পরিবেশগুলোর মধ্যে একটি ব্যবহার করতে পারেন:
      • সিমুলেটেড সেকেন্ডারি ডিসপ্লে। যেকোনো AOSP অ্যান্ড্রয়েড ডিস্ট্রিবিউশনে একটি সিমুলেটেড সেকেন্ডারি ডিসপ্লে চালু করতে, সেটিংস সিস্টেম অ্যাপের ডেভেলপার অপশন সেটিংসে যান এবং তারপর 'সিমুলেট সেকেন্ডারি ডিসপ্লে' নির্বাচন করুন। এই কনফিগারেশনটি একটি ফিজিক্যাল সেকেন্ডারি ডিসপ্লে সংযুক্ত করার সমতুল্য, তবে সীমাবদ্ধতা হলো এই ডিসপ্লেটি প্রাইমারি ডিসপ্লের উপরে সুপারইম্পোজ করা থাকে।
      • অনুকৃত ইন্সট্রুমেন্ট ক্লাস্টার। AAOS-এর সাথে অন্তর্ভুক্ত অ্যান্ড্রয়েড এমুলেটরটি ClusterRenderingService ব্যবহার করে একটি ইন্সট্রুমেন্ট ক্লাস্টার প্রদর্শনের বিকল্প প্রদান করে।

ইন্টিগ্রেশন আর্কিটেকচার

ইন্টিগ্রেশন উপাদান

ইন্সট্রুমেন্ট ক্লাস্টার এপিআই-এর যেকোনো ইন্টিগ্রেশন এই তিনটি উপাদান নিয়ে গঠিত:

  • CarService
  • নেভিগেশন অ্যাপস
  • OEM ইন্সট্রুমেন্ট ক্লাস্টার পরিষেবা

ইন্টিগ্রেশন উপাদান

গাড়ি পরিষেবা

CarService নেভিগেশন অ্যাপ এবং গাড়ির মধ্যে মধ্যস্থতা করে, যা নিশ্চিত করে যে যেকোনো সময়ে কেবল একটি নেভিগেশন অ্যাপই সক্রিয় থাকবে এবং শুধুমাত্র android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL পারমিশন থাকা অ্যাপগুলোই গাড়িতে ডেটা পাঠাতে পারবে।

CarService গাড়ির জন্য নির্দিষ্ট সমস্ত পরিষেবা চালু করে এবং একাধিক ম্যানেজারের মাধ্যমে এই পরিষেবাগুলিতে অ্যাক্সেস প্রদান করে। পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য, গাড়িতে চলমান অ্যাপগুলি এই ম্যানেজারগুলিকে অ্যাক্সেস করতে পারে।

ইন্সট্রুমেন্ট ক্লাস্টার বাস্তবায়নের জন্য, অটোমোটিভ OEM-দের অবশ্যই InstrumentClusterRendererService-এর একটি কাস্টম ইমপ্লিমেন্টেশন তৈরি করতে হবে এবং ClusterRenderingService আপডেট করতে হবে।

একটি ইন্সট্রুমেন্ট ক্লাস্টার রেন্ডার করার সময়, বুট প্রক্রিয়ার চলাকালীন CarService InstrumentClusterService এর একটি ইমপ্লিমেন্টেশন সনাক্ত করার জন্য ClusterRenderingService- এর InstrumentClusterRendererService কী-টি পড়ে। AOSP-তে, এই এন্ট্রিটি নেভিগেশন স্টেট এপিআই স্যাম্পল ক্লাস্টার ইমপ্লিমেন্টেশন রেন্ডার সার্ভিসকে নির্দেশ করে:

<string name="instrumentClusterRendererService">
android.car.cluster/.ClusterRenderingService
</string>

এই এন্ট্রিতে উল্লেখিত সার্ভিসটি ইনিশিয়ালাইজ করা হয় এবং CarService সাথে বাইন্ড করা থাকে। যখন Google Maps-এর মতো নেভিগেশন অ্যাপগুলো একটি CarInstrumentClusterManager জন্য অনুরোধ করে, তখন CarService একটি ম্যানেজার সরবরাহ করে যা বাইন্ড করা InstrumentClusterRenderingService থেকে ইন্সট্রুমেন্ট ক্লাস্টারের স্টেট আপডেট করে। (এই ক্ষেত্রে, বাইন্ড বলতে Android Services- কে বোঝানো হয়েছে।)

ইন্সট্রুমেন্ট ক্লাস্টার পরিষেবা

OEM-দের অবশ্যই একটি অ্যান্ড্রয়েড প্যাকেজ (APK) তৈরি করতে হবে, যাতে ClusterRenderingService- এর একটি সাবক্লাস অন্তর্ভুক্ত থাকে।

এই ক্লাসটির দুটি উদ্দেশ্য রয়েছে:

  • অ্যান্ড্রয়েড এবং ইন্সট্রুমেন্ট ক্লাস্টার রেন্ডারিং ডিভাইসের জন্য একটি ইন্টারফেস প্রদান করে (এই পৃষ্ঠার উদ্দেশ্য)।
  • ধাপে ধাপে দিকনির্দেশনার মতো নেভিগেশন অবস্থার হালনাগাদ গ্রহণ করে এবং প্রদর্শন করে।

প্রথম উদ্দেশ্যের জন্য, InstrumentClusterRendererService এর OEM ইমপ্লিমেন্টেশনগুলোকে অবশ্যই গাড়ির কেবিনের স্ক্রিনগুলোতে তথ্য রেন্ডার করার জন্য ব্যবহৃত সেকেন্ডারি ডিসপ্লেটি ইনিশিয়ালাইজ করতে হবে এবং InstrumentClusterRendererService.setClusterActivityOptions()InstrumentClusterRendererService.setClusterActivityState() মেথডগুলো কল করার মাধ্যমে এই তথ্য CarService কে জানাতে হবে।

দ্বিতীয় ফাংশনটির জন্য, ইন্সট্রুমেন্ট ক্লাস্টার সার্ভিসকে অবশ্যই ক্লাস্টাররেন্ডারিংসার্ভিস- এর একটি ইমপ্লিমেন্টেশন প্রদান করতে হবে। এমন একটি ইন্টারফেস যা নেভিগেশন স্ট্যাটাস আপডেট ইভেন্ট গ্রহণ করে, যেগুলো একটি eventType হিসেবে এবং ইভেন্ট ডেটা একটি বান্ডেলে এনকোড করা থাকে।

একীকরণ ক্রম

নিম্নলিখিত ডায়াগ্রামটি একটি নেভিগেশন স্টেটের বাস্তবায়ন চিত্রিত করে যা আপডেটগুলি রেন্ডার করে:

একীকরণ ক্রম

এই চিত্রে, রঙগুলো নিম্নলিখিত বিষয়গুলো নির্দেশ করে:

  • হলুদ। অ্যান্ড্রয়েড প্ল্যাটফর্ম দ্বারা প্রদত্ত CarService এবং CarNavigationStatusManager । আরও জানতে, Car এবং CAR_NAVIGATION_SERVICE দেখুন।
  • সায়ান। OEM দ্বারা বাস্তবায়িত InstrumentClusterRendererService
  • বেগুনি। গুগল এবং তৃতীয় পক্ষের ডেভেলপারদের দ্বারা বাস্তবায়িত নেভিগেশন অ্যাপ।
  • সবুজ। CarAppFocusManager । আরও জানতে, নিচে CarAppFocusManager API-এর ব্যবহার এবং CarAppFocusManager দেখুন।

নেভিগেশন অবস্থার তথ্য প্রবাহ নিম্নলিখিত ক্রম অনুসরণ করে:

  1. CarService InstrumentClusterRenderingService কে ইনিশিয়ালাইজ করে।
  2. প্রারম্ভিকীকরণের সময়, InstrumentClusterRenderingService নিম্নলিখিত তথ্য দিয়ে CarService আপডেট করে:
    1. ইনস্ট্রুমেন্ট ক্লাস্টার বৈশিষ্ট্য প্রদর্শন করে, যেমন সুস্পষ্ট সীমানা (সুস্পষ্ট সীমানা সম্পর্কে আরও বিস্তারিত পরে দেখা যাবে)।
    2. ইন্সট্রুমেন্ট ক্লাস্টার ডিসপ্লের ভিতরে অ্যাক্টিভিটি চালু করার জন্য অ্যাক্টিভিটি অপশন প্রয়োজন। আরও জানতে, অ্যাক্টিভিটিঅপশনস (ActivityOptions ) দেখুন।
  3. একটি নেভিগেশন অ্যাপ (যেমন Google Maps for Android Automotive অথবা প্রয়োজনীয় অনুমতিসহ যেকোনো ম্যাপস অ্যাপ):
    1. car-lib থেকে Car ক্লাস ব্যবহার করে একটি CarAppFocusManager পাওয়া যায়।
    2. ধাপে ধাপে দিকনির্দেশনা শুরু হওয়ার আগে, CarAppFocusManager.requestFocus() কল করার সময় appType প্যারামিটার হিসেবে CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION পাস করতে হবে।
  4. CarAppFocusManager এই অনুরোধটি CarService কাছে পাঠায়। অনুরোধটি মঞ্জুর হলে, CarService নেভিগেশন অ্যাপ প্যাকেজটি পরীক্ষা করে এবং android.car.cluster.NAVIGATION ক্যাটাগরি দ্বারা চিহ্নিত একটি অ্যাক্টিভিটি খুঁজে বের করে।
  5. খুঁজে পাওয়া গেলে, নেভিগেশন অ্যাপটি InstrumentClusterRenderingService দ্বারা রিপোর্ট করা ActivityOptions ব্যবহার করে অ্যাক্টিভিটিটি চালু করে এবং ইনটেন্টে এক্সট্রা হিসেবে Instrument Cluster-এর ডিসপ্লে প্রোপার্টিগুলো অন্তর্ভুক্ত করে।

এপিআই একীভূত করুন

InstrumentClusterRenderingService বাস্তবায়নে অবশ্যই নিম্নলিখিত বিষয়গুলো থাকতে হবে:

  • AndroidManifest.xml-এ নিম্নলিখিত ভ্যালুটি যোগ করে এটিকে একটি সিঙ্গেলটন সার্ভিস হিসেবে মনোনীত করুন। ইনিশিয়ালাইজেশন এবং ইউজার সুইচিংয়ের সময়েও যেন ইন্সট্রুমেন্ট ক্লাস্টার সার্ভিসের একটিমাত্র কপি চালু থাকে, তা নিশ্চিত করার জন্য এটি করা আবশ্যক।
    android:singleUser="true"
  • BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE সিস্টেম পারমিশনটি ধরে রাখুন। এটি নিশ্চিত করে যে শুধুমাত্র অ্যান্ড্রয়েড সিস্টেম ইমেজের অংশ হিসেবে অন্তর্ভুক্ত ইন্সট্রুমেন্ট ক্লাস্টার রেন্ডারিং সার্ভিসটিই CarService দ্বারা বাইন্ড করা হবে।
    <uses-permission android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
    

InstrumentClusterRenderingService বাস্তবায়ন করুন

পরিষেবাটি তৈরি করতে:

  1. একটি ক্লাস লিখুন যা ClusterRenderingService থেকে এক্সটেন্ড করে এবং তারপর আপনার AndroidManifest.xml ফাইলে এর একটি সংশ্লিষ্ট এন্ট্রি যোগ করুন। এই ক্লাসটি ইন্সট্রুমেন্ট ক্লাস্টারের ডিসপ্লে নিয়ন্ত্রণ করে এবং ( ঐচ্ছিকভাবে ) নেভিগেশন স্টেট এপিআই ডেটা রেন্ডার করতে পারে।
  2. onCreate() চলাকালীন, রেন্ডারিং হার্ডওয়্যারের সাথে যোগাযোগ শুরু করতে এই সার্ভিসটি ব্যবহার করুন। অপশনগুলোর মধ্যে রয়েছে:
    • ইন্সট্রুমেন্ট ক্লাস্টারের জন্য ব্যবহৃতব্য দ্বিতীয় ডিসপ্লেটি নির্ধারণ করুন।
    • একটি ভার্চুয়াল ডিসপ্লে তৈরি করুন যাতে ইন্সট্রুমেন্ট ক্লাস্টার অ্যাপটি ছবিটি রেন্ডার করে এবং রেন্ডার করা ছবিটি একটি বাহ্যিক ইউনিটে প্রেরণ করে (H.264-এর মতো কোনো ভিডিও স্ট্রিমিং ফরম্যাট ব্যবহার করে)।
  3. যখন উপরে উল্লিখিত ডিসপ্লেটি প্রস্তুত হবে, তখন ইন্সট্রুমেন্ট ক্লাস্টারে একটি অ্যাক্টিভিটি প্রদর্শনের জন্য যে সুনির্দিষ্ট ActivityOptions ব্যবহার করতে হবে, তা নির্ধারণ করতে এই সার্ভিসটিকে অবশ্যই InstrumentClusterRenderingService#setClusterActivityLaunchOptions() কল করতে হবে। এই প্যারামিটারগুলো ব্যবহার করুন:
    • category. ক্লাস্টাররেন্ডারিংসার্ভিস
    • ActivityOptions. একটি ActivityOptions ইনস্ট্যান্স যা ইন্সট্রুমেন্ট ক্লাস্টারে একটি Activity চালু করতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, AOSP-তে নমুনা ইন্সট্রুমেন্ট ক্লাস্টার ইমপ্লিমেন্টেশন থেকে:
      getService().setClusterActivityLaunchOptions(
        CATEGORY_NAVIGATION,
        ActivityOptions.makeBasic()
            .setLaunchDisplayId(displayId));
  4. যখন ইন্সট্রুমেন্ট ক্লাস্টার অ্যাক্টিভিটিগুলো প্রদর্শন করার জন্য প্রস্তুত হয়, তখন এই সার্ভিসটিকে অবশ্যই InstrumentClusterRenderingService#setClusterActivityState() কল করতে হবে। এই প্যারামিটারগুলো ব্যবহার করুন:
    • category ClusterRenderingService .
    • ClusterRenderingService দিয়ে state বান্ডেল তৈরি করা হয়েছে। এই ডেটা অবশ্যই প্রদান করুন:
      • visible ইন্সট্রুমেন্ট ক্লাস্টারটিকে দৃশ্যমান এবং বিষয়বস্তু প্রদর্শনের জন্য প্রস্তুত হিসাবে নির্দিষ্ট করে।
      • unobscuredBounds একটি আয়তক্ষেত্র যা ইন্সট্রুমেন্ট ক্লাস্টার ডিসপ্লের ভেতরের সেই এলাকাকে সংজ্ঞায়িত করে যেখানে নিরাপদে বিষয়বস্তু প্রদর্শন করা যায়। উদাহরণস্বরূপ, ডায়াল এবং গেজ দ্বারা আবৃত এলাকাগুলো।
  5. Service#dump() মেথডটি ওভাররাইড করুন এবং ডিবাগিংয়ের জন্য প্রয়োজনীয় স্ট্যাটাস তথ্য রিপোর্ট করুন (আরও তথ্যের জন্য dumpsys দেখুন)।

InstrumentClusterRenderingService বাস্তবায়নের নমুনা

নিম্নলিখিত উদাহরণটি একটি InstrumentClusterRenderingService বাস্তবায়নের রূপরেখা দেয়, যা একটি দূরবর্তী ভৌত ডিসপ্লেতে ইন্সট্রুমেন্ট ক্লাস্টারের বিষয়বস্তু উপস্থাপন করার জন্য একটি VirtualDisplay তৈরি করে।

বিকল্পভাবে, এই কোডটি HU-এর সাথে সংযুক্ত কোনো ফিজিক্যাল সেকেন্ডারি ডিসপ্লের displayId পাস করতে পারে, যদি সেরকম কোনো ডিসপ্লে উপলব্ধ আছে বলে জানা যায়।

/**
* Sample {@link InstrumentClusterRenderingService} implementation
*/
public class SampleClusterServiceImpl extends InstrumentClusterRenderingService {
   // Used to retrieve or create displays
   private final DisplayManager mDisplayManager;
   // Unique identifier for the display to be used for instrument
   // cluster
   private final String mUniqueId = UUID.randomUUID().toString();
   // Format of the instrument cluster display
   private static final int DISPLAY_WIDTH = 1280;
   private static final int DISPLAY_HEIGHT = 720;
   private static final int DISPLAY_DPI = 320;
   // Area not covered by instruments
   private static final int DISPLAY_UNOBSCURED_LEFT = 40;
   private static final int DISPLAY_UNOBSCURED_TOP = 0;
   private static final int DISPLAY_UNOBSCURED_RIGHT = 1200;
   private static final int DISPLAY_UNOBSCURED_BOTTOM = 680;
   @Override
   public void onCreate() {
      super.onCreate();
      // Create a virtual display to render instrument cluster activities on
      mDisplayManager = getSystemService(DisplayManager.class);
      VirtualDisplay display = mDisplayManager.createVirtualDisplay(
          mUniqueId, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_DPI, null,
          0 /* flags */, null, null);
      // Do any additional initialization (e.g.: start a video stream
      // based on this virtual display to present activities on a remote
      // display).
      onDisplayReady(display.getDisplay());
}
private void onDisplayReady(Display display) {
    // Report activity options that should be used to launch activities on
    // the instrument cluster.
    String category = CarInstrumentClusterManager.CATEGORY_NAVIGATION;
    ActionOptions options = ActivityOptions.makeBasic()
        .setLaunchDisplayId(display.getDisplayId());
    setClusterActivityOptions(category, options);
    // Report instrument cluster state.
    Rect unobscuredBounds = new Rect(DISPLAY_UNOBSCURED_LEFT,
        DISPLAY_UNOBSCURED_TOP, DISPLAY_UNOBSCURED_RIGHT,
        DISPLAY_UNOBSCURED_BOTTOM);
    boolean visible = true;
    ClusterActivityState state = ClusterActivityState.create(visible,
       unobscuredBounds);
    setClusterActivityState(category, options);
  }
}

CarAppFocusManager API ব্যবহার করুন

CarAppFocusManager API-তে getAppTypeOwner() নামে একটি মেথড রয়েছে, যা OEM-দের দ্বারা লিখিত ক্লাস্টার সার্ভিসকে যেকোনো নির্দিষ্ট সময়ে কোন নেভিগেশন অ্যাপে নেভিগেশন ফোকাস রয়েছে তা জানতে সাহায্য করে। OEM-রা বিদ্যমান CarAppFocusManager#addFocusListener() মেথডটি ব্যবহার করতে পারে এবং তারপর কোন অ্যাপে ফোকাস আছে তা জানতে getAppTypeOwner() ব্যবহার করতে পারে। এই তথ্যের সাহায্যে OEM-রা নিম্নলিখিত কাজগুলো করতে পারে:

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

বর্তমান অ্যাপ ফোকাস (যেমন সক্রিয় নেভিগেশন বা ভয়েস কমান্ড) সেট করতে এবং তা শোনার জন্য CarAppFocusManager ব্যবহার করুন। সাধারণত সিস্টেমে এই ধরনের অ্যাপের কেবল একটি ইনস্ট্যান্সই সক্রিয়ভাবে চলে (বা ফোকাস করা থাকে)।

অ্যাপের ফোকাস পরিবর্তনের জন্য লিসেন করতে CarAppFocusManager#addFocusListener(..) মেথডটি ব্যবহার করুন:

import android.car.CarAppFocusManager;

...

Car car = Car.createCar(this);
mAppFocusManager = (CarAppFocusManager)car.getCarManager(Car.APP_FOCUS_SERVICE);
mAppFocusManager.addFocusListener(this, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);

...

public void onAppFocusChanged(int appType, boolean active) {
    // Use the CarAppFocusManager#getAppTypeOwner(appType) method call
    // to retrieve a list of active package names
}

ফোকাসে থাকা কোনো নির্দিষ্ট অ্যাপ টাইপের বর্তমান মালিকের প্যাকেজ নামগুলো পেতে CarAppFocusManager#getAppTypeOwner(..) মেথডটি ব্যবহার করুন। বর্তমান মালিক যদি android:sharedUserId ফিচারটি ব্যবহার করেন, তবে এই মেথডটি একাধিক প্যাকেজ নাম রিটার্ন করতে পারে।

import android.car.CarAppFocusManager;

...

Car car = Car.createCar(this);
mAppFocusManager = (CarAppFocusManager)car.getCarManager(Car.APP_FOCUS_SERVICE);
List<String> focusOwnerPackageNames = mAppFocusManager.getAppTypeOwner(
              CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);

if (focusOwnerPackageNames == null || focusOwnerPackageNames.isEmpty()) {
        // No Navigation app has focus
        // OEM may choose to show their default cluster view
} else {
       // focusOwnerPackageNames
       // Use the PackageManager to retrieve the cluster activity for the package(s)
       // returned in focusOwnerPackageNames
}

...

টেমপ্লেট অ্যাপগুলি সনাক্ত করুন

যেসব টেমপ্লেট-ভিত্তিক নেভিগেশন অ্যাপ Car App লাইব্রেরি ব্যবহার করে, তাদের ক্ষেত্রে CarAppFocusManager#getAppTypeOwner() হোস্টের প্যাকেজ নামটি (উদাহরণস্বরূপ, com.google.android.apps.automotive.templates.host ) রিটার্ন করে, কারণ হোস্ট ক্লায়েন্ট অ্যাপের পক্ষ থেকে সিস্টেম ফোকাস ধরে রাখে।

নেভিগেটিং ক্লায়েন্ট অ্যাপটি শনাক্ত করার জন্য, OEM-রা CarNavigationStatusManager সাথে পাঠানো নেভিগেশন স্টেট বান্ডেল থেকে প্যাকেজ নামটি বের করে নিতে পারে। NavigationRenderer#onNavigationStateChanged(Bundle) দ্বারা প্রাপ্ত বান্ডেলের মধ্যে active_app_package_name কী-এর অধীনে প্যাকেজ নামটি সংরক্ষিত থাকে।

// In your NavigationRenderer implementation
@Override
public void onNavigationStateChanged(Bundle bundle) {
    if (bundle.containsKey("active_app_package_name")) {
        String activeAppPackage = bundle.getString("active_app_package_name");
        // Use the package name to identify the navigating app (e.g., com.waze)
    }
}

পরিশিষ্ট: নমুনা অ্যাপটি ব্যবহার করুন

AOSP একটি নমুনা অ্যাপ প্রদান করে যা নেভিগেশন স্টেট এপিআই বাস্তবায়ন করে।

এই নমুনা অ্যাপটি চালাতে:

  1. একটি সমর্থিত HU-তে অ্যান্ড্রয়েড অটো বিল্ড এবং ফ্ল্যাশ করুন। আপনার ডিভাইসের জন্য নির্দিষ্ট অ্যান্ড্রয়েড বিল্ড এবং ফ্ল্যাশিং নির্দেশাবলী ব্যবহার করুন। নির্দেশাবলীর জন্য, ‘রেফারেন্স বোর্ড ব্যবহার’ দেখুন।
  2. HU-এর সাথে একটি ফিজিক্যাল সেকেন্ডারি ডিসপ্লে সংযুক্ত করুন (যদি সমর্থিত হয়) অথবা ভার্চুয়াল সেকেন্ডারি HU চালু করুন:
    1. সেটিংস অ্যাপে ডেভেলপার মোড নির্বাচন করুন।
    2. সেটিংস > সিস্টেম > অ্যাডভান্সড > ডেভেলপার অপশন > সেকেন্ডারি ডিসপ্লে সিমুলেট- এ যান।
  3. হেড ইউনিট রিবুট করুন
  4. KitchenSink অ্যাপটি চালু করতে:
    1. ড্রয়ারটি খুলুন।
    2. ইনস্টিটিউট ক্লাস্টারে যান।
    3. স্টার্ট মেটাডেটা-তে ক্লিক করুন।

KitchenSink নেভিগেশন ফোকাসের জন্য অনুরোধ করে, যা DirectRenderingCluster সার্ভিসকে ইন্সট্রুমেন্ট ক্লাস্টারে একটি মক-আপ ইউজার ইন্টারফেস প্রদর্শন করার নির্দেশ দেয়।