অ্যান্ড্রয়েড হ্যান্ডহেল্ড ডিভাইসের পিকচার-ইন-পিকচার (পিআইপি) ফিচারটি ব্যবহারকারীদের চলমান কোনো অ্যাপকে একটি ছোট উইন্ডোতে রিসাইজ করার সুযোগ দেয়। ভিডিও অ্যাপের জন্য পিআইপি বিশেষভাবে উপযোগী, কারণ এতে কন্টেন্ট চলতে থাকে এবং ব্যবহারকারী অন্যান্য কাজ করার স্বাধীনতা পান। ব্যবহারকারীরা সিস্টেমইউআই (SystemUI)-এর মাধ্যমে এই উইন্ডোটির অবস্থান পরিবর্তন করতে পারেন এবং বর্তমানে পিকচার-ইন-পিকচারে থাকা অ্যাপ্লিকেশনটির সাথে অ্যাপ-প্রদত্ত (সর্বোচ্চ তিনটি) অ্যাকশনের মাধ্যমে ইন্টারঅ্যাক্ট করতে পারেন।
যেসব অ্যাপ্লিকেশন PIP সমর্থন করে, তাদের সুস্পষ্টভাবে এতে সম্মতি জানাতে হয় এবং এটি প্রতিটি অ্যাক্টিভিটির জন্য আলাদাভাবে কাজ করে। (একটি অ্যাপ্লিকেশনে একাধিক অ্যাক্টিভিটি থাকতে পারে, যার মধ্যে কেবল একটি PIP-তে থাকে।) অ্যাক্টিভিটিগুলো enterPictureInPictureMode() কল করে পিকচার-ইন-পিকচার মোডে প্রবেশের অনুরোধ করে এবং onPictureInPictureModeChanged() আকারে অ্যাক্টিভিটি কলব্যাক গ্রহণ করে।
setPictureInPictureParams() মেথডটি অ্যাক্টিভিটিগুলোকে PIP মোডে থাকাকালীন তাদের অ্যাস্পেক্ট রেশিও এবং কাস্টম অ্যাকশন নিয়ন্ত্রণ করতে দেয়, যার ফলে ব্যবহারকারীরা অ্যাক্টিভিটিটিকে এক্সপ্যান্ড না করেই সেটির সাথে ইন্টারঅ্যাক্ট করতে পারেন। PIP মোডে, অ্যাক্টিভিটিটি একটি পজড কিন্তু রেন্ডারিং অবস্থায় থাকে এবং সরাসরি টাচ ইনপুট বা উইন্ডো ফোকাস গ্রহণ করে না। একবারে শুধুমাত্র একটি টাস্কই PIP মোডে থাকতে পারে।
অ্যান্ড্রয়েড ডেভেলপার পিকচার-ইন-পিকচার ডকুমেন্টেশনে আরও তথ্য পাওয়া যাবে।
ডিভাইসের প্রয়োজনীয়তা
PIP সমর্থন করার জন্য, /android/frameworks/base/core/java/android/content/pm/PackageManager.java ফাইলে PackageManager#FEATURE_PICTURE_IN_PICTURE সিস্টেম ফিচারটি সক্রিয় করুন। যে ডিভাইসগুলো PIP সমর্থন করে, সেগুলোর স্ক্রিনের সর্বনিম্ন প্রস্থ অবশ্যই 220dp-এর চেয়ে বড় হতে হবে। স্প্লিট স্ক্রিন মাল্টি-উইন্ডোর মতোই, PIP একই সময়ে স্ক্রিনে একাধিক অ্যাক্টিভিটি চালানোর সুযোগ দেয়। তাই, এই ব্যবহারের জন্য ডিভাইসগুলোতে পর্যাপ্ত CPU এবং RAM থাকা উচিত।
বাস্তবায়ন
সিস্টেমের অধিকাংশ অ্যাক্টিভিটি লাইফসাইকেল ম্যানেজমেন্ট ActivityManager এবং WindowManager মধ্যে সম্পন্ন হয়। এর রেফারেন্স UI ইমপ্লিমেন্টেশন SystemUI প্যাকেজে রয়েছে।
সিস্টেমের পরিবর্তনগুলি কম্প্যাটিবিলিটি টেস্ট স্যুট (CTS) পরীক্ষা দ্বারা সংজ্ঞায়িত এর অন্তর্নিহিত আচরণকে প্রভাবিত করবে না। PIP-এর সিস্টেম লজিক প্রধানত 'পিন করা' স্ট্যাকের মধ্যে টাস্ক এবং অ্যাক্টিভিটিগুলির ব্যবস্থাপনাকে কেন্দ্র করে আবর্তিত হয়। এখানে ক্লাসটির একটি সংক্ষিপ্ত বিবরণ দেওয়া হলো:
-
ActivityRecord: প্রতিটি অ্যাক্টিভিটির পিকচার-ইন-পিকচার অবস্থা ট্র্যাক করে। নির্দিষ্ট পরিস্থিতিতে, যেমন লক স্ক্রিন থেকে বা ভিআর চলাকালীন, ব্যবহারকারীদের পিআইপি-তে প্রবেশ করা থেকে বিরত রাখতেcheckEnterPictureInPictureState()-এ কেস যোগ করুন। -
ActivityManagerService: অ্যাক্টিভিটি থেকে PIP-তে প্রবেশের অনুরোধ জানানোর প্রধান ইন্টারফেস এবংWindowManagerওSystemUIথেকে PIP অ্যাক্টিভিটির অবস্থা পরিবর্তনের জন্য কল করার ইন্টারফেস। -
ActivityStackSupervisor: পিন করা স্ট্যাকের মধ্যে টাস্ক আনা-নেওয়ার জন্য এবং প্রয়োজন অনুযায়ীWindowManagerআপডেট করার জন্যActivityManagerServiceথেকে একে কল করা হয়। -
PinnedStackWindowController:ActivityManagerএরWindowManagerইন্টারফেস। -
PinnedStackController: সিস্টেমের পরিবর্তনগুলোSystemUIতে রিপোর্ট করে, যেমন IME দেখানো/লুকানো, অ্যাস্পেক্ট রেশিও পরিবর্তন, বা অ্যাকশন পরিবর্তন। -
BoundsAnimationController: PIP অ্যাক্টিভিটি উইন্ডোগুলোকে এমনভাবে অ্যানিমেট করে, যাতে আকার পরিবর্তনের সময় কোনো কনফিগারেশন পরিবর্তন না ঘটে। -
PipSnapAlgorithm: সিস্টেম এবং SystemUI উভয় ক্ষেত্রেই ব্যবহৃত একটি শেয়ার্ড ক্লাস, যা স্ক্রিনের প্রান্তের কাছাকাছি PIP উইন্ডোর স্ন্যাপিং আচরণ নিয়ন্ত্রণ করে।
রেফারেন্স SystemUI PIP-এর একটি সম্পূর্ণ বাস্তবায়ন প্রদান করে যা ব্যবহারকারীদের কাছে কাস্টম অ্যাকশন উপস্থাপন এবং সম্প্রসারণ ও অপসারণের মতো সাধারণ ম্যানিপুলেশন সমর্থন করে। ডিভাইস নির্মাতারা এই পরিবর্তনগুলির উপর ভিত্তি করে তাদের কাজ তৈরি করতে পারেন, যতক্ষণ পর্যন্ত তা CDD দ্বারা সংজ্ঞায়িত অন্তর্নিহিত আচরণগুলিকে প্রভাবিত না করে। এখানে ক্লাসটির একটি সংক্ষিপ্ত বিবরণ দেওয়া হলো:
-
PipManager:SystemUIসেই উপাদান যাSystemUIসাথে চালু করা হয়। -
PipTouchHandler: টাচ হ্যান্ডলার, যা PIP চালনাকারী জেসচারগুলো নিয়ন্ত্রণ করে। এটি শুধুমাত্র তখনই ব্যবহৃত হয় যখন PIP-এর জন্য ইনপুট কনজিউমার সক্রিয় থাকে (InputConsumerControllerদেখুন)। এখানে নতুন জেসচার যোগ করা যেতে পারে। -
PipMotionHelper: একটি সুবিধাজনক ক্লাস যা PIP-এর অবস্থান এবং স্ক্রিনে এর অনুমোদিত অঞ্চল ট্র্যাক করে। PIP-এর অবস্থান ও আকার আপডেট বা অ্যানিমেট করার জন্য এটিActivityManagerServiceকে কল করে। -
PipMenuActivityController: এমন একটি অ্যাক্টিভিটি চালু করে যা বর্তমানে PIP-তে থাকা অ্যাক্টিভিটির অ্যাকশনগুলো প্রদর্শন করে। এই অ্যাক্টিভিটিটি একটি টাস্ক-ওভারলে অ্যাক্টিভিটি, এবং এটিকে ইন্টারেক্টিভ করার জন্য এটি ওভারলেয়িং ইনপুট কনজিউমারকে সরিয়ে দেয়। -
PipMenuActivity: মেনু অ্যাক্টিভিটির বাস্তবায়ন। -
PipMediaController: এই লিসেনারটিSystemUIআপডেট করে, যখন মিডিয়া সেশনে এমন কোনো পরিবর্তন আসে যা PIP-এর ডিফল্ট অ্যাকশনগুলোকে প্রভাবিত করতে পারে। -
PipNotificationController: যে কন্ট্রোলারটি নিশ্চিত করে যে, কোনো ব্যবহারকারী PIP ফিচারটি ব্যবহার করার সময় নোটিফিকেশনটি সক্রিয় থাকবে। -
PipDismissViewController: ব্যবহারকারীরা যখন PIP-এর সাথে ইন্টারঅ্যাক্ট করা শুরু করেন, তখন এটিকে বাতিল করা যাবে তা বোঝানোর জন্য প্রদর্শিত ওভারলে।
ডিফল্ট প্লেসমেন্ট
বিভিন্ন সিস্টেম রিসোর্স রয়েছে যা PIP-এর ডিফল্ট অবস্থান নিয়ন্ত্রণ করে:
-
config_defaultPictureInPictureGravity: গ্র্যাভিটি ইন্টিজার, যা PIP স্থাপনের কোণ নিয়ন্ত্রণ করে, যেমনBOTTOM|RIGHT। -
config_defaultPictureInPictureScreenEdgeInsets: PIP স্থাপন করার জন্য স্ক্রিনের পাশ থেকে দূরত্ব। -
config_pictureInPictureDefaultSizePercentএবংconfig_pictureInPictureDefaultAspectRatio: স্ক্রিনের প্রস্থের শতাংশ এবং অ্যাস্পেক্ট রেশিওর সমন্বয় PIP-এর আকার নিয়ন্ত্রণ করে। গণনাকৃত ডিফল্ট PIP আকার CTS এবং CDD দ্বারা সংজ্ঞায়িত@dimen/default_minimal_size_pip_resizable_taskএর চেয়ে ছোট হওয়া উচিত নয়। -
config_pictureInPictureSnapMode:PipSnapAlgorithmএ সংজ্ঞায়িত স্ন্যাপিং আচরণ।
ডিভাইস বাস্তবায়নে CDD এবং CTS-এ সংজ্ঞায়িত সর্বনিম্ন ও সর্বোচ্চ অ্যাসপেক্ট রেশিও পরিবর্তন করা উচিত নয়।
অনুমতি
AppOpsManager ( main/core/java/android/app/AppOpsManager.java )-এর প্রতি-প্যাকেজ "অ্যাপ্লিকেশন অপারেশন" ( OP_PICTURE_IN_PICTURE ) ব্যবহারকারীদের সিস্টেম সেটিংসের মাধ্যমে প্রতি-অ্যাপ্লিকেশন স্তরে PIP নিয়ন্ত্রণ করতে দেয়। যখন কোনো অ্যাক্টিভিটি পিকচার-ইন-পিকচার মোডে প্রবেশ করার অনুরোধ করে, তখন ডিভাইস ইমপ্লিমেন্টেশনগুলোকে অবশ্যই এই চেকটি মেনে চলতে হবে।
পরীক্ষা
PIP ইমপ্লিমেন্টেশন পরীক্ষা করার জন্য, /cts/hostsidetests/services/activitymanager এর অধীনে থাকা হোস্ট-সাইড CTS টেস্টগুলোর মধ্যে পিকচার-ইন-পিকচার সম্পর্কিত সমস্ত টেস্ট চালান, বিশেষ করে ActivityManagerPinnedStackTests.java তে।