पिक्चर में पिक्चर

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

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

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

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

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

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

कार्यान्वयन

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

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

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

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

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

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

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

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

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

अनुमतियां

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

परिक्षण

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