সিস্টেম সজ্জা সমর্থন

প্রদর্শন-নির্দিষ্ট এই ক্ষেত্রগুলিতে করা আপডেটগুলি এই পৃষ্ঠায় দেওয়া হয়েছে।

সিস্টেম সজ্জা

অ্যান্ড্রয়েড ১০-এ ওয়ালপেপার, নেভিগেশন বার এবং লঞ্চারের মতো নির্দিষ্ট কিছু সিস্টেম ডেকোরেশন দেখানোর জন্য সেকেন্ডারি ডিসপ্লে কনফিগার করার সুবিধা যোগ করা হয়েছে। ডিফল্টরূপে, প্রাইমারি ডিসপ্লেতে সমস্ত সিস্টেম ডেকোরেশন দেখানো হয় এবং সেকেন্ডারি ডিসপ্লেগুলোতে ঐচ্ছিকভাবে সক্রিয় করা ডেকোরেশনগুলো প্রদর্শিত হয়। আপনি অন্যান্য সিস্টেম ডেকোরেশন থেকে আলাদাভাবে একটি ইনপুট মেথড এডিটর (IME)-এর জন্য সাপোর্ট সেট করতে পারেন।

কোনো নির্দিষ্ট ডিসপ্লেতে সিস্টেম ডেকোরেশনের জন্য সাপোর্ট যোগ করতে অথবা /data/system/display_settings.xml ফাইলে একটি ডিফল্ট ভ্যালু প্রদান করতে DisplayWindowSettings#setShouldShowSystemDecorsLocked ব্যবহার করুন। উদাহরণের জন্য, ডিসপ্লে উইন্ডো সেটিংস দেখুন।

বাস্তবায়ন

পরীক্ষার জন্য DisplayWindowSettings#setShouldShowSystemDecorsLocked মেথডটিকে WindowManager#setShouldShowSystemDecors মেথডেও অন্তর্ভুক্ত করা হয়েছে। সিস্টেম ডেকোরেশন চালু করার উদ্দেশ্যে এই মেথডটি ট্রিগার করলে, পূর্বে অনুপস্থিত ডেকোর উইন্ডোগুলো যুক্ত হয় না, অথবা পূর্বে উপস্থিত থাকলে সেগুলো মুছেও যায় না। বেশিরভাগ ক্ষেত্রে, সিস্টেম ডেকোরেশন সাপোর্টের এই পরিবর্তনটি ডিভাইস রিবুট করার পরেই সম্পূর্ণরূপে কার্যকর হয়।

WindowManager কোডবেসে সিস্টেম ডেকোরেশনের সমর্থনের জন্য সাধারণত DisplayContent#supportsSystemDecorations চেক করা হয়, অন্যদিকে এক্সটার্নাল সার্ভিসের (যেমন নেভিগেশন বার দেখানো হবে কিনা তা পরীক্ষা করার জন্য সিস্টেম UI) ক্ষেত্রে WindowManager#shouldShowSystemDecors ব্যবহৃত হয়। এই সেটিং দ্বারা কী নিয়ন্ত্রিত হয় তা বুঝতে, এই মেথডগুলোর কল পয়েন্টগুলো খতিয়ে দেখুন।

সিস্টেম UI ডেকোর উইন্ডো

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

স্ট্যাটাস বার একটি অপেক্ষাকৃত জটিল সিস্টেম উইন্ডো, কারণ এতে নোটিফিকেশন শেড, কুইক সেটিংস এবং লক স্ক্রিনও থাকে। অ্যান্ড্রয়েড ১০-এ সেকেন্ডারি ডিসপ্লেতে স্ট্যাটাস বার সমর্থিত নয়। তাই, নোটিফিকেশন, সেটিংস এবং সম্পূর্ণ কীগার্ড শুধুমাত্র প্রাইমারি ডিসপ্লেতেই পাওয়া যায়।

সেকেন্ডারি স্ক্রিনে ওভারভিউ বা রিসেন্টস সিস্টেম উইন্ডো সমর্থিত নয়। অ্যান্ড্রয়েড ১০-এ, AOSP শুধুমাত্র ডিফল্ট ডিসপ্লেতে রিসেন্টস প্রদর্শন করে এবং এতে সমস্ত ডিসপ্লের অ্যাক্টিভিটি অন্তর্ভুক্ত থাকে। রিসেন্টস থেকে চালু করা হলে, কোনো সেকেন্ডারি ডিসপ্লেতে থাকা অ্যাক্টিভিটি ডিফল্টরূপে সেই ডিসপ্লেতে সামনে চলে আসে। এই পদ্ধতিতে কিছু পরিচিত সমস্যা রয়েছে, যেমন অন্য স্ক্রিনে অ্যাপ দেখা গেলে তা সঙ্গে সঙ্গে আপডেট না হওয়া।

বাস্তবায়ন

অতিরিক্ত সিস্টেম UI বৈশিষ্ট্যগুলি বাস্তবায়ন করতে, ডিভাইস নির্মাতাদের এমন একটি একক সিস্টেম UI কম্পোনেন্ট ব্যবহার করা উচিত যা ডিসপ্লে যুক্ত হওয়া বা অপসারণের বিষয়টি পর্যবেক্ষণ করে এবং উপযুক্ত বিষয়বস্তু উপস্থাপন করে।

একটি সিস্টেম UI কম্পোনেন্ট যা মাল্টি-ডিসপ্লে (MD) সমর্থন করে, তার নিম্নলিখিত ক্ষেত্রগুলি পরিচালনা করা উচিত:

  • স্টার্টআপে একাধিক ডিসপ্লে প্রারম্ভিককরণ
  • রান টাইমে ডিসপ্লে যোগ করা হয়েছে
  • রান টাইমে ডিসপ্লে সরানো হয়েছে

যখন সিস্টেম UI, WindowManager-এর আগে একটি ডিসপ্লে যুক্ত হওয়া শনাক্ত করে, তখন এটি একটি রেস কন্ডিশন তৈরি করে। DisplayManager.DisplayListener ইভেন্টগুলিতে সাবস্ক্রাইব করার পরিবর্তে, যখন একটি ডিসপ্লে যুক্ত হয় তখন WindowManager থেকে সিস্টেম UI-তে একটি কাস্টম কলব্যাক প্রয়োগ করে আপনি এটি এড়াতে পারেন। একটি রেফারেন্স ইমপ্লিমেন্টেশনের জন্য, নেভিগেশন বার সাপোর্টের জন্য CommandQueue.Callbacks#onDisplayAddSystemDecorations এবং ওয়ালপেপারের জন্য WallpaperManagerInternal#onDisplayAddSystemDecorations দেখুন।

এছাড়াও, অ্যান্ড্রয়েড ১০ এই আপডেটগুলো প্রদান করে:

  • NavigationBarController ক্লাসটি নেভিগেশন বারের সমস্ত কার্যকারিতা নিয়ন্ত্রণ করে।
  • কাস্টমাইজড নেভিগেশন বার দেখতে, CarStatusBar দেখুন।
  • TYPE_NAVIGATION_BAR এখন আর একটিমাত্র ইনস্ট্যান্সে সীমাবদ্ধ নয় এবং প্রতিটি ডিসপ্লেতে ব্যবহার করা যায়।
  • IWindowManager#hasNavigationBar আপডেট করা হয়েছে যাতে এটি শুধুমাত্র সিস্টেম UI-এর জন্য displayId প্যারামিটারটি অন্তর্ভুক্ত করে।

লঞ্চার

অ্যান্ড্রয়েড ১০-এ, সিস্টেম ডেকোরেশন সমর্থন করার জন্য কনফিগার করা প্রতিটি ডিসপ্লেতে ডিফল্টরূপে লঞ্চার অ্যাক্টিভিটির জন্য WindowConfiguration#ACTIVITY_TYPE_HOME টাইপের একটি ডেডিকেটেড হোম স্ট্যাক থাকে। প্রতিটি ডিসপ্লে লঞ্চার অ্যাক্টিভিটির একটি পৃথক ইনস্ট্যান্স ব্যবহার করে:

চিত্র ১. platform/development/samples/MultiDisplay-এর জন্য মাল্টি-ডিসপ্লে লঞ্চারের উদাহরণ।

বেশিরভাগ বিদ্যমান লঞ্চার একাধিক ইনস্ট্যান্স সমর্থন করে না এবং বড় স্ক্রিনের আকারের জন্য অপ্টিমাইজ করা নয়। এছাড়াও, সেকেন্ডারি/এক্সটার্নাল ডিসপ্লেতে প্রায়শই একটি ভিন্ন ধরনের অভিজ্ঞতা প্রত্যাশিত থাকে। সেকেন্ডারি স্ক্রিনের জন্য একটি ডেডিকেটেড অ্যাক্টিভিটি প্রদান করতে, অ্যান্ড্রয়েড ১০ ইন্টেন্ট ফিল্টারে SECONDARY_HOME ক্যাটাগরিটি চালু করেছে। সিস্টেম ডেকোরেশন সমর্থনকারী সমস্ত ডিসপ্লেতে এই অ্যাক্টিভিটির ইনস্ট্যান্সগুলো ব্যবহৃত হয়, প্রতি ডিসপ্লেতে একটি করে।

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

অ্যাক্টিভিটিটির এমন একটি লঞ্চ মোড থাকতে হবে যা একাধিক ইনস্ট্যান্সকে বাধা দেয় না এবং বিভিন্ন স্ক্রিন সাইজের সাথে খাপ খাইয়ে নিতে পারে। লঞ্চ মোডটি singleInstance বা singleTask হতে পারবে না।

বাস্তবায়ন

অ্যান্ড্রয়েড ১০-এ, RootActivityContainer#startHomeOnDisplay হোম স্ক্রিনটি যে ডিসপ্লে থেকে চালু করা হচ্ছে তার উপর নির্ভর করে স্বয়ংক্রিয়ভাবে কাঙ্ক্ষিত কম্পোনেন্ট এবং ইন্টেন্ট নির্বাচন করে। RootActivityContainer#resolveSecondaryHomeActivity বর্তমানে নির্বাচিত লঞ্চারের উপর নির্ভর করে লঞ্চার অ্যাক্টিভিটি কম্পোনেন্ট খুঁজে বের করার লজিক রয়েছে এবং প্রয়োজনে এটি সিস্টেমের ডিফল্ট কম্পোনেন্টও ব্যবহার করতে পারে (দেখুন ActivityTaskManagerService#getSecondaryHomeIntent )।

নিরাপত্তা বিধিনিষেধ

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

ওয়ালপেপার

অ্যান্ড্রয়েড ১০ এবং এর পরবর্তী সংস্করণগুলোতে সেকেন্ডারি ডিসপ্লেতে ওয়ালপেপার সাপোর্ট করে:

চিত্র ২. অভ্যন্তরীণ (উপরে) এবং বাহ্যিক ডিসপ্লেতে (নিচে) লাইভ ওয়ালপেপার।

ডেভেলপাররা WallpaperInfo XML ডেফিনিশনে android:supportsMultipleDisplays="true" প্রদান করে ওয়ালপেপার ফিচারের জন্য সমর্থন ঘোষণা করতে পারেন। ওয়ালপেপার ডেভেলপারদের WallpaperService.Engine#getDisplayContext এ ডিসপ্লে কনটেক্সট ব্যবহার করে অ্যাসেট লোড করার কথাও বলা হয়েছে।

ফ্রেমওয়ার্কটি প্রতিটি ডিসপ্লের জন্য একটি করে WallpaperService.Engine ইনস্ট্যান্স তৈরি করে, ফলে প্রতিটি ইঞ্জিনের নিজস্ব সারফেস এবং ডিসপ্লে কনটেক্সট থাকে। ডেভেলপারকে নিশ্চিত করতে হবে যে প্রতিটি ইঞ্জিন VSync মেনে ভিন্ন ভিন্ন ফ্রেম রেটে স্বাধীনভাবে ড্র করতে পারে।

প্রতিটি স্ক্রিনের জন্য ওয়ালপেপার নির্বাচন করুন

অ্যান্ড্রয়েড ১০ আলাদা আলাদা স্ক্রিনের জন্য ওয়ালপেপার বেছে নেওয়ার ক্ষেত্রে সরাসরি প্ল্যাটফর্ম সাপোর্ট দেয় না। এটি করার জন্য, প্রতিটি ডিসপ্লের ওয়ালপেপার সেটিংস ধরে রাখতে একটি স্থিতিশীল ডিসপ্লে আইডেন্টিফায়ার প্রয়োজন। Display#getDisplayId ডাইনামিক, তাই রিবুটের পর কোনো ফিজিক্যাল ডিসপ্লের আইডি একই থাকবে এমন কোনো নিশ্চয়তা নেই।

তবে, অ্যান্ড্রয়েড ১০-এ DisplayInfo.mAddress যুক্ত করা হয়েছে, যাতে ফিজিক্যাল ডিসপ্লেগুলোর জন্য স্থিতিশীল আইডেন্টিফায়ার রয়েছে এবং যা ভবিষ্যতে একটি পূর্ণাঙ্গ বাস্তবায়নের জন্য ব্যবহার করা যেতে পারে। দুর্ভাগ্যবশত, অ্যান্ড্রয়েড ১০-এর জন্য এই লজিকটি বাস্তবায়ন করতে এখন অনেক দেরি হয়ে গেছে। প্রস্তাবিত সমাধানটি হলো:

  1. ওয়ালপেপার সেট করতে WallpaperManager ক্লাসটি ব্যবহার করুন।

    WallpaperManager একটি Context অবজেক্ট থেকে পাওয়া যায়, এবং প্রতিটি Context অবজেক্টে সংশ্লিষ্ট ডিসপ্লে সম্পর্কিত তথ্য থাকে ( Context#getDisplay/getDisplayId )। সুতরাং, আপনি নতুন কোনো মেথড যোগ না করেই একটি WallpaperManager ইনস্ট্যান্স থেকে displayId পেতে পারেন।

  2. ফ্রেমওয়ার্কের দিকে, একটি Context অবজেক্ট থেকে প্রাপ্ত displayId ব্যবহার করুন এবং এটিকে একটি স্ট্যাটিক আইডেন্টিফায়ারের (যেমন কোনো ফিজিক্যাল ডিসপ্লের পোর্ট) সাথে ম্যাপ করুন। নির্বাচিত ওয়ালপেপারটি স্থায়ীভাবে সংরক্ষণ করতে স্ট্যাটিক আইডেন্টিফায়ারটি ব্যবহার করুন।

এই বিকল্প পদ্ধতিটি ওয়ালপেপার পিকারের জন্য বিদ্যমান ইমপ্লিমেন্টেশনগুলো ব্যবহার করে। যদি এটি একটি নির্দিষ্ট ডিসপ্লেতে খোলা হয়ে থাকে এবং সঠিক কনটেক্সট ব্যবহার করে, তাহলে যখন এটি ওয়ালপেপার সেট করার জন্য কল করে, তখন সিস্টেম স্বয়ংক্রিয়ভাবে ডিসপ্লেটি শনাক্ত করতে পারে।

বর্তমান ডিসপ্লে ছাড়া অন্য কোনো ডিসপ্লের জন্য ওয়ালপেপার সেট করার প্রয়োজন হলে, টার্গেট ডিসপ্লেটির জন্য একটি নতুন Context অবজেক্ট তৈরি করুন ( Context#createDisplayContext ) এবং সেই ডিসপ্লে থেকে WallpaperManager ইনস্ট্যান্সটি সংগ্রহ করুন।

নিরাপত্তা বিধিনিষেধ

সিস্টেমটি তার নিজের নয় এমন ভার্চুয়াল ডিসপ্লেতে ওয়ালপেপার দেখাবে না। এর কারণ হলো একটি নিরাপত্তা ঝুঁকি, যেখানে কোনো ক্ষতিকারক অ্যাপ সিস্টেম ডেকোরেশন সাপোর্ট চালু রেখে একটি ভার্চুয়াল ডিসপ্লে তৈরি করে সেখান থেকে ব্যবহারকারীর সংবেদনশীল তথ্য (যেমন ব্যক্তিগত ছবি) পড়ে নিতে পারে।

বাস্তবায়ন

অ্যান্ড্রয়েড ১০-এ, IWallpaperConnection#attachEngine এবং IWallpaperService#attach ইন্টারফেসগুলো প্রতি-ডিসপ্লে সংযোগ তৈরি করার জন্য displayId প্যারামিটার গ্রহণ করে। WallpaperManagerService.DisplayConnector একটি প্রতি-ডিসপ্লে ওয়ালপেপার ইঞ্জিন এবং সংযোগকে এনক্যাপসুলেট করে। WindowManager-এ, সমস্ত ডিসপ্লের জন্য একটিমাত্র WallpaperController তৈরি না করে, কনস্ট্রাকশনের সময় প্রতিটি DisplayContent অবজেক্টের জন্য আলাদা ওয়ালপেপার কন্ট্রোলার তৈরি করা হয়।

WallpaperManager কিছু পাবলিক মেথড ইমপ্লিমেন্টেশন (যেমন WallpaperManager#getDesiredMinimumWidth ) সংশ্লিষ্ট ডিসপ্লেগুলোর জন্য তথ্য গণনা ও সরবরাহ করার জন্য আপডেট করা হয়েছে। WallpaperInfo#supportsMultipleDisplays এবং একটি সংশ্লিষ্ট রিসোর্স অ্যাট্রিবিউট যোগ করা হয়েছে, যাতে অ্যাপ ডেভেলপাররা জানাতে পারেন কোন ওয়ালপেপারগুলো একাধিক স্ক্রিনের জন্য প্রস্তুত।

যদি ডিফল্ট ডিসপ্লেতে দেখানো ওয়ালপেপার পরিষেবাটি একাধিক ডিসপ্লে সমর্থন না করে, তাহলে সিস্টেমটি সেকেন্ডারি ডিসপ্লেগুলিতে ডিফল্ট ওয়ালপেপার দেখায়:

চিত্র ৩. সেকেন্ডারি ডিসপ্লেগুলির জন্য ওয়ালপেপার ফলব্যাক লজিক।

লাইভ ওয়ালপেপার সমর্থন সক্রিয় করুন

অ্যান্ড্রয়েড ১০ এবং তার পরবর্তী সংস্করণগুলিতে (এপিআই ২৯), ডেভেলপাররা তাদের ওয়ালপেপার একাধিক ডিসপ্লে জুড়ে বিস্তৃত হতে পারবে কিনা তা নির্দেশ করতে android:supportsMultipleDisplays অ্যাট্রিবিউটটি ব্যবহার করতে পারেন। ডেস্কটপ উইন্ডোইং পরিবেশে, যেখানে মাল্টিটাস্কিং ঘন ঘন হয়, সেখানে বাহ্যিক ডিসপ্লেতে লাইভ ওয়ালপেপার রেন্ডার করা জিপিইউ এবং মেমরির উপর উল্লেখযোগ্যভাবে প্রভাব ফেলতে পারে।

সিস্টেম রিসোর্স সংরক্ষণের জন্য, সিস্টেম ডিফল্টরূপে সংযুক্ত ডিসপ্লেগুলিতে লাইভ ওয়ালপেপার রেন্ডার করে না। যখন সিস্টেম কনফিগারেশন বা অ্যাপের ম্যানিফেস্ট দ্বারা কোনো লাইভ ওয়ালপেপার সীমাবদ্ধ করা হয়, তখন সিস্টেম একটি ফলব্যাক স্ট্যাটিক ওয়ালপেপার রেন্ডার করে।

OEM-রা হাই-এন্ড হার্ডওয়্যারের জন্য লাইভ ওয়ালপেপার সাপোর্ট চালু করে অথবা ব্র্যান্ডেড লুকের জন্য স্ট্যাটিক ফলব্যাক কাস্টমাইজ করে এই অভিজ্ঞতাকে নিজেদের প্রয়োজনমতো পরিবর্তন করতে পারে।

আপনার হার্ডওয়্যার যদি একাধিক লাইভ ওয়ালপেপার ইনস্ট্যান্স রেন্ডার করতে পারে, তাহলে নিম্নলিখিত কনফিগারেশনটি ওভাররাইড করুন:

রিসোর্স পাথ frameworks/base/core/res/res/values/config.xml
কনফিগারেশনের নাম config_isLiveWallpaperSupportedInDesktopExperience

ফলব্যাক ওয়ালপেপার কাস্টমাইজ করুন

যদি লাইভ ওয়ালপেপার প্রদানকারী দ্বারা নিষ্ক্রিয় বা অসমর্থিত থাকে, তাহলে সিস্টেম একটি ডিফল্ট কম্পোনেন্ট ব্যবহার করে। আপনি এটিকে আপনার নিজস্ব স্ট্যাটিক ওয়ালপেপার প্রদানকারীর দিকে নির্দেশ করতে পারেন:

রিসোর্স পাথ frameworks/base/core/res/res/values/config.xml
কনফিগারেশনের নাম fallback_wallpaper_component

ওয়ালপেপার সমর্থন বাস্তবায়ন করুন

এই পরিবর্তনগুলি প্রয়োগ করতে, আপনার ডিভাইস-নির্দিষ্ট ফোল্ডারে একটি বিল্ড-টাইম রিসোর্স ওভারলে ব্যবহার করুন, যা সাধারণত device/<vendor>/<product>/overlay/frameworks/base/core/res/res/values/ হয়ে থাকে।