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

এই ডিসপ্লে-নির্দিষ্ট ক্ষেত্রগুলিতে করা আপডেটগুলি নীচে সরবরাহ করা হয়েছে:

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

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

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

বাস্তবায়ন

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

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

সিস্টেম UI সজ্জা উইন্ডোজ

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

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

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

বাস্তবায়ন

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

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

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

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

উপরন্তু, Android 10 এই আপডেটগুলি প্রদান করে:

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

লঞ্চার

অ্যান্ড্রয়েড 10-এ, সিস্টেম সজ্জাকে সমর্থন করার জন্য কনফিগার করা প্রতিটি ডিসপ্লেতে ডিফল্টরূপে WindowConfiguration#ACTIVITY_TYPE_HOME টাইপ সহ লঞ্চার কার্যকলাপের জন্য একটি ডেডিকেটেড হোম স্ট্যাক রয়েছে। প্রতিটি ডিসপ্লে লঞ্চার কার্যকলাপের একটি পৃথক উদাহরণ ব্যবহার করে।

চিত্র 1. platform/development/samples/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() )।

নিরাপত্তা সীমাবদ্ধতা

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

ওয়ালপেপার

অ্যান্ড্রয়েড 10 (এবং উচ্চতর), ওয়ালপেপারগুলি সেকেন্ডারি ডিসপ্লেতে সমর্থিত:

চিত্র 2. অভ্যন্তরীণ (উপরে) এবং বাহ্যিক প্রদর্শনে (নীচে) লাইভ ওয়ালপেপার

বিকাশকারীরা WallpaperInfo XML সংজ্ঞাতে android:supportsMultipleDisplays="true" প্রদান করে ওয়ালপেপার বৈশিষ্ট্যের জন্য সমর্থন ঘোষণা করতে পারে৷ ওয়ালপেপার বিকাশকারীরা WallpaperService.Engine#getDisplayContext() এ প্রদর্শনের প্রসঙ্গ ব্যবহার করে সম্পদ লোড করবে বলে আশা করা হচ্ছে।

ফ্রেমওয়ার্ক প্রতি ডিসপ্লেতে একটি WallpaperService.Engine ইন্সট্যান্স তৈরি করে, তাই প্রতিটি ইঞ্জিনের নিজস্ব পৃষ্ঠ এবং প্রদর্শনের প্রসঙ্গ রয়েছে। বিকাশকারীকে নিশ্চিত করতে হবে যে প্রতিটি ইঞ্জিন স্বাধীনভাবে, বিভিন্ন ফ্রেম হারে, VSYNC কে সম্মান করে আঁকতে পারে৷

পৃথক পর্দা জন্য ওয়ালপেপার নির্বাচন করুন

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

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

  1. ওয়ালপেপার সেট করতে WallpaperManager API ব্যবহার করুন।
  2. WallpaperManager একটি Context অবজেক্ট থেকে প্রাপ্ত করা হয় এবং প্রতিটি Context অবজেক্টে সংশ্লিষ্ট ডিসপ্লে সম্পর্কে তথ্য থাকে ( Context#getDisplay()/getDisplayId() )। অতএব, আপনি নতুন পদ্ধতি যোগ না করে একটি WallpaperManager উদাহরণ থেকে displayId পেতে পারেন।
  3. ফ্রেমওয়ার্কের দিকে, একটি Context বস্তু থেকে প্রাপ্ত displayId ব্যবহার করুন এবং এটিকে একটি স্ট্যাটিক শনাক্তকারীতে ম্যাপ করুন (যেমন একটি শারীরিক প্রদর্শনের পোর্ট)। নির্বাচিত ওয়ালপেপারটি বজায় রাখতে স্ট্যাটিক শনাক্তকারী ব্যবহার করুন।

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

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

নিরাপত্তা সীমাবদ্ধতা

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

বাস্তবায়ন

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

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

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

চিত্র 3. গৌণ প্রদর্শনের জন্য ওয়ালপেপার ফলব্যাক যুক্তি

,

এই ডিসপ্লে-নির্দিষ্ট ক্ষেত্রগুলিতে করা আপডেটগুলি নীচে সরবরাহ করা হয়েছে:

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

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

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

বাস্তবায়ন

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

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

সিস্টেম UI সজ্জা উইন্ডোজ

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

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

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

বাস্তবায়ন

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

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

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

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

উপরন্তু, Android 10 এই আপডেটগুলি প্রদান করে:

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

লঞ্চার

অ্যান্ড্রয়েড 10-এ, সিস্টেম সজ্জাকে সমর্থন করার জন্য কনফিগার করা প্রতিটি ডিসপ্লেতে ডিফল্টরূপে WindowConfiguration#ACTIVITY_TYPE_HOME টাইপ সহ লঞ্চার কার্যকলাপের জন্য একটি ডেডিকেটেড হোম স্ট্যাক রয়েছে। প্রতিটি ডিসপ্লে লঞ্চার কার্যকলাপের একটি পৃথক উদাহরণ ব্যবহার করে।

চিত্র 1. platform/development/samples/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() )।

নিরাপত্তা সীমাবদ্ধতা

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

ওয়ালপেপার

অ্যান্ড্রয়েড 10 (এবং উচ্চতর), ওয়ালপেপারগুলি সেকেন্ডারি ডিসপ্লেতে সমর্থিত:

চিত্র 2. অভ্যন্তরীণ (উপরে) এবং বাহ্যিক প্রদর্শনে (নীচে) লাইভ ওয়ালপেপার

বিকাশকারীরা WallpaperInfo XML সংজ্ঞাতে android:supportsMultipleDisplays="true" প্রদান করে ওয়ালপেপার বৈশিষ্ট্যের জন্য সমর্থন ঘোষণা করতে পারে৷ ওয়ালপেপার বিকাশকারীরা WallpaperService.Engine#getDisplayContext() এ প্রদর্শনের প্রসঙ্গ ব্যবহার করে সম্পদ লোড করবে বলে আশা করা হচ্ছে।

ফ্রেমওয়ার্ক প্রতি ডিসপ্লেতে একটি WallpaperService.Engine ইন্সট্যান্স তৈরি করে, তাই প্রতিটি ইঞ্জিনের নিজস্ব পৃষ্ঠ এবং প্রদর্শনের প্রসঙ্গ রয়েছে। বিকাশকারীকে নিশ্চিত করতে হবে যে প্রতিটি ইঞ্জিন স্বাধীনভাবে, বিভিন্ন ফ্রেম হারে, VSYNC কে সম্মান করে আঁকতে পারে৷

পৃথক পর্দা জন্য ওয়ালপেপার নির্বাচন করুন

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

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

  1. ওয়ালপেপার সেট করতে WallpaperManager API ব্যবহার করুন।
  2. WallpaperManager একটি Context অবজেক্ট থেকে প্রাপ্ত করা হয় এবং প্রতিটি Context অবজেক্টে সংশ্লিষ্ট ডিসপ্লে সম্পর্কে তথ্য থাকে ( Context#getDisplay()/getDisplayId() )। অতএব, আপনি নতুন পদ্ধতি যোগ না করে একটি WallpaperManager উদাহরণ থেকে displayId পেতে পারেন।
  3. ফ্রেমওয়ার্কের দিকে, একটি Context বস্তু থেকে প্রাপ্ত displayId ব্যবহার করুন এবং এটিকে একটি স্ট্যাটিক শনাক্তকারীতে ম্যাপ করুন (যেমন একটি শারীরিক প্রদর্শনের পোর্ট)। নির্বাচিত ওয়ালপেপারটি বজায় রাখতে স্ট্যাটিক শনাক্তকারী ব্যবহার করুন।

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

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

নিরাপত্তা সীমাবদ্ধতা

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

বাস্তবায়ন

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

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

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

চিত্র 3. গৌণ প্রদর্শনের জন্য ওয়ালপেপার ফলব্যাক যুক্তি

,

এই ডিসপ্লে-নির্দিষ্ট ক্ষেত্রগুলিতে করা আপডেটগুলি নীচে সরবরাহ করা হয়েছে:

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

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

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

বাস্তবায়ন

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

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

সিস্টেম UI সজ্জা উইন্ডোজ

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

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

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

বাস্তবায়ন

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

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

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

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

উপরন্তু, Android 10 এই আপডেটগুলি প্রদান করে:

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

লঞ্চার

অ্যান্ড্রয়েড 10-এ, সিস্টেম সজ্জাকে সমর্থন করার জন্য কনফিগার করা প্রতিটি ডিসপ্লেতে ডিফল্টরূপে WindowConfiguration#ACTIVITY_TYPE_HOME টাইপ সহ লঞ্চার কার্যকলাপের জন্য একটি ডেডিকেটেড হোম স্ট্যাক রয়েছে। প্রতিটি ডিসপ্লে লঞ্চার কার্যকলাপের একটি পৃথক উদাহরণ ব্যবহার করে।

চিত্র 1. platform/development/samples/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() )।

নিরাপত্তা সীমাবদ্ধতা

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

ওয়ালপেপার

অ্যান্ড্রয়েড 10 (এবং উচ্চতর), ওয়ালপেপারগুলি সেকেন্ডারি ডিসপ্লেতে সমর্থিত:

চিত্র 2. অভ্যন্তরীণ (উপরে) এবং বাহ্যিক প্রদর্শনে (নীচে) লাইভ ওয়ালপেপার

বিকাশকারীরা WallpaperInfo XML সংজ্ঞাতে android:supportsMultipleDisplays="true" প্রদান করে ওয়ালপেপার বৈশিষ্ট্যের জন্য সমর্থন ঘোষণা করতে পারে৷ ওয়ালপেপার বিকাশকারীরা WallpaperService.Engine#getDisplayContext() এ প্রদর্শনের প্রসঙ্গ ব্যবহার করে সম্পদ লোড করবে বলে আশা করা হচ্ছে।

ফ্রেমওয়ার্ক প্রতি ডিসপ্লেতে একটি WallpaperService.Engine ইন্সট্যান্স তৈরি করে, তাই প্রতিটি ইঞ্জিনের নিজস্ব পৃষ্ঠ এবং প্রদর্শনের প্রসঙ্গ রয়েছে। বিকাশকারীকে নিশ্চিত করতে হবে যে প্রতিটি ইঞ্জিন স্বাধীনভাবে, বিভিন্ন ফ্রেম হারে, VSYNC কে সম্মান করে আঁকতে পারে৷

পৃথক পর্দা জন্য ওয়ালপেপার নির্বাচন করুন

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

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

  1. ওয়ালপেপার সেট করতে WallpaperManager API ব্যবহার করুন।
  2. WallpaperManager একটি Context অবজেক্ট থেকে প্রাপ্ত করা হয় এবং প্রতিটি Context অবজেক্টে সংশ্লিষ্ট ডিসপ্লে সম্পর্কে তথ্য থাকে ( Context#getDisplay()/getDisplayId() )। অতএব, আপনি নতুন পদ্ধতি যোগ না করে একটি WallpaperManager উদাহরণ থেকে displayId পেতে পারেন।
  3. ফ্রেমওয়ার্কের দিকে, একটি Context বস্তু থেকে প্রাপ্ত displayId ব্যবহার করুন এবং এটিকে একটি স্ট্যাটিক শনাক্তকারীতে ম্যাপ করুন (যেমন একটি শারীরিক প্রদর্শনের পোর্ট)। নির্বাচিত ওয়ালপেপারটি বজায় রাখতে স্ট্যাটিক শনাক্তকারী ব্যবহার করুন।

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

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

নিরাপত্তা সীমাবদ্ধতা

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

বাস্তবায়ন

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

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

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

চিত্র 3. গৌণ প্রদর্শনের জন্য ওয়ালপেপার ফলব্যাক যুক্তি