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

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

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

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

اطلاعات بیشتر در مستندات تصویر در تصویر توسعه‌دهندگان اندروید موجود است.

الزامات دستگاه

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

پیاده‌سازی

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

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

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

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

  • PipManager : کامپوننت SystemUI که با SystemUI آغاز می‌شود.
  • PipTouchHandler : کنترل‌کننده‌ی لمسی که حرکاتی را که PIP را دستکاری می‌کنند کنترل می‌کند. این فقط زمانی استفاده می‌شود که مصرف‌کننده‌ی ورودی برای PIP فعال باشد (به InputConsumerController مراجعه کنید). حرکات جدید را می‌توان در اینجا اضافه کرد.
  • PipMotionHelper : یک کلاس کمکی که موقعیت PIP و ناحیه مجاز روی صفحه را ردیابی می‌کند. از طریق ActivityManagerService فراخوانی می‌شود تا موقعیت و اندازه PIP را به‌روزرسانی یا متحرک‌سازی کند.
  • 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 پیش‌فرض محاسبه‌شده نباید کوچکتر از @dimen/default_minimal_size_pip_resizable_task باشد، همانطور که توسط CTS و CDD تعریف شده است.
  • config_pictureInPictureSnapMode : رفتار snapping همانطور که در PipSnapAlgorithm تعریف شده است.

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

مجوزها

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

آزمایش

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