نافذة ضمن النافذة

تتيح ميزة صورة داخل صورة (PIP) للأجهزة المحمولة التي تعمل بنظام Android للمستخدمين تغيير حجم التطبيق الذي يتضمن نشاطًا مستمرًا في نافذة صغيرة. يعد PIP مفيدًا بشكل خاص لتطبيقات الفيديو لأن المحتوى يستمر في التشغيل بينما يكون المستخدم حرًا في تنفيذ إجراءات أخرى. يمكن للمستخدمين التعامل مع موضع هذه النافذة من خلال SystemUI والتفاعل مع التطبيق الموجود حاليًا في صورة داخل صورة باستخدام (ما يصل إلى ثلاثة) إجراءات يوفرها التطبيق.

يتطلب تطبيق 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 على شاشة أكبر من 220dp عند أصغر عرض لها. على غرار النوافذ المتعددة المنقسمة على الشاشة، تسمح ميزة PIP بتشغيل أنشطة متعددة على الشاشة في نفس الوقت. لذلك، يجب أن تحتوي الأجهزة على وحدة معالجة مركزية وذاكرة وصول عشوائي كافية لدعم حالة الاستخدام هذه.

تطبيق

تتم معظم إدارة دورة حياة النشاط في النظام بين ActivityManager و WindowManager . يوجد تطبيق واجهة المستخدم المرجعية في حزمة SystemUI .

يجب ألا تؤثر التعديلات على النظام على سلوكه الجوهري كما هو محدد في اختبارات مجموعة اختبار التوافق (CTS) . يدور منطق النظام لـ PIP بشكل أساسي حول إدارة المهام والأنشطة داخل المكدس "المثبت". فيما يلي نظرة عامة سريعة على الفصل:

  • ActivityRecord : يتتبع حالة الصورة داخل الصورة لكل نشاط. لمنع المستخدمين من إدخال صورة داخل صورة (PIP) في ظروف معينة، مثل شاشة القفل أو أثناء الواقع الافتراضي، أضف حالات إلى checkEnterPictureInPictureState() .
  • ActivityManagerService : الواجهة الأساسية من النشاط لطلب إدخال PIP والواجهة للمكالمات من WindowManager و SystemUI لتغيير حالة نشاط PIP.
  • ActivityStackSupervisor : يتم استدعاؤه من ActivityManagerService لنقل المهام داخل أو خارج المكدس المثبت، وتحديث WindowManager حسب الضرورة.
  • PinnedStackWindowController : واجهة WindowManager من ActivityManager .
  • PinnedStackController : يُبلغ عن التغييرات في النظام إلى SystemUI ، مثل إظهار/إخفاء محرر أسلوب الإدخال (IME)، أو تغيير نسبة العرض إلى الارتفاع، أو تغيير الإجراءات.
  • BoundsAnimationController : يقوم بتحريك نوافذ نشاط PIP بطريقة لا تؤدي إلى تغيير التكوين أثناء تغيير الحجم.
  • PipSnapAlgorithm : فئة مشتركة تستخدم في كل من النظام وSystemUI التي تتحكم في سلوك الالتقاط لنافذة 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 : سلوك الالتقاط كما هو محدد في PipSnapAlgorithm .

يجب ألا تغير تطبيقات الأجهزة الحد الأدنى والحد الأقصى لنسب العرض إلى الارتفاع المحددة في CDD وCTS.

الأذونات

تتيح "عملية التطبيق" لكل حزمة ( OP_PICTURE_IN_PICTURE ) في AppOpsManager ( main/core/java/android/app/AppOpsManager.java ) للمستخدمين التحكم في PIP على مستوى كل تطبيق من خلال إعدادات النظام. تحتاج تطبيقات الجهاز إلى احترام هذا التحقق عندما يطلب أحد الأنشطة الدخول إلى وضع صورة داخل صورة.

اختبارات

لاختبار تطبيقات PIP، قم بتشغيل كافة الاختبارات المتعلقة بالصورة داخل الصورة الموجودة في اختبارات CTS من جانب المضيف ضمن /cts/hostsidetests/services/activitymanager ، وخاصة في ActivityManagerPinnedStackTests.java .