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

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 में.