সিস্টেম সজ্জা সংক্রান্ত সহায়তা

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

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

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

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

Android 17 ও তার পরবর্তী যেকোনও ভার্সনে, ডিসপ্লেতে সিস্টেম ডেকোরেশনের সুবিধা ডাইনামিক পদ্ধতিতে পরিবর্তন করা যেতে পারে। কোনও ডিসপ্লেতে flag FLAG_ALLOWS_CONTENT_MODE_SWITCH থাকলে, সিস্টেম ব্যবহারকারীকে সিদ্ধান্ত নিতে দেয় যে ডিসপ্লেটি অ্যাপ হোস্ট করবে নাকি অন্য ডিসপ্লে মিরর করবে। ব্যবহারকারী যদি অ্যাপ হোস্ট করার জন্য ডিসপ্লে ব্যবহার করার সিদ্ধান্ত নেন, তাহলেই সিস্টেম সিস্টেম সাজসজ্জা ব্যবহার করে। সিস্টেম UI এবং OEM লঞ্চারের মতো সিস্টেম কম্পোনেন্ট, সিস্টেম ডেকোরেশন তৈরি ও দেখানোর জন্য দায়ী। সিস্টেম সাজসজ্জা ডায়নামিক যোগ করতে বা সরাতে এবং ডিসপ্লে পিছু স্ট্রাকচার ইনিশিয়ালাইজ বা ফ্রি করতে, এই কম্পোনেন্টগুলিকে অবশ্যই একটি IDisplayWindowListener ইনস্ট্যান্স রেজিস্টার করতে হবে এবং IDisplayWindowListener.onDisplayAddSystemDecorations ও IDisplayWindowListener.onDisplayRemoveSystemDecorations পদ্ধতি ইমপ্লিমেন্ট করতে হবে। IDisplayWindowListener হল একটি লুকানো API যা শুধুমাত্র সিস্টেম কম্পোনেন্টগুলির জন্য উপলভ্য।

প্রয়োগ

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

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

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

Android 10 শুধুমাত্র নেভিগেশন বারের জন্য সিস্টেম ডেকর উইন্ডো সাপোর্ট যোগ করে কারণ অ্যাক্টিভিটি ও অ্যাপের মধ্যে নেভিগেট করার জন্য নেভিগেশন বার প্রয়োজনীয়। ডিফল্ট হিসেবে, নেভিগেশন বারে 'ফিরে যান' ও 'হোম' অ্যাফর্ডেন্স দেখানো হয়। টার্গেট ডিসপ্লেতে সিস্টেম ডেকোরেশন (DisplayWindowSettings দেখুন) কাজ করলে তবেই নেভিগেশন বার অন্তর্ভুক্ত করা হয়।

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

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

প্রয়োগ

অতিরিক্ত সিস্টেম UI ফিচার প্রয়োগ করতে, ডিভাইস প্রস্তুতকারকদের একটি সিঙ্গেল সিস্টেম UI কম্পোনেন্ট ব্যবহার করতে হবে যা ডিসপ্লে যোগ করা বা সরানোর জন্য শোনে এবং উপযুক্ত কন্টেন্ট দেখায়।

মাল্টি-ডিসপ্লে (MD) কাজ করে এমন সিস্টেম UI কম্পোনেন্টকে নিম্নলিখিত বিষয়গুলি ম্যানেজ করতে হবে:

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

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

এছাড়াও, Android 10-এ এইসব আপডেট পাওয়া যায়:

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

লঞ্চার

Android 10-এ, সিস্টেম ডেকোরেশন কাজ করে এমন প্রতিটি ডিসপ্লেতে লঞ্চার অ্যাক্টিভিটির জন্য ডিফল্ট হিসেবে WindowConfiguration#ACTIVITY_TYPE_HOME টাইপের একটি ডেডিকেটেড হোম স্ট্যাক থাকে। প্রতিটি ডিসপ্লে লঞ্চার অ্যাক্টিভিটির আলাদা আলাদা ইনস্ট্যান্স ব্যবহার করে:

ছবি ১. প্ল্যাটফর্ম/ডেভেলপমেন্ট/স্যাম্পেল/MultiDisplay-এর জন্য মাল্টি-ডিসপ্লে লঞ্চারের উদাহরণ।

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

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

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

প্রয়োগ

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

নিরাপত্তা সংক্রান্ত বিধিনিষেধ

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

ওয়ালপেপার

Android 10 ও এর পরবর্তী যেকোনও ভার্সনে, সেকেন্ডারি ডিসপ্লেতে ওয়ালপেপার কাজ করে:

ছবি ২. ইন্টার্নাল (উপরে) ও এক্সটার্নাল ডিসপ্লেতে (নিচে) লাইভ ওয়ালপেপার।

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

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

আলাদা আলাদা স্ক্রিনের জন্য ওয়ালপেপার বেছে নিন

Android 10-এ আলাদা আলাদা স্ক্রিনের জন্য ওয়ালপেপার বেছে নেওয়ার জন্য সরাসরি প্ল্যাটফর্ম সাপোর্ট প্রদান করা হয় না। এটি করার জন্য, প্রতিটি ডিসপ্লেতে ওয়ালপেপার সেটিংস বজায় রাখতে একটি স্টেবল ডিসপ্লে আইডেন্টিফায়ার প্রয়োজন। Display#getDisplayId ডায়নামিক, তাই রিবুট করার পরে ফিজিক্যাল ডিসপ্লেতে একই আইডি থাকবে তার কোনও গ্যারান্টি নেই।

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

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

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

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

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

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

সুরক্ষা সংক্রান্ত বিধিনিষেধ

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

প্রয়োগ

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

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

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

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

লাইভ ওয়ালপেপার সংক্রান্ত সহায়তা চালু করা

Android 10 এবং তার পরবর্তী ভার্সনে (API 29), ডেভেলপাররা android:supportsMultipleDisplays অ্যাট্রিবিউট ব্যবহার করে তাদের ওয়ালপেপার বিভিন্ন ডিসপ্লে জুড়ে দেখানো যাবে কিনা তা নির্দেশ করতে পারেন। ডেস্কটপ উইন্ডোয়িং এনভায়রনমেন্টে, যেখানে মাল্টিটাস্কিং খুব বেশি হয়, সেখানে এক্সটার্নাল ডিসপ্লেতে লাইভ ওয়ালপেপার রেন্ডার করলে GPU ও মেমরি ওভারহেডের উপর উল্লেখযোগ্য প্রভাব পড়তে পারে।

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

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/ হয়।