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

Android हैंडहेल्ड डिवाइसों के लिए पिक्चर में पिक्चर (पीआईपी) की सुविधा की मदद से, उपयोगकर्ता किसी ऐप्लिकेशन को छोटी विंडो में बदल सकते हैं. पीआईपी की सुविधा, वीडियो ऐप्लिकेशन के लिए खास तौर पर फ़ायदेमंद है. इसकी मदद से, उपयोगकर्ता दूसरे काम करते हुए भी वीडियो चला सकता है. उपयोगकर्ता, SystemUI की मदद से इस विंडो की जगह बदल सकते हैं. साथ ही, ऐप्लिकेशन की दी गई तीन कार्रवाइयों की मदद से, फ़िलहाल पिक्चर में पिक्चर मोड में चल रहे ऐप्लिकेशन के साथ इंटरैक्ट कर सकते हैं.

पीआईपी की सुविधा इस्तेमाल करने के लिए, ज़रूरी है कि इस सुविधा के साथ काम करने वाले ऐप्लिकेशन के लिए, साफ़ तौर पर ऑप्ट-इन किया गया हो. साथ ही, यह सुविधा हर गतिविधि के हिसाब से काम करती है. (किसी एक ऐप्लिकेशन में कई गतिविधियां हो सकती हैं, जिनमें से सिर्फ़ एक गतिविधि पीआईपी में होती है.) गतिविधियां, enterPictureInPictureMode() को कॉल करके 'पिक्चर में पिक्चर' मोड में जाने का अनुरोध करती हैं. साथ ही, उन्हें onPictureInPictureModeChanged() के तौर पर गतिविधि कॉलबैक मिलते हैं.

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

ज़्यादा जानकारी के लिए, Android डेवलपर के पिक्चर में पिक्चर दस्तावेज़ देखें.

डिवाइस की ज़रूरी शर्तें

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

लागू करना

गतिविधि के लाइफ़साइकल का ज़्यादातर मैनेजमेंट, सिस्टम में ActivityManager और WindowManager के बीच किया जाता है. रेफ़रंस यूज़र इंटरफ़ेस (यूआई) को लागू करने का तरीका, SystemUI पैकेज में मौजूद है.

सिस्टम में किए गए बदलावों से, कंपैटिबिलिटी टेस्ट सुइट (CTS) टेस्ट में बताए गए उसके मूल व्यवहार पर असर नहीं पड़ना चाहिए. पीआईपी के लिए सिस्टम लॉजिक, मुख्य रूप से "पिन किए गए" स्टैक में टास्क और गतिविधियों के मैनेजमेंट के बारे में है. क्लास के बारे में खास जानकारी यहां दी गई है:

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

रेफ़रंस SystemUI में, पीआईपी को पूरी तरह से लागू करने का तरीका बताया गया है. इससे, उपयोगकर्ताओं को पसंद के मुताबिक ऐक्शन दिखाने और सामान्य बदलाव करने में मदद मिलती है. जैसे, वीडियो को बड़ा करना और बंद करना. डिवाइस बनाने वाली कंपनियां इन बदलावों को तब तक लागू कर सकती हैं, जब तक कि इनसे सीडीडी में बताए गए डिवाइस के मूल व्यवहार पर असर न पड़े. क्लास के बारे में खास जानकारी यहां दी गई है:

  • PipManager: SystemUI से शुरू होने वाला SystemUI कॉम्पोनेंट.
  • PipTouchHandler: टच हैंडलर, जो PIP में बदलाव करने वाले जेस्चर को कंट्रोल करता है. इसका इस्तेमाल सिर्फ़ तब किया जाता है, जब पीआईपी के लिए इनपुट कंज्यूमर चालू हो (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 में बताए गए तरीके के हिसाब से, स्नैप करने का व्यवहार.

डिवाइस पर लागू करने से, CDD और सीटीएस में तय किए गए आसपेक्ट रेशियो में बदलाव नहीं होना चाहिए.

अनुमतियां

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

टेस्ट करना

पिक्चर में पिक्चर (पीआईपी) की सुविधा को लागू करने की जांच करने के लिए, /cts/hostsidetests/services/activitymanager में होस्ट-साइड के CTS टेस्ट में मिले, पिक्चर में पिक्चर से जुड़े सभी टेस्ट चलाएं. खास तौर पर, ActivityManagerPinnedStackTests.java में.