Android हैंडहेल्ड डिवाइसों के लिए, पिक्चर में पिक्चर (पीआईपी) सुविधा उपलब्ध है. इसकी मदद से, उपयोगकर्ता किसी ऐप्लिकेशन को छोटी विंडो में छोटा कर सकते हैं. पीआईपी की सुविधा, वीडियो ऐप्लिकेशन के लिए खास तौर पर फ़ायदेमंद होती है. इसकी वजह यह है कि इससे कॉन्टेंट चलता रहता है और उपयोगकर्ता अन्य कार्रवाइयां कर पाता है. उपयोगकर्ता, SystemUI की मदद से इस विंडो की जगह बदल सकते हैं. साथ ही, ऐप्लिकेशन की ओर से उपलब्ध कराई गई (ज़्यादा से ज़्यादा तीन) कार्रवाइयों की मदद से, फ़िलहाल पिक्चर-इन-पिक्चर मोड में चल रहे ऐप्लिकेशन के साथ इंटरैक्ट कर सकते हैं.
पीआईपी मोड के लिए, उन ऐप्लिकेशन से साफ़ तौर पर ऑप्ट-इन करना ज़रूरी है जो इसे सपोर्ट करते हैं. यह मोड, हर गतिविधि के हिसाब से काम करता है. (एक ऐप्लिकेशन में कई गतिविधियां हो सकती हैं. इनमें से सिर्फ़ एक गतिविधि पीआईपी मोड में होती है.) गतिविधियां, enterPictureInPictureMode()
को कॉल करके 'पिक्चर में पिक्चर' मोड में जाने का अनुरोध करती हैं. साथ ही, onPictureInPictureModeChanged()
के तौर पर गतिविधि के कॉलबैक मिलते हैं.
setPictureInPictureParams()
तरीके से, पीआईपी और कस्टम ऐक्शन में गतिविधियों के आसपेक्ट रेशियो को कंट्रोल किया जा सकता है. इससे उपयोगकर्ता, गतिविधि को बड़ा किए बिना उससे इंटरैक्ट कर सकते हैं. पीआईपी मोड में, गतिविधि को रोका जाता है, लेकिन रेंडरिंग की स्थिति में होती है. साथ ही, इसे सीधे तौर पर टच इनपुट या विंडो फ़ोकस नहीं मिलता.
एक बार में सिर्फ़ एक टास्क को पीआईपी मोड में रखा जा सकता है.
ज़्यादा जानकारी के लिए, Android डेवलपर के पिक्चर-इन-पिक्चर से जुड़े दस्तावेज़ देखें.
डिवाइस की ज़रूरी शर्तें
पीआईपी की सुविधा के लिए, /android/frameworks/base/core/java/android/content/pm/PackageManager.java
में जाकर PackageManager#FEATURE_PICTURE_IN_PICTURE
सिस्टम सुविधा चालू करें.
पिक्चर में पिक्चर मोड की सुविधा के साथ काम करने वाले डिवाइसों की स्क्रीन की चौड़ाई कम से कम 220dp होनी चाहिए. स्प्लिट स्क्रीन मल्टी-विंडो की तरह ही, पीआईपी मोड में भी स्क्रीन पर एक साथ कई ऐप्लिकेशन इस्तेमाल किए जा सकते हैं. इसलिए, डिवाइसों में इस सुविधा को इस्तेमाल करने के लिए, सीपीयू और रैम काफ़ी होनी चाहिए.
लागू करना
गतिविधि के लाइफ़साइकल को मैनेज करने का ज़्यादातर काम, सिस्टम में ActivityManager
और WindowManager
के बीच किया जाता है.
रेफ़रंस के तौर पर यूज़र इंटरफ़ेस (यूआई) को SystemUI
पैकेज में लागू किया गया है.
सिस्टम में किए गए बदलावों से, Compatibility Test Suite (CTS) टेस्ट में तय किए गए सिस्टम के मूल व्यवहार पर कोई असर नहीं पड़ना चाहिए. पीआईपी के लिए सिस्टम लॉजिक, मुख्य रूप से "पिन किए गए" स्टैक में टास्क और गतिविधियों को मैनेज करने के बारे में है. यहां क्लास के बारे में खास जानकारी दी गई है:
ActivityRecord
: यह कुकी, हर गतिविधि की पिक्चर-इन-पिक्चर स्थिति को ट्रैक करती है. कुछ मामलों में, उपयोगकर्ताओं को पीआईपी मोड में जाने से रोकने के लिए,checkEnterPictureInPictureState()
में केस जोड़ें. जैसे, लॉक स्क्रीन से या वीआर के दौरान.ActivityManagerService
: यह गतिविधि का मुख्य इंटरफ़ेस है. इससे पीआईपी मोड में जाने का अनुरोध किया जाता है. साथ ही, यहWindowManager
औरSystemUI
से कॉल करने का इंटरफ़ेस है. इससे पीआईपी मोड में चल रही गतिविधि की स्थिति को बदला जाता है.ActivityStackSupervisor
: इस फ़ंक्शन कोActivityManagerService
से कॉल किया जाता है. इसका इस्तेमाल, पिन किए गए स्टैक में टास्क जोड़ने या उससे हटाने के लिए किया जाता है. साथ ही, ज़रूरत के मुताबिकWindowManager
को अपडेट करने के लिए भी इसका इस्तेमाल किया जाता है.PinnedStackWindowController
:ActivityManager
सेWindowManager
इंटरफ़ेस.PinnedStackController
: यह सिस्टम में हुए बदलावों के बारे मेंSystemUI
को सूचना देता है. जैसे, IME दिखाया/छिपाया गया, आसपेक्ट रेशियो बदला गया या कार्रवाइयां बदली गईं.BoundsAnimationController
: यह पीआईपी गतिविधि वाली विंडो को इस तरह से ऐनिमेट करता है कि विंडो का साइज़ बदलते समय, कॉन्फ़िगरेशन में कोई बदलाव न हो.PipSnapAlgorithm
: यह एक शेयर की गई क्लास है. इसका इस्तेमाल सिस्टम और SystemUI, दोनों में किया जाता है. यह स्क्रीन के किनारों के पास मौजूद पीआईपी विंडो के स्नैपिंग व्यवहार को कंट्रोल करती है.
रेफ़रंस SystemUI
में पीआईपी को पूरी तरह से लागू करने के बारे में बताया गया है. इससे उपयोगकर्ताओं को कस्टम ऐक्शन दिखाने और सामान्य बदलाव करने में मदद मिलती है. जैसे, पीआईपी को बड़ा करना और बंद करना.
डिवाइस बनाने वाली कंपनियां, इन बदलावों के आधार पर नए बदलाव कर सकती हैं. हालांकि, ऐसा तब ही किया जा सकता है, जब ये बदलाव सीडीडी में बताए गए मूल सिद्धांतों पर असर न डालें. यहां क्लास के बारे में खास जानकारी दी गई है:
PipManager
:SystemUI
कॉम्पोनेंट, जोSystemUI
से शुरू होता है.PipTouchHandler
: यह टच हैंडलर है. यह पीआईपी को कंट्रोल करने वाले जेस्चर को मैनेज करता है. इसका इस्तेमाल सिर्फ़ तब किया जाता है, जब पीआईपी के लिए इनपुट कंज्यूमर चालू हो (InputConsumerController
देखें). यहां नए हावभाव जोड़े जा सकते हैं.PipMotionHelper
: यह एक सुविधा क्लास है. यह पीआईपी की पोज़िशन और स्क्रीन पर दिखने वाले हिस्से को ट्रैक करती है. ये कुकी,ActivityManagerService
के ज़रिए कॉल करती हैं. इनका इस्तेमाल पीआईपी की पोज़िशन और साइज़ को अपडेट करने या ऐनिमेशन देने के लिए किया जाता है.PipMenuActivityController
: इससे एक ऐसी गतिविधि शुरू होती है जिसमें पीआईपी मोड में चल रही गतिविधि के लिए उपलब्ध कार्रवाइयां दिखती हैं. यह ऐक्टिविटी, टास्क-ओवरले ऐक्टिविटी है. यह ओवरले करने वाले इनपुट कंज्यूमर को हटाती है, ताकि उसे इंटरैक्टिव बनाया जा सके.PipMenuActivity
: मेन्यू ऐक्टिविटी के लिए लागू किया गया कोड.PipMediaController
: यह लिसनर, मीडिया सेशन में ऐसे बदलाव होने परSystemUI
को अपडेट करता है जिनसे पीआईपी पर डिफ़ॉल्ट कार्रवाइयों पर असर पड़ सकता है.PipNotificationController
: यह कंट्रोलर यह पक्का करता है कि जब कोई उपयोगकर्ता पीआईपी सुविधा का इस्तेमाल कर रहा हो, तब सूचना ऐक्टिव हो.PipDismissViewController
: यह एक ओवरले है. यह उपयोगकर्ताओं को तब दिखता है, जब वे पीआईपी के साथ इंटरैक्ट करना शुरू करते हैं. इससे पता चलता है कि पीआईपी को खारिज किया जा सकता है.
डिफ़ॉल्ट प्लेसमेंट
सिस्टम के कई ऐसे संसाधन हैं जो पीआईपी की डिफ़ॉल्ट जगह को कंट्रोल करते हैं:
config_defaultPictureInPictureGravity
: gravity पूर्णांक, जो पीआईपी को रखने के लिए कोने को कंट्रोल करता है. जैसे,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
) की सुविधा उपलब्ध है. इसकी मदद से, उपयोगकर्ता सिस्टम सेटिंग में जाकर, हर ऐप्लिकेशन के लिए पीआईपी मोड को कंट्रोल कर सकते हैं.
जब कोई गतिविधि, पिक्चर-इन-पिक्चर मोड में जाने का अनुरोध करती है, तो डिवाइसों को इस जांच का पालन करना होगा.
टेस्ट करना
पीआईपी मोड को लागू करने की जांच करने के लिए, /cts/hostsidetests/services/activitymanager
में होस्ट-साइड सीटीएस टेस्ट में मौजूद, पीआईपी मोड से जुड़े सभी टेस्ट चलाएं. खास तौर पर, ActivityManagerPinnedStackTests.java
में.