ছবির-মধ্যে-ছবি

Android হ্যান্ডহেল্ড ডিভাইসের জন্য পিকচার-ইন-পিকচার (PIP) ফিচার ব্যবহারকারীদের একটি ছোট উইন্ডোতে চলমান অ্যাক্টিভিটি সহ অ্যাপের সাইজ পরিবর্তন করতে দেয়। PIP বিশেষ করে ভিডিও অ্যাপের জন্য উপযোগী কারণ ব্যবহারকারী অন্যান্য কাজ করার সময়ও কন্টেন্ট চলতে থাকে। ব্যবহারকারী SystemUI-এর মাধ্যমে এই উইন্ডোর পজিশন ম্যানিপুলেট করতে এবং বর্তমানে ছবির-মধ্যে-ছবি মোডে থাকা অ্যাপ্লিকেশনের সাথে (সর্বাধিক তিনটি) অ্যাপ-প্রদান করা অ্যাকশনের মাধ্যমে ইন্টার‍্যাক্ট করতে পারবেন।

PIP-এর জন্য এটি কাজ করে এমন অ্যাপ্লিকেশন থেকে স্পষ্ট অপ্ট-ইন প্রয়োজন এবং এটি প্রতিটি অ্যাক্টিভিটির ভিত্তিতে কাজ করে। (একটি অ্যাপ্লিকেশনে একাধিক অ্যাক্টিভিটি থাকতে পারে, যার মধ্যে শুধুমাত্র একটি PIP-তে থাকে।) অ্যাক্টিভিটি, enterPictureInPictureMode()-কে কল করে পিকচার-ইন-পিকচার মোডে প্রবেশ করার অনুরোধ করে এবং onPictureInPictureModeChanged()-এর আকারে অ্যাক্টিভিটি কলব্যাক পায়।

setPictureInPictureParams() পদ্ধতি অ্যাক্টিভিটিকে PIP-তে থাকাকালীন তার অ্যাস্পেক্ট রেশিও কন্ট্রোল করতে দেয় এবং কাস্টম অ্যাকশন, যা ব্যবহারকারীদের অ্যাক্টিভিটি বড় না করেই তার সাথে ইন্টার‍্যাক্ট করতে দেয়। PIP-তে, অ্যাক্টিভিটি পজ করা থাকে, কিন্তু রেন্ডার করা হয়, স্ট্যাটাস এবং সরাসরি টাচ ইনপুট বা উইন্ডো ফোকাস পায় না। একবারে শুধু একটি টাস্ক PIP মোডে থাকতে পারে।

Android ডেভেলপার ছবির-মধ্যে-ছবি ডকুমেন্টেশনে আরও তথ্য উপলভ্য।

প্রয়োজনীয় ডিভাইস

PIP-কে কাজ করানোর জন্য, PackageManager#FEATURE_PICTURE_IN_PICTURE সিস্টেম ফিচারটি /android/frameworks/base/core/java/android/content/pm/PackageManager.java-এ চালু করুন। PIP কাজ করে এমন ডিভাইসের স্ক্রিনের সবচেয়ে ছোট প্রস্থ ২২০dp-এর চেয়ে বড় হতে হবে। স্প্লিট স্ক্রিন মাল্টি-উইন্ডোর মতো, PIP-এর সাহায্যে একাধিক অ্যাক্টিভিটি একই সাথে স্ক্রিনে চালানো যায়। তাই, এই ব্যবহারের ক্ষেত্রে কাজ করার জন্য ডিভাইসে যথেষ্ট সিপিইউ ও র‌্যাম থাকতে হবে।

প্রয়োগ

বেশিরভাগ অ্যাক্টিভিটি লাইফসাইকেল ম্যানেজমেন্ট ActivityManager এবং WindowManager-এর মধ্যে সিস্টেমে করা হয়। রেফারেন্স UI প্রয়োগ SystemUI প্যাকেজে আছে।

সিস্টেমে করা পরিবর্তনগুলি যেন কম্প্যাটিবিলিটি টেস্ট স্যুট (CTS) টেস্ট দ্বারা নির্ধারিত এর অন্তর্নিহিত আচরণকে প্রভাবিত না করে। PIP-এর সিস্টেম লজিক মূলত "পিন করা" স্ট্যাকের মধ্যে টাস্ক ও অ্যাক্টিভিটি ম্যানেজ করাকে কেন্দ্র করে তৈরি হয়। ক্লাসের সংক্ষিপ্ত বিবরণ এখানে দেওয়া হল:

  • ActivityRecord: প্রতিটি অ্যাক্টিভিটির ছবির-মধ্যে-ছবি স্ট্যাটাস ট্র্যাক করে। নির্দিষ্ট কিছু পরিস্থিতিতে ব্যবহারকারীদের PIP-তে প্রবেশ করা থেকে বিরত রাখতে, যেমন লক স্ক্রিন থেকে বা VR চলাকালীন, checkEnterPictureInPictureState()-এ কেস যোগ করুন।
  • ActivityManagerService: PIP-তে প্রবেশ করার অনুরোধ করা অ্যাক্টিভিটি থেকে পাওয়া প্রাথমিক ইন্টারফেস এবং PIP অ্যাক্টিভিটির স্ট্যাটাস পরিবর্তন করার জন্য WindowManager ও SystemUI থেকে পাওয়া কল করার ইন্টারফেস।
  • ActivityStackSupervisor: পিন করা স্ট্যাকের মধ্যে বা বাইরে টাস্ক সরানোর জন্য ActivityManagerService থেকে কল করা হয়েছে, প্রয়োজন অনুযায়ী WindowManager আপডেট করা হচ্ছে।
  • 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-এর সাইজ কন্ট্রোল করে। CTS ও CDD-তে উল্লেখ করা সংজ্ঞা অনুযায়ী, কম্পিউট করা ডিফল্ট PIP সাইজ যেন @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-এ।