ফোল্ডেবল এবং মাল্টি-স্ক্রিন ডিভাইসের জন্য অ্যাপস
সাধারণত, অ্যাপগুলোর কোনো স্ট্যাটিক আইডেন্টিফায়ার বা ডিসপ্লে আইডির ওপর নির্ভরশীল লজিকের ওপর নির্ভর করা উচিত নয়। বেশিরভাগ ক্ষেত্রে, অ্যাপগুলোর আকার পরিবর্তন করে বিভিন্ন ডিসপ্লেতে কাজ করা উচিত এবং অ্যাপগুলো কোথায় থাকবে তা সিস্টেমের নিয়ন্ত্রণ করা উচিত। উদাহরণস্বরূপ, ফোল্ডেবল ডিভাইসের জন্য একটি নতুন ও অনন্য অভিজ্ঞতা তৈরি করতে এবং ডিভাইসটি ভাঁজ করা হলে বাইরের স্ক্রিনে একটি বিশেষ অ্যাপ চালু করার জন্য এটি করা যেতে পারে।
এক্ষেত্রে, SystemUI (বা অন্য কোনো সিস্টেম কম্পোনেন্ট)-এর উচিত ফোল্ডটি শনাক্ত করা, কোনো অ্যাকশন সম্পাদন করা উপযুক্ত কিনা তা নির্ধারণ করা, এবং তারপর টার্গেট অ্যাক্টিভিটিটি চালু করে লঞ্চ টার্গেট হিসেবে একটি এক্সটার্নাল ডিসপ্লে আইডি নির্দিষ্ট করে দেওয়া। অ্যাপগুলোর উচিত নয় এই অ্যাকশনটি শনাক্ত করা বা এর প্রতিক্রিয়ায় কোনো অ্যাকশন সম্পাদন করার পর একটি নির্দিষ্ট ডিসপ্লেতে লঞ্চ করা। অন্য কথায়, যা একটি ডিভাইসে কাজ করে তা অন্য ডিভাইসেও কাজ করবে—এমনটা ধরে নেবেন না। সংক্ষেপে, ডিভাইস-নির্দিষ্ট কোড ফ্র্যাগমেন্টেশন বাড়িয়ে তোলে।
ডিসপ্লেতে প্রবেশাধিকার সীমাবদ্ধ করুন
যদি ডিভাইস কনফিগারেশনের জন্য এক বা একাধিক ডিসপ্লেতে অ্যাক্সেস সীমাবদ্ধ করার প্রয়োজন হয়, তবে সেই ডিসপ্লেগুলোকে ব্যক্তিগত (প্রাইভেট) হিসেবে চিহ্নিত করতে Display#FLAG_PRIVATE ফ্ল্যাগটি ব্যবহার করার পরামর্শ দেওয়া হয়। এটি করলে মালিক ছাড়া অন্য কেউ ডিসপ্লেতে কন্টেন্ট যোগ করতে পারে না। মালিক ব্যতীত অন্য কেউ অ্যাক্টিভিটি চালু করার বা উইন্ডো যোগ করার চেষ্টা করলে একটি SecurityException দেখা দেয়। যদি ডিসপ্লেটি সিস্টেমের মালিকানাধীন হয়, তবে সিস্টেম উইন্ডো যোগ করতে এবং অ্যাক্টিভিটি চালু করতে পারে।
এছাড়াও, একটি ডিসপ্লেতে রাখা সত্তাগুলো সর্বদা সেই ডিসপ্লেটি অ্যাক্সেস করতে পারে। যদি মালিক কোনো ডিসপ্লেতে একটি অ্যাক্টিভিটি চালু করেন, তবে সেই অ্যাক্টিভিটিটি এই ডিসপ্লেতে অন্যান্য অ্যাক্টিভিটিও চালু করতে পারে। ফলস্বরূপ, অ্যাক্সেস সীমাবদ্ধ করা এবং শুধুমাত্র বিশ্বস্ত অ্যাপগুলোকে অনুমতি দেওয়ার দায়িত্ব মালিকের।
এছাড়াও, ভার্চুয়াল ডিসপ্লেতে আরও বিধিনিষেধ যুক্ত করা হয়েছে, কারণ যেকোনো অ্যাপ ব্যবহারকারীর কাছে দৃশ্যমান না করেই একটি ভার্চুয়াল ডিসপ্লে তৈরি করতে পারে। যদি ভার্চুয়াল ডিসপ্লেটি সিস্টেমের মালিকানাধীন না হয়, তবে শুধুমাত্র allowEmbedded পারমিশনযুক্ত অ্যাক্টিভিটিগুলোই অনুমোদিত হবে এবং কলারের ACTIVITY_EMBEDDING পারমিশন থাকা আবশ্যক।
আরও তথ্যের জন্য দেখুন:
-
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay() -
ActivityDisplay#isUidPresent() -
DisplayManagerService#isUidPresentOnDisplay()
শর্তসাপেক্ষে অ্যাক্টিভিটি লঞ্চ নিয়ন্ত্রণ করতে, LaunchParamsController ব্যবহার করুন, যা সমস্ত অ্যাক্টিভিটি লঞ্চকে বাধা দেয় এবং একটি সিস্টেম কম্পোনেন্টকে লঞ্চের জন্য ব্যবহৃত প্যারামিটারগুলো পরিবর্তন করার সুযোগ দেয়। এটি system_server এ উপলব্ধ।
ডিসপ্লে উইন্ডোইং সেটিংস এবং সিস্টেম ডেকোরেশন কনফিগার করুন
DisplayWindowSettings এ প্রতিটি ডিসপ্লের জন্য সিস্টেম ডেকোরেশন কনফিগার করা যায়। একটি ডিভাইস ইমপ্লিমেন্টেশন /data/system/display_settings.xml এ একটি ডিফল্ট কনফিগারেশন প্রদান করতে পারে।
এই মানটি নির্ধারণ করে যে সিস্টেম ডেকোরেশন (লঞ্চার, ওয়ালপেপার, নেভিগেশন বার এবং অন্যান্য ডেকোর উইন্ডো) এবং আইএমই (IME) একটি ডিসপ্লেতে প্রদর্শিত হবে কিনা। বিস্তারিত জানতে, DisplayWindowSettings#shouldShowSystemDecorsLocked() এবং DisplayWindowSettings#shouldShowImeLocked() দেখুন।
ডিসপ্লে শনাক্ত করতে, একটি অনন্য আইডি (ডিফল্টরূপে DisplayInfo#uniqueId ব্যবহৃত হয়) অথবা হার্ডওয়্যার ডিসপ্লের জন্য একটি ফিজিক্যাল পোর্ট আইডি ব্যবহার করুন ( DisplayInfo#address দেখুন)।
উদাহরণস্বরূপ, নিম্নলিখিত ডিসপ্লে কনফিগারেশন উদাহরণটি একটি সিমুলেটেড ডিসপ্লেতে সিস্টেম ডেকোরেশন এবং আইএমই (IME) সক্ষম করে:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="0" /> <display name="overlay:1" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
উপরের উদাহরণে, name অ্যাট্রিবিউটে ডিসপ্লে শনাক্তকরণের জন্য uniqueId ব্যবহার করা হয়েছে, যা একটি সিমুলেটেড ডিসপ্লের জন্য overlay:1 । একটি বিল্ট-ইন ডিসপ্লের জন্য, একটি নমুনা মান হতে পারে "local:45354385242535243453" । আরেকটি বিকল্প হলো হার্ডওয়্যার পোর্ট তথ্য ব্যবহার করা এবং DisplayWindowSettings#IDENTIFIER_PORT এর সাথে সামঞ্জস্য রেখে identifier="1" সেট করা, এবং তারপর "port:<port_id>" ফরম্যাট ব্যবহার করার জন্য নামটি আপডেট করা:
<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="1" /> <display name="port:12345" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
বিস্তারিত জানার জন্য, স্ট্যাটিক ডিসপ্লে আইডেন্টিফায়ারস দেখুন।
আরও তথ্যের জন্য দেখুন:
মিররিং এবং হোস্টিং টাস্কের মধ্যে ডিসপ্লে পরিবর্তন করুন
In Android 17 and higher, DisplayManager uses the FLAG_ALLOWS_CONTENT_MODE_SWITCH flag to control whether a display switches between mirroring and hosting tasks at run time. By default, this flag is enabled for external displays and disabled for all other displays.
যখন FLAG_ALLOWS_CONTENT_MODE_SWITCH উপস্থিত থাকে, তখন DisplayManager টাস্কগুলো মিরর করবে নাকি হোস্ট করবে তা নির্ধারণ করতে android.provider.Settings.Secure.MIRROR_BUILT_IN_DISPLAY সিকিউর সেটিংটি মনিটর করে। যদিও এটিই ডিফল্ট লজিক, OEM-রা এই আচরণটি কাস্টমাইজ করতে পারে।
টপোলজি এবং পয়েন্টার চলাচল প্রদর্শন করুন
অ্যান্ড্রয়েড ১৭ এবং এর পরবর্তী সংস্করণগুলোতে, ডিসপ্লে টপোলজি ডিসপ্লেগুলোর আপেক্ষিক অবস্থান নির্ধারণ করে এবং মাউস পয়েন্টারের চলাচলকে টপোলজির অন্তর্ভুক্ত নির্দিষ্ট ডিসপ্লে সেটের মধ্যে সীমাবদ্ধ রাখে।
WindowManager টপোলজিতে একটি ডিসপ্লে অন্তর্ভুক্ত করার সিদ্ধান্ত নেয় এবং DisplayManagerInternal.onDisplayBelongToTopologyChanged কল করে। ডিসপ্লেটি যোগ করার আগে DisplayManager, DisplayTopologyCoordinator.isDisplayAllowedInTopology যাচাই করে। ডিফল্টরূপে, যদি স্থানীয় ডিসপ্লেগুলো টাস্ক হোস্ট করতে পারে, তবে সিস্টেম সেগুলোকে যোগ করে নেয়।
যদি একাধিক পাবলিক ডিসপ্লে থাকে যা টাস্ক হোস্ট করতে পারে, তাহলে ডিফল্ট ডিসপ্লে অন্তর্ভুক্ত করার সিদ্ধান্তটি shouldIncludeDefaultDisplayInTopology বুলিয়ান প্রোভাইডার দ্বারা নিয়ন্ত্রিত হয়, যা DisplayTopologyCoordinator এ পাস করা হয়। যদি ডিফল্ট ডিসপ্লেটিই একমাত্র পাবলিক ডিসপ্লে হয় যা টাস্ক হোস্ট করতে পারে, তবে এটি সর্বদা টপোলজিতে থাকে। AOSP-তে, বুলিয়ান প্রোভাইডারটি কেবল তখনই true রিটার্ন করে, যদি ডিফল্ট ডিসপ্লেটি ডেস্কটপ উইন্ডোইং সমর্থন করে অথবা যদি ` Settings.Secure.INCLUDE_DEFAULT_DISPLAY_IN_TOPOLOGY নামক সিকিওর সেটিংটি true হয়।
অ্যাপগুলি DisplayManager.getDisplayTopology ব্যবহার করে বর্তমান টপোলজি সম্পর্কে জানতে পারে এবং DisplayManager.registerTopologyListener এর মাধ্যমে একটি লিসেনার রেজিস্টার করে টপোলজির পরিবর্তনে প্রতিক্রিয়া জানায়।