चित्र में चित्र

एंड्रॉइड हैंडहेल्ड डिवाइस के लिए पिक्चर-इन-पिक्चर (पीआईपी) फीचर उपयोगकर्ताओं को एक छोटी सी विंडो में चल रही गतिविधि के साथ ऐप का आकार बदलने देता है। पीआईपी वीडियो ऐप्स के लिए विशेष रूप से उपयोगी है क्योंकि सामग्री चलती रहती है जबकि उपयोगकर्ता अन्य कार्यों को करने के लिए स्वतंत्र होता है। उपयोगकर्ता सिस्टमयूआई के माध्यम से इस विंडो की स्थिति में हेरफेर कर सकते हैं और वर्तमान में पिक्चर-इन-पिक्चर में एप्लिकेशन के साथ (तीन तक) ऐप-प्रदत्त कार्रवाइयों के साथ बातचीत कर सकते हैं।

पीआईपी को उन अनुप्रयोगों से स्पष्ट ऑप्ट-इन की आवश्यकता होती है जो इसका समर्थन करते हैं और प्रति-गतिविधि के आधार पर काम करते हैं। (एक एकल एप्लिकेशन में कई गतिविधियां हो सकती हैं, जिनमें से केवल एक पीआईपी में है।) गतिविधियां enterPictureInPictureMode() पर कॉल करके पिक्चर-इन-पिक्चर दर्ज करने का अनुरोध करती हैं, और गतिविधि कॉलबैक को onPictureInPictureModeChanged() के रूप में प्राप्त करती हैं।

setPictureInPictureParams() विधि गतिविधियों को उनके पहलू अनुपात को PIP और कस्टम क्रियाओं में नियंत्रित करने देती है, जो उपयोगकर्ताओं को गतिविधि का विस्तार किए बिना उसके साथ बातचीत करने की अनुमति देती है। पीआईपी में, गतिविधि रुकी हुई है, लेकिन प्रतिपादन, स्थिति और सीधे स्पर्श इनपुट या विंडो फोकस प्राप्त नहीं करता है। PIP में एक बार में केवल एक ही कार्य हो सकता है।

अधिक जानकारी Android डेवलपर पिक्चर-इन-पिक्चर दस्तावेज़ीकरण में उपलब्ध है।

डिवाइस की आवश्यकताएं

PIP को सपोर्ट करने के लिए /android/frameworks/base/core/java/android/content/pm/PackageManager.java में PackageManager#FEATURE_PICTURE_IN_PICTURE सिस्टम फीचर को इनेबल करें। पीआईपी का समर्थन करने वाले उपकरणों में एक स्क्रीन होनी चाहिए जो इसकी सबसे छोटी चौड़ाई में 220dp से बड़ी हो। स्प्लिट स्क्रीन मल्टी-विंडो के समान, पीआईपी एक ही समय में कई गतिविधियों को ऑन-स्क्रीन चलाने की अनुमति देता है। इसलिए, इस उपयोग के मामले का समर्थन करने के लिए उपकरणों में पर्याप्त CPU और RAM होना चाहिए।

कार्यान्वयन

अधिकांश गतिविधि जीवनचक्र प्रबंधन ActivityManager और WindowManager के बीच सिस्टम में किया जाता है। संदर्भ UI कार्यान्वयन SystemUI पैकेज में है।

संगतता परीक्षण सूट (सीटीएस) परीक्षणों द्वारा परिभाषित के रूप में प्रणाली में संशोधन इसके आंतरिक व्यवहार को प्रभावित नहीं करना चाहिए। पीआईपी के लिए सिस्टम लॉजिक मुख्य रूप से "पिन किए गए" स्टैक के भीतर कार्यों और गतिविधियों के प्रबंधन के इर्द-गिर्द घूमता है। यहाँ एक त्वरित वर्ग अवलोकन है:

  • ActivityRecord : प्रत्येक गतिविधि की पिक्चर-इन-पिक्चर स्थिति को ट्रैक करता है। कुछ परिस्थितियों में, जैसे लॉक स्क्रीन से या VR के दौरान, उपयोगकर्ताओं को PIP में प्रवेश करने से रोकने के लिए, checkEnterPictureInPictureState() में केस जोड़ें।
  • ActivityManagerService प्रबंधक सेवा: पीआईपी दर्ज करने का अनुरोध करने के लिए गतिविधि से प्राथमिक इंटरफ़ेस और पीआईपी गतिविधि स्थिति को बदलने के SystemUI विंडो मैनेजर और WindowManager से कॉल करने के लिए इंटरफ़ेस।
  • ActivityStackSupervisor : एक्टिविटीमैनेजर ActivityManagerService से पिन किए गए स्टैक के अंदर या बाहर कार्यों को स्थानांतरित करने के लिए, WindowManager को आवश्यकतानुसार अपडेट करने के लिए कहा जाता है।
  • PinnedStackWindowController : ActivityManager प्रबंधक से WindowManager इंटरफ़ेस।
  • PinnedStackController : सिस्टम में सिस्टम में परिवर्तन की रिपोर्ट SystemUI है, जैसे कि IME दिखाया/छिपा हुआ, पहलू अनुपात बदल गया, या क्रियाएँ बदल गईं।
  • BoundsAnimationController : PIP गतिविधि विंडो को इस तरह से एनिमेट करता है जो आकार बदलते समय कॉन्फ़िगरेशन परिवर्तन को ट्रिगर नहीं करता है।
  • PipSnapAlgorithm : सिस्टम और सिस्टमयूआई दोनों में उपयोग किया जाने वाला एक साझा वर्ग जो स्क्रीन के किनारों के पास पीआईपी विंडो के स्नैपिंग व्यवहार को नियंत्रित करता है।

संदर्भ SystemUI , PIP का पूर्ण कार्यान्वयन प्रदान करता है जो उपयोगकर्ताओं को कस्टम क्रियाएँ प्रस्तुत करने और सामान्य हेरफेर, जैसे विस्तार और बर्खास्तगी का समर्थन करता है। डिवाइस निर्माता इन परिवर्तनों पर निर्माण कर सकते हैं, जब तक कि वे सीडीडी द्वारा परिभाषित आंतरिक व्यवहार को प्रभावित नहीं करते हैं। यहाँ एक त्वरित वर्ग अवलोकन है:

  • PipManager : SystemUI घटक जो SystemUI के साथ प्रारंभ किया गया है।
  • PipTouchHandler : टच हैंडलर, जो PIP में हेरफेर करने वाले इशारों को नियंत्रित करता है। इसका उपयोग केवल तभी किया जाता है जब PIP के लिए इनपुट उपभोक्ता सक्रिय हो ( InputConsumerController देखें)। यहां नए इशारे जोड़े जा सकते हैं।
  • PipMotionHelper : एक सुविधा वर्ग जो स्क्रीन पर PIP स्थिति और स्वीकार्य क्षेत्र को ट्रैक करता है। पीआईपी की स्थिति और आकार को अपडेट या एनिमेट करने के लिए ActivityManagerService सर्विस को कॉल करता है।
  • PipMenuActivityController : एक गतिविधि शुरू करता है जो वर्तमान में PIP में गतिविधि द्वारा प्रदान की गई क्रियाओं को दिखाता है। यह गतिविधि एक कार्य-ओवरले गतिविधि है, और इसे इंटरैक्टिव होने की अनुमति देने के लिए ओवरलेइंग इनपुट उपभोक्ता को हटा देती है।
  • PipMenuActivity : मेनू गतिविधि के लिए कार्यान्वयन।
  • PipMediaController : श्रोता जो SystemUI को अपडेट करता है जब मीडिया सत्र इस तरह से बदलता है जो पीआईपी पर डिफ़ॉल्ट क्रियाओं को प्रभावित कर सकता है।
  • PipNotificationController : नियंत्रक जो यह सुनिश्चित करता है कि जब कोई उपयोगकर्ता PIP सुविधा का उपयोग कर रहा हो तो एक अधिसूचना सक्रिय हो।
  • PipDismissViewController : उपयोगकर्ताओं को दिखाया गया ओवरले जब वे PIP के साथ इंटरैक्ट करना शुरू करते हैं, यह इंगित करने के लिए कि इसे खारिज किया जा सकता है।

डिफ़ॉल्ट प्लेसमेंट

विभिन्न सिस्टम संसाधन हैं जो PIP के डिफ़ॉल्ट प्लेसमेंट को नियंत्रित करते हैं:

  • config_defaultPictureInPictureGravity : गुरुत्वाकर्षण पूर्णांक, जो कोने को PIP रखने के लिए नियंत्रित करता है, जैसे कि BOTTOM|RIGHT
  • config_defaultPictureInPictureScreenEdgeInsets : PIP लगाने के लिए स्क्रीन के किनारों से ऑफसेट।
  • config_pictureInPictureDefaultSizePercent और config_pictureInPictureDefaultAspectRatio : स्क्रीन की चौड़ाई और पहलू अनुपात के प्रतिशत का संयोजन पीआईपी के आकार को नियंत्रित करता है। परिकलित डिफ़ॉल्ट पीआईपी आकार सीटीएस और सीडीडी द्वारा परिभाषित @dimen/default_minimal_size_pip_resizable_task से छोटा नहीं होना चाहिए।
  • config_pictureInPictureSnapMode : स्नैपिंग व्यवहार जैसा कि PipSnapAlgorithm में परिभाषित किया गया है।

डिवाइस कार्यान्वयन को सीडीडी और सीटीएस में परिभाषित न्यूनतम और अधिकतम पहलू अनुपात नहीं बदलना चाहिए।

अनुमतियां

AppOpsManager ( Master master/core/java/android/app/AppOpsManager.java ) में प्रति-पैकेज "एप्लिकेशन ऑपरेशन" ( OP_PICTURE_IN_PICTURE ) उपयोगकर्ताओं को सिस्टम सेटिंग्स के माध्यम से प्रति-एप्लिकेशन स्तर पर PIP को नियंत्रित करने देता है। जब कोई गतिविधि पिक्चर-इन-पिक्चर मोड में प्रवेश करने का अनुरोध करती है तो डिवाइस कार्यान्वयन को इस जांच का सम्मान करने की आवश्यकता होती है।

परिक्षण

पीआईपी कार्यान्वयन का परीक्षण करने के लिए, विशेष रूप से ActivityManagerPinnedStackTests.java में /cts/hostsidetests/services/activitymanager के अंतर्गत होस्ट-साइड CTS परीक्षणों में पाए जाने वाले सभी पिक्चर-इन-पिक्चर संबंधित परीक्षण चलाएं।