تصویر در تصویر

ویژگی تصویردرتصویر (PIP) برای دستگاه‌های دستی Android به کاربران امکان می‌دهد اندازه برنامه دارای فعالیت جاری را به پنجره‌ای کوچک تغییر دهند. «تصویردرتصویر» به‌ویژه برای برنامه‌های ویدیویی مفید است زیرا محتوا همچنان پخش می‌شود و کاربر می‌تواند اقدامات دیگری انجام دهد. کاربران می‌توانند موقعیت این پنجره را ازطریق SystemUI دستکاری کنند و با برنامه درحال اجرا در حالت «تصویردرتصویر» با (حداکثر سه) کنش ارائه‌شده توسط برنامه تعامل داشته باشند.

PIP به موافقت صریح برنامه‌هایی که از آن پشتیبانی می‌کنند نیاز دارد و براساس هر فعالیت کار می‌کند. (یک برنامه می‌تواند چندین فعالیت داشته باشد که فقط یکی از آن‌ها در حالت «تصویردرتصویر» است.) فعالیت‌ها با فراخوانی enterPictureInPictureMode() برای ورود به حالت تصویردرتصویر درخواست می‌کنند و کاربردهای فعالیت را در قالب onPictureInPictureModeChanged() دریافت می‌کنند.

روش setPictureInPictureParams() به فعالیت‌ها امکان می‌دهد نسبت ابعادی خود را درحین قرار داشتن در حالت «تصویر در تصویر» و کنش‌های سفارشی کنترل کنند، که به کاربران اجازه می‌دهد بدون نیاز به گسترش دادن فعالیت، با آن تعامل داشته باشند. در «تصویردرتصویر»، فعالیت در حالت موقتاً متوقف‌شده، اما درحال پردازش است و مستقیماً ورودی لمسی یا تمرکز پنجره را دریافت نمی‌کند. هربار فقط یک تکلیف می‌تواند در حالت «تصویر در تصویر» باشد.

اطلاعات بیشتر در سند تصویردرتصویر «توسعه‌دهنده Android» دردسترس است.

پیش‌نیازهای دستگاه

برای پشتیبانی از «تصویردرتصویر»، ویژگی سیستم PackageManager#FEATURE_PICTURE_IN_PICTURE را در /android/frameworks/base/core/java/android/content/pm/PackageManager.java فعال کنید. دستگاه‌هایی که از PIP پشتیبانی می‌کنند باید صفحه‌نمایشی داشته باشند که در کوچک‌ترین عرض خود بزرگ‌تر از ۲۲۰dp باشد. مشابه با چندپنجره‌ای دونیمه، «تصویردرتصویر» به چندین فعالیت اجازه می‌دهد به‌طور هم‌زمان روی صفحه اجرا شوند. بنابراین، دستگاه‌ها باید واحد پردازش مرکزی و حافظه دسترسی تصادفی کافی برای پشتیبانی از این مورد استفاده داشته باشند.

پیاده‌سازی

بیشتر مدیریت چرخه حیات فعالیت بین ActivityManager و WindowManager در سیستم انجام می‌شود. پیاده‌سازی واسط کاربر مرجع در SystemUI بسته است.

اصلاحات سیستم نباید بر رفتار ذاتی آن که توسط آزمایش‌های مجموعه آزمایش سازگاری (CTS) تعریف شده است تأثیر بگذارد. منطق سیستم برای «تصویردرتصویر» عمدتاً حول مدیریت وظایف و فعالیت‌ها در پشته «سنجاق‌شده» می‌چرخد. در اینجا نمای کلی کوتاهی از کلاس ارائه شده است:

  • ActivityRecord: وضعیت تصویردرتصویر هر فعالیت را پیگیری می‌کند. برای جلوگیری از ورود کاربران به «تصویردرتصویر» در شرایط خاص، مثل از صفحه قفل یا درطول واقعیت مجازی، مواردی را به checkEnterPictureInPictureState() اضافه کنید.
  • ActivityManagerService: رابط اصلی از فعالیت برای درخواست ورود به «تصویردرتصویر» و رابط تماس‌ها از WindowManager و SystemUI برای تغییر وضعیت فعالیت «تصویردرتصویر».
  • ActivityStackSupervisor: از ActivityManagerService فراخوانی می‌شود تا تکالیف را به پشته سنجاق‌شده منتقل کند یا از آن خارج کند، و WindowManager را درصورت لزوم به‌روزرسانی کند.
  • PinnedStackWindowController: میانا WindowManager از ActivityManager.
  • PinnedStackController: تغییرات سیستم را به SystemUI گزارش می‌کند، مثلاً نمایش/پنهان شدن IME، تغییر نسبت ابعادی، یا تغییر کنش‌ها.
  • BoundsAnimationController: پنجره‌های فعالیت «تصویردرتصویر» را به‌گونه‌ای پویانمایی می‌کند که هنگام تغییر اندازه، تغییر پیکربندی را راه‌اندازی نمی‌کند.
  • PipSnapAlgorithm: کلاس مشترکی که هم در سیستم و هم در SystemUI استفاده می‌شود و رفتار چسبیدن پنجره «تصویردرتصویر» را در نزدیکی لبه‌های صفحه‌نمایش کنترل می‌کند.

مرجع SystemUI پیاده‌سازی کاملی از PIP ارائه می‌دهد که از ارائه کنش‌های سفارشی به کاربران و دستکاری‌های عمومی، مانند ازهم بازکردن و بستن، پشتیبانی می‌کند. سازندگان دستگاه می‌توانند این تغییرات را توسعه دهند، به‌شرطی که بر رفتارهای ذاتی تعریف‌شده در CDD تأثیر نگذارد. در اینجا نمای کلی سریعی از کلاس آورده شده است:

  • PipManager: مؤلفه SystemUI که با SystemUI شروع می‌شود.
  • PipTouchHandler: کنترل‌کننده لمسی، که اشاره‌هایی را که PIP را دستکاری می‌کنند کنترل می‌کند. این فقط زمانی استفاده می‌شود که مصرف‌کننده ورودی برای «تصویردرتصویر» فعال باشد (به InputConsumerController مراجعه کنید). ژست‌های جدید را می‌توان در اینجا اضافه کرد.
  • PipMotionHelper: کلاس راحتی که موقعیت «تصویردرتصویر» و ناحیه مجاز روی صفحه را ردیابی می‌کند. فراخوانی‌ها به ActivityManagerService برای به‌روزرسانی یا پویانمایی موقعیت و اندازه «تصویر در تصویر».
  • PipMenuActivityController: فعالیتی را شروع می‌کند که کنش‌های ارائه‌شده توسط فعالیتی را که درحال‌حاضر در PIP است نشان می‌دهد. این فعالیت فعالیت رونهاد تکلیف است و مصرف‌کننده ورودی رونهاد را برمی‌دارد تا تعاملی شود.
  • PipMenuActivity: پیاده‌سازی برای فعالیت منو.
  • PipMediaController: شنونده‌ای که وقتی جلسه رسانه به‌گونه‌ای تغییر می‌کند که ممکن است بر کنش‌های پیش‌فرض در PIP تأثیر بگذارد، SystemUI به‌روزرسانی می‌شود.
  • PipNotificationController: کنترل‌کننده‌ای که اطمینان می‌دهد وقتی کاربر از ویژگی «تصویر در تصویر» استفاده می‌کند، اعلان فعال است.
  • PipDismissViewController: رونهادی که وقتی کاربران تعامل با «تصویر در تصویر» را شروع می‌کنند به آن‌ها نشان داده می‌شود تا نشان دهد که می‌توان آن را بست.

جایگاه پیش‌فرض

منابع سیستم مختلفی وجود دارد که جای پیش‌فرض «تصویر در تصویر» را کنترل می‌کند:

  • config_defaultPictureInPictureGravity: عدد صحیح جاذبه که گوشه محل قرارگیری «تصویردرتصویر» را کنترل می‌کند، مثلاً BOTTOM|RIGHT.
  • config_defaultPictureInPictureScreenEdgeInsets: فاصله از کناره‌های صفحه‌نمایش برای قرار دادن PIP.
  • config_pictureInPictureDefaultSizePercent و config_pictureInPictureDefaultAspectRatio: ترکیب درصد عرض صفحه‌نمایش و نسبت ابعادی، اندازه «تصویر در تصویر» را کنترل می‌کند. اندازه پیش‌فرض محاسبه‌شده «تصویردرتصویر» نباید کوچک‌تر از @dimen/default_minimal_size_pip_resizable_task باشد، همان‌طور که در CTS و CDD تعریف شده است.
  • config_pictureInPictureSnapMode: رفتار چسباندن همان‌گونه که در PipSnapAlgorithm تعریف شده است.

پیاده‌سازی‌های دستگاه نباید حداقل و حداکثر نسبت‌های ابعادی را که در CDD و CTS تعریف شده‌اند تغییر دهند.

اجازه‌ها

«عملکرد برنامه» (OP_PICTURE_IN_PICTURE) در AppOpsManager (main/core/java/android/app/AppOpsManager.java) برای هر بسته به کاربران اجازه می‌دهد «تصویر در تصویر» را در سطح هر برنامه ازطریق تنظیمات سیستم کنترل کنند. پیاده‌سازی‌های دستگاه باید هنگام درخواست فعالیت برای ورود به حالت تصویردرتصویر، این بررسی را رعایت کنند.

آزمایش

برای آزمایش پیاده‌سازی‌های PIP، همه آزمایش‌های مربوط به تصویردرتصویر را که در آزمایش‌های CTS سمت میزبان در /cts/hostsidetests/services/activitymanager، به‌ویژه در ActivityManagerPinnedStackTests.java، وجود دارد اجرا کنید.