सुरक्षा केंद्र से इंटरैक्ट करना

सुरक्षा केंद्र पर रीडायरेक्ट करें

कोई भी ऐप्लिकेशन, android.content.Intent.ACTION_SAFETY_CENTER कार्रवाई (स्ट्रिंग वैल्यू) का इस्तेमाल करके, Safety Center खोल सकता हैandroid.intent.action.SAFETY_CENTER.

सुरक्षा केंद्र खोलने के लिए, Activity इंस्टेंस में कॉल करें:

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);

startActivity(openSafetyCenterIntent);

किसी खास समस्या पर रीडायरेक्ट करना

खास इंटेंट एक्स्ट्रा का इस्तेमाल करके, Safety Center के किसी खास चेतावनी कार्ड पर रीडायरेक्ट भी किया जा सकता है. इन अतिरिक्त एलिमेंट का इस्तेमाल तीसरे पक्ष नहीं कर सकते. इसलिए, ये SafetyCenterManager का हिस्सा हैं, जो @SystemApi का हिस्सा है. सिर्फ़ सिस्टम ऐप्लिकेशन ही इन अतिरिक्त सुविधाओं को ऐक्सेस कर सकते हैं.

ऐसे इंटेंट अतिरिक्त जो किसी खास चेतावनी कार्ड को रीडायरेक्ट करते हैं:

  • EXTRA_SAFETY_SOURCE_ID
    • स्ट्रिंग वैल्यू: android.safetycenter.extra.SAFETY_SOURCE_ID
    • स्ट्रिंग टाइप: इससे, चेतावनी वाले कार्ड से जुड़े सुरक्षा सोर्स का आईडी पता चलता है
    • समस्या पर रीडायरेक्ट करने के लिए ज़रूरी है, ताकि वह सही तरीके से काम करे
  • EXTRA_SAFETY_SOURCE_ISSUE_ID
    • स्ट्रिंग वैल्यू: android.safetycenter.extra.SAFETY_SOURCE_ISSUE_ID
    • स्ट्रिंग टाइप: चेतावनी कार्ड का आईडी बताता है
    • समस्या पर रीडायरेक्ट करने के लिए, यह ज़रूरी है
  • EXTRA_SAFETY_SOURCE_USER_HANDLE
    • स्ट्रिंग का मान: android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
    • UserHandle टाइप: इससे जुड़े चेतावनी कार्ड के लिए UserHandle की जानकारी मिलती है
    • ज़रूरी नहीं है (डिफ़ॉल्ट रूप से, मौजूदा उपयोगकर्ता)

नीचे दिए गए कोड स्निपेट का इस्तेमाल, Activity इंस्टेंस में किया जा सकता है. इससे, किसी खास समस्या के लिए, सुरक्षा केंद्र की स्क्रीन खोली जा सकती है:

UserHandle theUserHandleThisIssueCameFrom = …;

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_ID, "TheSafetySourceIdThisIssueCameFrom")
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_ISSUE_ID, "TheSafetySourceIssueIdToRedirectTo")
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_USER_HANDLE, theUserHandleThisIssueCameFrom);

startActivity(openSafetyCenterIntent);

किसी खास सबपेज पर रीडायरेक्ट करना (Android 14 से)

Android 14 या इसके बाद के वर्शन में, सुरक्षा केंद्र पेज को कई सबपेज में बांटा गया है. ये सबपेज अलग-अलग SafetySourcesGroup के बारे में बताते हैं. Android 13 में, इसे छोटा किया जा सकने वाली एंट्री के तौर पर दिखाया गया है.

इस इंटेंट एक्सट्रा का इस्तेमाल करके, किसी खास सबपेज पर रीडायरेक्ट किया जा सकता है:

  • EXTRA_SAFETY_SOURCES_GROUP_ID
    • स्ट्रिंग वैल्यू: android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID
    • स्ट्रिंग टाइप: SafetySourcesGroup का आईडी बताता है
    • सबपेज पर रीडायरेक्ट करने के लिए ज़रूरी है, ताकि वह काम कर सके

नीचे दिए गए कोड स्निपेट का इस्तेमाल, Activity इंस्टेंस में किया जा सकता है. इससे, Safety Center की स्क्रीन को किसी खास सबपेज पर खोला जा सकता है:

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID, "TheSafetySourcesGroupId");

startActivity(openSafetyCenterIntent);

सुरक्षा केंद्र के सोर्स एपीआई का इस्तेमाल करना

Safety Center के सोर्स एपीआई, SafetyCenterManager (जो एक @SystemApi है) का इस्तेमाल करके उपलब्ध हैं. एपीआई के प्लैटफ़ॉर्म का कोड, कोड सर्च में उपलब्ध है. एपीआई को लागू करने का कोड, Code Search में उपलब्ध है.

अनुमतियां

Safety Center के सोर्स एपीआई को सिर्फ़ वे सिस्टम ऐप्लिकेशन ऐक्सेस कर सकते हैं जिन्हें अनुमति मिली है. इसके लिए, उन्हें यहां दी गई अनुमतियों का इस्तेमाल करना होगा. ज़्यादा जानकारी के लिए, खास अधिकारों वाले लोगों को अनुमति देने की सुविधा देखें.

  • READ_SAFETY_CENTER_STATUS
    • signature|privileged
    • SafetyCenterManager#isSafetyCenterEnabled() एपीआई के लिए इस्तेमाल किया जाता है (Safety Center के सोर्स के लिए ज़रूरी नहीं है. इसके लिए, सिर्फ़ SEND_SAFETY_CENTER_UPDATE अनुमति की ज़रूरत होती है)
    • इसका इस्तेमाल, सिस्टम के वे ऐप्लिकेशन करते हैं जो यह देखते हैं कि सुरक्षा केंद्र चालू है या नहीं
    • यह अनुमति सिर्फ़ अनुमति वाली सूची में शामिल सिस्टम ऐप्लिकेशन को दी जाती है
  • SEND_SAFETY_CENTER_UPDATE
    • internal|privileged
    • चालू किए गए एपीआई और Safety Sources API के लिए इस्तेमाल किया जाता है
    • इसका इस्तेमाल सिर्फ़ सुरक्षा से जुड़े सोर्स करते हैं
    • सिर्फ़ अनुमति वाली सूची में शामिल सिस्टम ऐप्लिकेशन को ऐक्सेस दिया गया

ये अनुमतियां खास अधिकार होती हैं. इन्हें सिर्फ़ काम की फ़ाइल में जोड़कर हासिल किया जा सकता है. उदाहरण के लिए, Settings ऐप्लिकेशन और ऐप्लिकेशन की AndroidManifest.xml फ़ाइल में com.android.settings.xml फ़ाइल. अनुमति मॉडल के बारे में ज़्यादा जानकारी के लिए, protectionLevel देखें.

SafetyCenterManager पाना

SafetyCenterManager एक @SystemApi क्लास है. इसे Android 13 से शुरू होने वाले सिस्टम ऐप्लिकेशन से ऐक्सेस किया जा सकता है. इस कॉल में, SafetyCenterManager को पाने का तरीका बताया गया है:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
  // Must be on T or above to interact with Safety Center.
  return;
}
SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
if (safetyCenterManager == null) {
  // Should not be null on T.
  return;
}

देखें कि सुरक्षा केंद्र की सुविधा चालू है या नहीं

इस कॉल में यह पता लगाया जाता है कि सुरक्षा केंद्र चालू है या नहीं. कॉल करने के लिए, READ_SAFETY_CENTER_STATUS या SEND_SAFETY_CENTER_UPDATE में से किसी एक अनुमति की ज़रूरत होती है:

boolean isSafetyCenterEnabled = safetyCenterManager.isSafetyCenterEnabled();
if (isSafetyCenterEnabled) {
  // …
} else {
  // …
}

डेटा उपलब्ध कराना

दिए गए String sourceId के साथ Security Center का सोर्स डेटा, SafetySourceData ऑब्जेक्ट के साथ Security Center को दिया जाता है. यह यूज़र इंटरफ़ेस (यूआई) एंट्री और समस्याओं की सूची (चेतावनी कार्ड) दिखाता है. यूज़र इंटरफ़ेस (यूआई) एंट्री और चेतावनी कार्ड में, SafetySourceData क्लास में बताए गए अलग-अलग गंभीरता लेवल हो सकते हैं:

  • SEVERITY_LEVEL_UNSPECIFIED
    • गंभीरता की जानकारी नहीं दी गई है
    • रंग: स्लेटी या पारदर्शी (एंट्री के SafetySourcesGroup के आधार पर)
    • इसका इस्तेमाल ऐसे डाइनैमिक डेटा के लिए किया जाता है जो यूज़र इंटरफ़ेस (यूआई) में स्टैटिक एंट्री के तौर पर दिखता है या
    • चेतावनी वाले कार्ड के लिए इस्तेमाल नहीं किया जाना चाहिए
  • SEVERITY_LEVEL_INFORMATION
    • बुनियादी जानकारी या छोटा सुझाव
    • रंग: हरा
  • SEVERITY_LEVEL_RECOMMENDATION
    • उपयोगकर्ता को इस समस्या पर कार्रवाई करने का सुझाव दिया गया है, क्योंकि इससे उसे खतरा हो सकता है
    • रंग: पीला
  • SEVERITY_LEVEL_CRITICAL_WARNING
    • गंभीर चेतावनी, जिसमें उपयोगकर्ता को इस समस्या पर कार्रवाई करने के लिए कहा गया है, क्योंकि इससे जोखिम हो सकता है
    • रंग: लाल

SafetySourceData

SafetySourceData ऑब्जेक्ट में यूज़र इंटरफ़ेस (यूआई) एंट्री, चेतावनी वाले कार्ड, और इनवैरिएंट होते हैं.

  • वैकल्पिक SafetySourceStatus इंस्टेंस (यूज़र इंटरफ़ेस (यूआई) एंट्री)
  • SafetySourceIssue इंस्टेंस (चेतावनी कार्ड) की सूची
  • Bundle अतिरिक्त विकल्प (14 से शुरू)
  • इन्वैरिएंट:
    • SafetySourceIssue सूची में यूनीक आइडेंटिफ़ायर वाली समस्याएं होनी चाहिए.
    • अगर कोई SafetySourceIssue इंस्टेंस है, तो वह SafetySourceStatus से ज़्यादा अहम नहीं होना चाहिए. ऐसा तब तक नहीं किया जा सकता, जब तक कि SafetySourceStatus, SEVERITY_LEVEL_UNSPECIFIED न हो. इस मामले में, SEVERITY_LEVEL_INFORMATION से जुड़ी समस्याओं को अनुमति दी जाती है.
    • एपीआई कॉन्फ़िगरेशन की अन्य ज़रूरी शर्तों को पूरा करना ज़रूरी है. उदाहरण के लिए, अगर सोर्स सिर्फ़ समस्याओं के बारे में जानकारी देता है, तो उसे SafetySourceStatus इंस्टेंस नहीं देना चाहिए.

SafetySourceStatus

  • CharSequence टाइटल डालना ज़रूरी है
  • CharSequence की खास जानकारी ज़रूरी है
  • गंभीरता का ज़रूरी लेवल
  • उपयोगकर्ता को सही पेज पर रीडायरेक्ट करने के लिए, वैकल्पिक PendingIntent उदाहरण (डिफ़ॉल्ट रूप से, कॉन्फ़िगरेशन में मौजूद intentAction का इस्तेमाल किया जाता है)
  • वैकल्पिक IconAction (एंट्री में साइड आइकॉन के तौर पर दिखाया गया है), इनमें ये चीज़ें शामिल होती हैं:
    • ज़रूरी आइकॉन टाइप, जो इनमें से कोई एक होना चाहिए:
      • ICON_TYPE_GEAR: यूज़र इंटरफ़ेस (यूआई) एंट्री के बगल में गियर के तौर पर दिखता है
      • ICON_TYPE_INFO: यूज़र इंटरफ़ेस (यूआई) एंट्री के बगल में, जानकारी वाले आइकॉन के तौर पर दिखता है
    • उपयोगकर्ता को किसी दूसरे पेज पर रीडायरेक्ट करने के लिए ज़रूरी है PendingIntent
  • ज़रूरी नहीं है कि बूलियन enabled की वैल्यू दी जाए. इसकी मदद से, यूज़र इंटरफ़ेस (यूआई) एंट्री को 'बंद है' के तौर पर मार्क किया जा सकता है, ताकि उस पर क्लिक न किया जा सके. डिफ़ॉल्ट वैल्यू true है
  • इनवैरिएंट:
    • PendingIntent इंस्टेंस को एक Activity इंस्टेंस खोलना चाहिए.
    • अगर एंट्री बंद है, तो इसे SEVERITY_LEVEL_UNSPECIFIED के तौर पर सेट किया जाना चाहिए.
    • एपीआई कॉन्फ़िगरेशन से जुड़ी अन्य ज़रूरी शर्तें.

SafetySourceIssue

  • ज़रूरी यूनीक String आइडेंटिफ़ायर
  • CharSequence टाइटल डालना ज़रूरी है
  • CharSequence सबटाइटल (ज़रूरी नहीं)
  • CharSequence की ज़रूरी खास जानकारी
  • गंभीरता का ज़रूरी लेवल
  • समस्या की कैटगरी, जो ज़रूरी नहीं है. यह इनमें से कोई एक होनी चाहिए:
    • ISSUE_CATEGORY_DEVICE: इस समस्या का असर उपयोगकर्ता के डिवाइस पर पड़ता है.
    • ISSUE_CATEGORY_ACCOUNT: इस समस्या का असर उपयोगकर्ता के खातों पर पड़ता है.
    • ISSUE_CATEGORY_GENERAL: इस समस्या से उपयोगकर्ता की सामान्य सुरक्षा पर असर पड़ता है. यह डिफ़ॉल्ट विकल्प है.
    • ISSUE_CATEGORY_DATA (Android 14 से): इस समस्या का असर उपयोगकर्ता के डेटा पर पड़ता है.
    • ISSUE_CATEGORY_PASSWORDS (Android 14 से): इस समस्या का असर उपयोगकर्ता के पासवर्ड पर पड़ता है.
    • ISSUE_CATEGORY_PERSONAL_SAFETY (Android 14 से): इस समस्या का असर उपयोगकर्ता की निजी सुरक्षा पर पड़ता है.
  • इस समस्या के लिए, उपयोगकर्ता के पास Action एलिमेंट इस्तेमाल करने का विकल्प होता है. हर Action इंस्टेंस में ये एलिमेंट होते हैं:
    • ज़रूरी यूनीक String आइडेंटिफ़ायर
    • ज़रूरी CharSequence लेबल
    • लोगों को किसी दूसरे पेज पर रीडायरेक्ट करने या सुरक्षा केंद्र की स्क्रीन से सीधे कार्रवाई करने के लिए, PendingIntent का इस्तेमाल करना ज़रूरी है
    • यह एक वैकल्पिक बूलियन है. इससे यह तय किया जा सकता है कि इस समस्या को सीधे Safety Center की स्क्रीन से ठीक किया जा सकता है या नहीं. डिफ़ॉल्ट रूप से, इसकी वैल्यू false होती है
    • CharSequence समस्या हल होने का मैसेज, जो उपयोगकर्ता को तब दिखेगा, जब समस्या सीधे Safety Center की स्क्रीन से हल हो जाएगी. हालांकि, यह मैसेज दिखाना ज़रूरी नहीं है
  • ज़रूरी नहीं PendingIntent यह तब ट्रिगर होता है, जब उपयोगकर्ता समस्या को खारिज करता है (डिफ़ॉल्ट रूप से, कुछ भी ट्रिगर नहीं होता)
  • String समस्या के टाइप के लिए आइडेंटिफ़ायर ज़रूरी है. यह समस्या के आइडेंटिफ़ायर से मिलता-जुलता है. हालांकि, यह यूनीक नहीं होना चाहिए. इसका इस्तेमाल लॉग करने के लिए किया जाता है
  • डुप्लीकेट कॉन्टेंट हटाने वाले आईडी के लिए String ज़रूरी नहीं है. इसकी मदद से, एक ही SafetySourceIssue को अलग-अलग सोर्स से पोस्ट किया जा सकता है. साथ ही, यह यूज़र इंटरफ़ेस (यूआई) में सिर्फ़ एक बार दिखता है. ऐसा तब होता है, जब उनका deduplicationGroup एक जैसा हो (Android 14 से). अगर इसकी वैल्यू नहीं दी जाती है, तो समस्या को कभी भी डुप्लीकेट नहीं किया जाता
  • एट्रिब्यूशन टाइटल के लिए CharSequence ज़रूरी नहीं है. यह एक टेक्स्ट है, जो बताता है कि चेतावनी कार्ड कहां से आया है (Android 14 से). अगर यह जानकारी नहीं दी गई है, तो SafetySourcesGroup के टाइटल का इस्तेमाल किया जाता है
  • समस्या को ठीक करने के लिए कार्रवाई करना (Android 14 से शुरू), जो इनमें से कोई एक होना चाहिए:
    • ISSUE_ACTIONABILITY_MANUAL: उपयोगकर्ता को इस समस्या को मैन्युअल तरीके से हल करना होगा. यह डिफ़ॉल्ट विकल्प है.
    • ISSUE_ACTIONABILITY_TIP: यह समस्या सिर्फ़ एक सलाह है. हो सकता है कि इसके लिए, उपयोगकर्ता को कोई इनपुट न देना पड़े.
    • ISSUE_ACTIONABILITY_AUTOMATIC: इस समस्या पर पहले ही कार्रवाई की जा चुकी है और हो सकता है कि इसके लिए उपयोगकर्ता के इनपुट की ज़रूरत न पड़े.
  • सूचना के व्यवहार की सेटिंग (Android 14 से शुरू), जो इनमें से कोई एक होनी चाहिए:
    • NOTIFICATION_BEHAVIOR_UNSPECIFIED: सुरक्षा केंद्र यह तय करेगा कि चेतावनी कार्ड के लिए सूचना भेजनी है या नहीं. यह डिफ़ॉल्ट विकल्प है.
    • NOTIFICATION_BEHAVIOR_NEVER: कोई सूचना पोस्ट नहीं की गई है.
    • NOTIFICATION_BEHAVIOR_DELAYED: समस्या की पहली बार शिकायत करने के कुछ समय बाद, सूचना पोस्ट की जाती है.
    • NOTIFICATION_BEHAVIOR_IMMEDIATELY: समस्या की शिकायत होने के तुरंत बाद, एक सूचना पोस्ट की जाती है.
  • चेतावनी कार्ड के साथ पसंद के मुताबिक सूचना दिखाने के लिए, Notification ज़रूरी नहीं है. यह सुविधा Android 14 से शुरू होती है. अगर Notification की वैल्यू नहीं दी गई है, तो इसे चेतावनी कार्ड से लिया जाता है. इनमें शामिल हैं:
    • CharSequence टाइटल डालना ज़रूरी है
    • CharSequence की ज़रूरी खास जानकारी
    • उन Action एलिमेंट की सूची जिन्हें उपयोगकर्ता इस सूचना के लिए इस्तेमाल कर सकता है
  • इन्वैरिएंट:
    • Action इंस्टेंस की सूची में, यूनीक आइडेंटिफ़ायर वाली कार्रवाइयां होनी चाहिए
    • Action इंस्टेंस की सूची में एक या दो Action एलिमेंट होने चाहिए. अगर कार्रवाई करने की सुविधा ISSUE_ACTIONABILITY_MANUAL नहीं है, तो Action को शून्य पर सेट किया जा सकता है.
    • Onखारिज PendingIntent को Activity इंस्टेंस नहीं खोलना चाहिए
    • एपीआई कॉन्फ़िगरेशन से जुड़ी अन्य ज़रूरी शर्तें

सुरक्षा केंद्र को कुछ इवेंट के आधार पर डेटा दिया जाता है. इसलिए, यह बताना ज़रूरी है कि सोर्स ने SafetySourceData को SafetyEvent इंस्टेंस क्यों दिया.

SafetyEvent

  • ज़रूरी टाइप, जो इनमें से कोई एक होना चाहिए:
    • SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED: सोर्स की स्थिति बदल गई है.
    • SAFETY_EVENT_TYPE_REFRESH_REQUESTED: सुरक्षा केंद्र से मिले रीफ़्रेश/फिर से स्कैन करने के सिग्नल का जवाब देते समय, सुरक्षा केंद्र के लिए SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED की जगह इसका इस्तेमाल करें, ताकि रीफ़्रेश/फिर से स्कैन करने का अनुरोध ट्रैक किया जा सके.
    • SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED: हमने SafetySourceIssue.Action को सीधे सुरक्षा केंद्र की स्क्रीन से ठीक कर दिया है. SafetySourceIssue.Action को ठीक करने की प्रोसेस को ट्रैक करने के लिए, सुरक्षा केंद्र में SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED के बजाय इसका इस्तेमाल करें.
    • SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED: हमने सीधे सुरक्षा केंद्र की स्क्रीन से SafetySourceIssue.Action को ठीक करने की कोशिश की, लेकिन ऐसा नहीं हो सका. सुरक्षा केंद्र के लिए, SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED के बजाय इसका इस्तेमाल करें, ताकि SafetySourceIssue.Action को ट्रैक किया जा सके.
    • SAFETY_EVENT_TYPE_DEVICE_LOCALE_CHANGED: डिवाइस की भाषा बदल गई है. इसलिए, हम दिए गए डेटा के टेक्स्ट को अपडेट कर रहे हैं. इसके लिए, SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED का इस्तेमाल किया जा सकता है.
    • SAFETY_EVENT_TYPE_DEVICE_REBOOTED: हम यह डेटा, डिवाइस के शुरू में बूट होने के दौरान उपलब्ध कराते हैं. ऐसा इसलिए है, क्योंकि Safety Center का डेटा, डिवाइस को रीबूट करने पर सेव नहीं रहता. इसके लिए, SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED का इस्तेमाल किया जा सकता है.
  • रीफ़्रेश किए गए ब्रॉडकास्ट आईडी के लिए वैकल्पिक String आइडेंटिफ़ायर.
  • SafetySourceIssue इंस्टेंस के लिए समाधान पाने वाला String आइडेंटिफ़ायर. हालांकि, ऐसा करना ज़रूरी नहीं है.
  • हल किए जा रहे SafetySourceIssue.Action इंस्टेंस के लिए वैकल्पिक String आइडेंटिफ़ायर.
  • इन्वैरिएंट:
    • अगर टाइप SAFETY_EVENT_TYPE_REFRESH_REQUESTED है, तो रीफ़्रेश ब्रॉडकास्ट आईडी देना ज़रूरी है
    • अगर समस्या का टाइप SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED या SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED है, तो समस्या और कार्रवाई का आईडी देना ज़रूरी है

यहां एक उदाहरण दिया गया है, जिसमें बताया गया है कि कोई सोर्स, Safety Center को डेटा कैसे दे सकता है. इस उदाहरण में, एक चेतावनी कार्ड के साथ एंट्री दी गई है:

PendingIntent redirectToMyScreen =
    PendingIntent.getActivity(
        context, requestCode, redirectToMyScreenIntent, PendingIntent.FLAG_IMMUTABLE);
SafetySourceData safetySourceData =
    new SafetySourceData.Builder()
        .setStatus(
            new SafetySourceStatus.Builder(
                    "title", "summary", SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION)
                .setPendingIntent(redirectToMyScreen)
                .build())
        .addIssue(
            new SafetySourceIssue.Builder(
                    "MyIssueId",
                    "title",
                    "summary",
                    SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION,
                    "MyIssueTypeId")
                .setSubtitle("subtitle")
                .setIssueCategory(SafetySourceIssue.ISSUE_CATEGORY_DEVICE)
                .addAction(
                    new SafetySourceIssue.Action.Builder(
                            "MyIssueActionId", "label", redirectToMyScreen)
                        .build())
                .build())
        .build();
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
safetyCenterManager.setSafetySourceData("MySourceId", safetySourceData, safetyEvent);

पिछली बार दिया गया डेटा पाना

आपके ऐप्लिकेशन के मालिकाना हक वाले सोर्स के लिए, Safety Center को दिया गया पिछला डेटा देखा जा सकता है. इसका इस्तेमाल, अपने यूज़र इंटरफ़ेस (यूआई) में कुछ दिखाने के लिए किया जा सकता है. इससे यह भी पता लगाया जा सकता है कि किसी महंगे ऑपरेशन को करने से पहले, डेटा को अपडेट करने की ज़रूरत है या नहीं. इसके अलावा, Safety Center को कुछ बदलावों के साथ या नए SafetyEvent इंस्टेंस के साथ वही SafetySourceData इंस्टेंस भी दिया जा सकता है. यह टेस्टिंग के लिए भी काम का है.

Safety Center को भेजा गया पिछला डेटा पाने के लिए, इस कोड का इस्तेमाल करें:

SafetySourceData lastDataProvided = safetyCenterManager.getSafetySourceData("MySourceId");

गड़बड़ी की शिकायत करना

अगर SafetySourceData का डेटा इकट्ठा नहीं हो पा रहा है, तो सुरक्षा केंद्र पर इस गड़बड़ी की शिकायत की जा सकती है. इससे, एंट्री को बदलकर स्लेटी कर दिया जाएगा, कैश मेमोरी में सेव किया गया डेटा मिट जाएगा, और सेटिंग जांच नहीं की जा सकी जैसा कुछ मैसेज मिलेगा. अगर SafetySourceIssue.Action का कोई इंस्टेंस ठीक नहीं हो पाता है, तो गड़बड़ी की शिकायत भी की जा सकती है. इस मामले में, कैश मेमोरी में सेव किया गया डेटा नहीं मिटता और यूज़र इंटरफ़ेस (यूआई) की एंट्री में बदलाव नहीं होता. हालांकि, उपयोगकर्ता को यह बताने के लिए एक मैसेज दिखाया जाता है कि कुछ गड़बड़ी हुई है.

SafetySourceErrorDetails का इस्तेमाल करके गड़बड़ी की जानकारी दी जा सकती है. इसमें ये चीज़ें शामिल होती हैं:

  • SafetySourceErrorDetails: SafetyEvent इंस्टेंस ज़रूरी है:
// An error has occurred in the background, need to clear the Safety Center data to avoid showing data that may not be valid anymore
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
SafetySourceErrorDetails safetySourceErrorDetails = new SafetySourceErrorDetails(safetyEvent);
safetyCenterManager.reportSafetySourceError("MySourceId", safetySourceErrorDetails);

रीफ़्रेश या फिर से स्कैन करने के अनुरोध का जवाब देना

नया डेटा उपलब्ध कराने के लिए, सुरक्षा केंद्र से सिग्नल लिया जा सकता है. रीफ़्रेश करने या फिर से स्कैन करने के अनुरोध का जवाब देने से यह पक्का होता है कि उपयोगकर्ता, Safety Center खोलने और स्कैन बटन पर टैप करने पर, डिवाइस की मौजूदा स्थिति देख पाए.

ऐसा करने के लिए, यहां दी गई कार्रवाई के साथ ब्रॉडकास्ट पाएं:

  • ACTION_REFRESH_SAFETY_SOURCES
    • स्ट्रिंग वैल्यू: android.safetycenter.action.REFRESH_SAFETY_SOURCES
    • यह ट्रिगर तब होता है, जब Security Center किसी ऐप्लिकेशन के लिए, सुरक्षा सोर्स के डेटा को रीफ़्रेश करने का अनुरोध भेजता है
    • सुरक्षित इंटेंट, जिसे सिर्फ़ सिस्टम भेज सकता है
    • इसे कॉन्फ़िगरेशन फ़ाइल में, साफ़ तौर पर बताए गए इंटेंट के तौर पर सभी सुरक्षा सोर्स को भेजा जाता है. इसके लिए, SEND_SAFETY_CENTER_UPDATE अनुमति की ज़रूरत होती है

इस ब्रॉडकास्ट के तहत, ये अतिरिक्त सुविधाएं मिलती हैं:

  • EXTRA_REFRESH_SAFETY_SOURCE_IDS
    • स्ट्रिंग वैल्यू: android.safetycenter.extra.REFRESH_SAFETY_SOURCE_IDS
    • स्ट्रिंग कलेक्शन टाइप (String[]), दिए गए ऐप्लिकेशन के लिए रीफ़्रेश किए जाने वाले सोर्स आईडी दिखाता है
  • EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE

    • स्ट्रिंग वैल्यू: android.safetycenter.extra.REFRESH_SAFETY_SOURCES_REQUEST_TYPE
    • इंटिजर टाइप, अनुरोध टाइप @IntDef दिखाता है
    • इनमें से कोई एक होना चाहिए:
      • EXTRA_REFRESH_REQUEST_TYPE_GET_DATA: सोर्स से तुरंत डेटा पाने का अनुरोध करता है. आम तौर पर, यह अनुरोध तब किया जाता है, जब उपयोगकर्ता पेज खोलता है
      • EXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA: सोर्स से, जितना हो सके उतना नया डेटा देने का अनुरोध करता है. आम तौर पर, ऐसा तब होता है, जब उपयोगकर्ता 'फिर से स्कैन करें' बटन दबाता है
  • EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID

    • स्ट्रिंग वैल्यू: android.safetycenter.extra.REFRESH_SAFETY_SOURCES_BROADCAST_ID
    • स्ट्रिंग टाइप, अनुरोध किए गए रीफ़्रेश के लिए यूनीक आइडेंटिफ़ायर दिखाता है

Safety Center से सिग्नल पाने के लिए, BroadcastReceiver का कोई उदाहरण लागू करें. ब्रॉडकास्ट को खास BroadcastOptions के साथ भेजा जाता है, जिससे रिसीवर को फ़ोरग्राउंड सेवा शुरू करने की अनुमति मिलती है.

BroadcastReceiver रीफ़्रेश करने के अनुरोध का जवाब देता है:

public final class SafetySourceReceiver extends BroadcastReceiver {
  // All the safety sources owned by this application.
  private static final String[] ALL_SAFETY_SOURCES = new String[] {"MySourceId1", "…"};
  @Override
  public void onReceive(Context context, Intent intent) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
      // Must be on T or above to interact with Safety Center.
      return;
    }
    String action = intent.getAction();
    if (!SafetyCenterManager.ACTION_REFRESH_SAFETY_SOURCES.equals(action)) {
      return;
    }
    String refreshBroadcastId =
        intent.getStringExtra(SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID);
    if (refreshBroadcastId == null) {
      // Should always be provided.
      return;
    }
    String[] sourceIds =
        intent.getStringArrayExtra(SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS);
    if (sourceIds == null) {
      sourceIds = ALL_SAFETY_SOURCES;
    }
    int requestType =
        intent.getIntExtra(
            SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE,
            SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_GET_DATA);
    SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
    if (safetyCenterManager == null) {
      // Should not be null on T.
      return;
    }
    if (!safetyCenterManager.isSafetyCenterEnabled()) {
      // Preferably, no Safety Source code should be run if Safety Center is disabled.
      return;
    }
    SafetyEvent refreshSafetyEvent =
        new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_REFRESH_REQUESTED)
            .setRefreshBroadcastId(refreshBroadcastId)
            .build();
    for (String sourceId : sourceIds) {
      SafetySourceData safetySourceData = getSafetySourceDataFor(sourceId, requestType);
      // Set the data (or report an error with reportSafetySourceError, if something went wrong).
      safetyCenterManager.setSafetySourceData(sourceId, safetySourceData, refreshSafetyEvent);
    }
  }
  private SafetySourceData getSafetySourceDataFor(String sourceId, int requestType) {
    switch (requestType) {
      case SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_GET_DATA:
        return getRefreshSafetySourceDataFor(sourceId);
      case SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA:
        return getRescanSafetySourceDataFor(sourceId);
      default:
    }
    return getRefreshSafetySourceDataFor(sourceId);
  }
  // Data to provide when the user opens the page or on specific events.
  private SafetySourceData getRefreshSafetySourceDataFor(String sourceId) {
    // Get data for the source, if it's a fast operation it could potentially be executed in the
    // receiver directly.
    // Otherwise, it must start some kind of foreground service or expedited job.
    return null;
  }
  // Data to provide when the user pressed the rescan button.
  private SafetySourceData getRescanSafetySourceDataFor(String sourceId) {
    // Could be implemented the same way as getRefreshSafetySourceDataFor, depending on the source's
    // need.
    // Otherwise, could potentially perform a longer task.
    // In which case, it must start some kind of foreground service or expedited job.
    return null;
  }
}

ऊपर दिए गए उदाहरण में BroadcastReceiver का वही इंस्टेंस, AndroidManifest.xml में दिखाया गया है:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="…">
    <application>
    <!-- … -->
        <receiver android:name=".SafetySourceReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="android.safetycenter.action.REFRESH_SAFETY_SOURCES"/>
            </intent-filter>
        </receiver>
    <!-- … -->
    </application>
</manifest>

आम तौर पर, Security Center का सोर्स इस तरह से लागू किया जाता है कि डेटा में बदलाव होने पर, वह SafetyCenterManager को कॉल करता है. सिस्टम की परफ़ॉर्मेंस को बेहतर बनाने के लिए, हमारा सुझाव है कि आप सिर्फ़ फिर से स्कैन करने के सिग्नल (जब उपयोगकर्ता स्कैन बटन पर टैप करता है) का जवाब दें. उपयोगकर्ता के Safety Center खोलने पर जवाब न दें. अगर यह फ़ंक्शन ज़रूरी है, तो कॉन्फ़िगरेशन फ़ाइल में refreshOnPageOpenAllowed="true" फ़ील्ड को सेट करना ज़रूरी है, ताकि ऐसे मामलों में सोर्स को ब्रॉडकास्ट मिल सके.

सुरक्षा केंद्र के चालू या बंद होने पर जवाब देना

इस इंटेंट ऐक्शन का इस्तेमाल करके, यह पता लगाया जा सकता है कि सुरक्षा केंद्र चालू है या बंद:

  • ACTION_SAFETY_CENTER_ENABLED_CHANGED
    • स्ट्रिंग वैल्यू: android.safetycenter.action.SAFETY_CENTER_ENABLED_CHANGED
    • तब ट्रिगर होता है, जब डिवाइस के चालू रहने के दौरान सुरक्षा केंद्र चालू या बंद हो
    • बूट करने पर कॉल नहीं किया गया (उसके लिए ACTION_BOOT_COMPLETED इस्तेमाल करें)
    • सुरक्षित इंटेंट, जिसे सिर्फ़ सिस्टम भेज सकता है
    • कॉन्फ़िगरेशन फ़ाइल में, साफ़ तौर पर बताए गए इंटेंट के तौर पर सभी सुरक्षा सोर्स को भेजा जाता है. इसके लिए, SEND_SAFETY_CENTER_UPDATE अनुमति की ज़रूरत होती है
    • ऐसा इम्प्लीसिट इंटेंट के तौर पर भेजा गया है जिसके लिए READ_SAFETY_CENTER_STATUS की अनुमति ज़रूरी है

यह इंटेंट ऐक्शन, डिवाइस पर Safety Center से जुड़ी सुविधाओं को चालू या बंद करने के लिए मददगार है.

समस्या हल करने के लिए कार्रवाइयां लागू करना

समस्या हल करने की कार्रवाई, SafetySourceIssue.Action का एक ऐसा उदाहरण है जिसे उपयोगकर्ता सीधे सुरक्षा केंद्र की स्क्रीन से हल कर सकता है. उपयोगकर्ता किसी ऐक्शन बटन पर टैप करता है और सुरक्षा सोर्स से भेजे गए SafetySourceIssue.Action पर PendingIntent इंस्टेंस ट्रिगर हो जाता है. इससे, बैकग्राउंड में समस्या हल हो जाती है और समस्या हल होने पर, सुरक्षा केंद्र को सूचना दी जाती है.

समस्या हल करने की कार्रवाइयां लागू करने के लिए, Safety Center का सोर्स किसी सेवा का इस्तेमाल कर सकता है. ऐसा तब किया जाता है, जब कार्रवाई में कुछ समय लगने की उम्मीद हो (PendingIntent.getService) या ब्रॉडकास्ट रिसीवर (PendingIntent.getBroadcast) का इस्तेमाल किया जा रहा हो.

सुरक्षा केंद्र को समस्या हल करने के लिए, इस कोड का इस्तेमाल करें:

Intent resolveIssueBroadcastIntent =
    new Intent("my.package.name.MY_RESOLVING_ACTION").setClass(ResolveActionReceiver.class);
PendingIntent resolveIssue =
    PendingIntent.getBroadcast(
        context, requestCode, resolveIssueBroadcastIntent, PendingIntent.FLAG_IMMUTABLE);
SafetySourceData safetySourceData =
    new SafetySourceData.Builder()
        .setStatus(
            new SafetySourceStatus.Builder(
                    "title", "summary", SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION)
                .setPendingIntent(redirectToMyScreen)
                .build())
        .addIssue(
            new SafetySourceIssue.Builder(
                    "MyIssueId",
                    "title",
                    "summary",
                    SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION,
                    "MyIssueTypeId")
                .setIssueCategory(SafetySourceIssue.ISSUE_CATEGORY_DEVICE)
                .addAction(
                    new SafetySourceIssue.Action.Builder(
                            "MyIssueActionId", "label", resolveIssue)
                        .setWillResolve(true)
                        .build())
                .build())
        .build();
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
safetyCenterManager.setSafetySourceData("MySourceId", safetySourceData, safetyEvent);

BroadcastReceiver कार्रवाई को हल करता है:

public final class ResolveActionReceiver extends BroadcastReceiver {
  private static final String MY_RESOLVING_ACTION = "my.package.name.MY_RESOLVING_ACTION";
  @Override
  public void onReceive(Context context, Intent intent) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
      // Must be on T or above to interact with Safety Center.
      return;
    }
    String action = intent.getAction();
    if (!MY_RESOLVING_ACTION.equals(action)) {
      return;
    }
    SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
    if (safetyCenterManager == null) {
      // Should not be null on T.
      return;
    }
    if (!safetyCenterManager.isSafetyCenterEnabled()) {
      // Preferably, no Safety Source code should be run if Safety Center is disabled.
      return;
    }
    resolveTheIssue();
    SafetyEvent resolveActionSafetyEvent =
        new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED)
            .setSafetySourceIssueId("MyIssueId")
            .setSafetySourceIssueActionId("MyIssueActionId")
            .build();
    SafetySourceData dataWithoutTheIssue = …;
    // Set the data (or report an error with reportSafetySourceError and
    // SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED, if something went wrong).
    safetyCenterManager.setSafetySourceData("MySourceId", dataWithoutTheIssue, resolveActionSafetyEvent);
  }

  private void resolveTheIssue() {
    // Resolves the issue for the user. Given this a BroadcastReceiver, this should be a fast action.
    // Otherwise, a foreground service and PendingIntent.getService should be used instead (or a job
    // could be scheduled here, too).
  }
}

ऊपर दिए गए उदाहरण में BroadcastReceiver का वही इंस्टेंस, AndroidManifest.xml में दिखाया गया है:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="…">
    <application>
    <!-- … -->
        <receiver android:name=".ResolveActionReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="my.package.name.MY_RESOLVING_ACTION"/>
            </intent-filter>
        </receiver>
    <!-- … -->
    </application>
</manifest>

समस्या खारिज होने का जवाब दें

आपके पास PendingIntent का ऐसा इंस्टेंस तय करने का विकल्प होता है जिसे SafetySourceIssue इंस्टेंस खारिज किए जाने पर ट्रिगर किया जा सकता है. सुरक्षा केंद्र, इन समस्याओं को हल करता है:

  • अगर कोई सोर्स किसी समस्या की जानकारी देता है, तो उपयोगकर्ता उसे खारिज कर सकता है. इसके लिए, उसे सुरक्षा केंद्र की स्क्रीन पर, 'खारिज करें' बटन (चेतावनी कार्ड पर मौजूद X बटन) पर टैप करना होगा.
  • जब कोई उपयोगकर्ता किसी समस्या को खारिज करता है, तो अगर समस्या बनी रहती है, तो वह समस्या दोबारा यूज़र इंटरफ़ेस (यूआई) में नहीं दिखेगी.
  • डिवाइस को फिर से चालू करने के दौरान, डिस्क को बार-बार खारिज करने की सुविधा मौजूद रहती है.
  • अगर Safety Center का सोर्स किसी समस्या की जानकारी देना बंद कर देता है और फिर बाद में उस समस्या की जानकारी फिर से देता है, तो समस्या फिर से दिखने लगती है. ऐसा उन मामलों में किया जाता है जहां उपयोगकर्ता को कोई चेतावनी दिखती है और वह उसे खारिज कर देता है. इसके बाद, वह ऐसी कार्रवाई करता है जिससे समस्या हल हो जानी चाहिए. हालांकि, उपयोगकर्ता फिर से कुछ ऐसा करता है जिससे मिलती-जुलती समस्या फिर से हो जाती है. इसके बाद, आपको चेतावनी वाला कार्ड फिर से दिखेगा.
  • चेतावनी वाले पीले और लाल कार्ड हर 180 दिन में फिर से दिखते हैं. ऐसा तब तक होता है, जब तक उपयोगकर्ता उन्हें कई बार खारिज नहीं कर देता.

सोर्स को अतिरिक्त व्यवहारों की ज़रूरत तब तक नहीं पड़नी चाहिए, जब तक:

  • सोर्स इस व्यवहार को अलग तरीके से लागू करने की कोशिश करता है. उदाहरण के लिए, समस्या को फिर कभी न दिखाना.
  • सोर्स, जानकारी को लॉग करने के लिए, इसका इस्तेमाल कॉलबैक के तौर पर करने की कोशिश करता है.

एक से ज़्यादा उपयोगकर्ताओं/प्रोफ़ाइलों का डेटा देना

SafetyCenterManager एपीआई का इस्तेमाल, उपयोगकर्ताओं और प्रोफ़ाइलों में किया जा सकता है. ज़्यादा जानकारी के लिए, मल्टीयूज़र अवेयर ऐप्लिकेशन बनाना लेख पढ़ें. SafetyCenterManager दिखाने वाला Context ऑब्जेक्ट, UserHandle इंस्टेंस से जुड़ा होता है. इसलिए, दिखाया गया SafetyCenterManager इंस्टेंस, उस UserHandle इंस्टेंस के लिए Safety Center के साथ इंटरैक्ट करता है. डिफ़ॉल्ट रूप से, Context, मौजूदा उपयोगकर्ता से जुड़ा होता है. हालांकि, अगर ऐप्लिकेशन के पास INTERACT_ACROSS_USERS और INTERACT_ACROSS_USERS_FULL अनुमतियां हों, तो किसी दूसरे उपयोगकर्ता के लिए इंस्टेंस बनाया जा सकता है. इस उदाहरण में, सभी उपयोगकर्ताओं/प्रोफ़ाइलों पर कॉल करने का तरीका बताया गया है:

Context userContext = context.createContextAsUser(userHandle, 0);
SafetyCenterManager userSafetyCenterManager = userContext.getSystemService(SafetyCenterManager.class);
if (userSafetyCenterManager == null) {
  // Should not be null on T.
  return;
}
// Calls to userSafetyCenterManager will provide data for the given userHandle

इस डिवाइस पर, हर उपयोगकर्ता के पास मैनेज की जा रही एक से ज़्यादा प्रोफ़ाइलें हो सकती हैं. सुरक्षा केंद्र में हर उपयोगकर्ता के लिए अलग-अलग डेटा होता है. हालांकि, यह सुविधा किसी उपयोगकर्ता से जुड़ी, मैनेज की जा रही सभी प्रोफ़ाइलों का डेटा मर्ज कर देती है.

जब कॉन्फ़िगरेशन फ़ाइल में सोर्स के लिए profile="all_profiles" सेट किया जाता है, तो ये चीज़ें होती हैं:

  • उपयोगकर्ता (प्रोफ़ाइल के पैरंट) और उससे जुड़ी सभी मैनेज की गई प्रोफ़ाइलों (जो titleForWork इंस्टेंस का इस्तेमाल करती हैं) के लिए, यूज़र इंटरफ़ेस (यूआई) एंट्री होती है.
  • रीफ़्रेश या फिर से स्कैन करने का सिग्नल, पैरंट प्रोफ़ाइल और उससे जुड़ी सभी मैनेज की जा रही प्रोफ़ाइलों के लिए भेजा जाता है. रिसीवर को हर प्रोफ़ाइल के लिए चालू कर दिया जाता है और वह संबंधित डेटा को सीधे क्रॉस-प्रोफ़ाइल कॉल किए बिना भी SafetyCenterManager को दे सकता है. ऐसा तब तक होगा, जब तक रिसीवर या ऐप्लिकेशन singleUser को न कर दिया हो.

  • सोर्स से उपयोगकर्ता और उसकी मैनेज की जा रही सभी प्रोफ़ाइलों का डेटा मिलना चाहिए. प्रोफ़ाइल के आधार पर, हर यूज़र इंटरफ़ेस (यूआई) एंट्री का डेटा अलग-अलग हो सकता है.

टेस्ट करना

तो ShadowSafetyCenterManager को ऐक्सेस करके, उसे Robolectric टेस्ट में इस्तेमाल किया जा सकता है.

private static final String MY_SOURCE_ID = "MySourceId";

private final MyClass myClass = …;
private final SafetyCenterManager safetyCenterManager = getApplicationContext().getSystemService(SafetyCenterManager.class);

@Test
public void whenRefreshingData_providesDataToSafetyCenterForMySourceId() {
    shadowOf(safetyCenterManager).setSafetyCenterEnabled(true);
    setupDataForMyClass(…);

    myClass.refreshData();

    SafetySourceData expectedSafetySourceData = …;
    assertThat(safetyCenterManager.getSafetySourceData(MY_SOURCE_ID)).isEqualTo(expectedSafetySourceData);
    SafetyEvent expectedSafetyEvent = …;
    assertThat(shadowOf(safetyCenterManager).getLastSafetyEvent(MY_SOURCE_ID)).isEqualTo(expectedSafetyEvent);
}

एंड-टू-एंड (E2E) टेस्ट के ज़्यादा उदाहरण दिए जा सकते हैं. हालांकि, इस बारे में इस गाइड में नहीं बताया गया है. इन ई2ई टेस्ट को लिखने के बारे में ज़्यादा जानने के लिए, सीटीएस टेस्ट (CtsSafetyCenterTestCases) देखें

टेस्ट और इंटरनल एपीआई

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

अनुमतियां

  • MANAGE_SAFETY_CENTER
    • internal|installer|role
    • आंतरिक सुरक्षा केंद्र API (एपीआई) के लिए इस्तेमाल किया जाता है
    • सिर्फ़ PermissionController और शेल को अनुमति दी गई

सेटिंग ऐप्लिकेशन

Safety Center पर रीडायरेक्ट करना

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

सुरक्षा केंद्र के चालू होने पर:

  • लेगसी निजता एंट्री छिपा दी गई कोड है
  • लेगसी सुरक्षा की एंट्री छिपी हुई है कोड
  • सुरक्षा और निजता से जुड़ी नई एंट्री जोड़ी गई है कोड
  • सुरक्षा और निजता से जुड़ी नई एंट्री, सुरक्षा केंद्र के कोड पर रीडायरेक्ट करती है
  • android.settings.PRIVACY_SETTINGS और android.settings.SECURITY_SETTINGS के लिए, इंटेंट ऐक्शन को सुरक्षा केंद्र (कोड: सुरक्षा, निजता) पर रीडायरेक्ट किया जाता है

सुरक्षा और निजता से जुड़े बेहतर पेज

सेटिंग ऐप्लिकेशन में, सुरक्षा से जुड़ी अन्य सेटिंग और निजता से जुड़ी अन्य सेटिंग में अन्य सेटिंग मौजूद होती हैं. ये सेटिंग, सुरक्षा केंद्र में जाकर देखी जा सकती हैं:

  • बेहतर सुरक्षा कोड

  • ऐडवांस निजता कोड

  • Android 14 से, बेहतर सुरक्षा और निजता की बेहतर सेटिंग वाले पेज को इंटेंट कार्रवाई के साथ एक ही "ज़्यादा सुरक्षा और निजता" पेज में मर्ज कर दिया गया है "com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"

सुरक्षा के सोर्स

सुरक्षा केंद्र, सेटिंग ऐप्लिकेशन से मिले सुरक्षा स्रोतों के खास सेट के साथ काम करता है:

  • लॉक स्क्रीन की सुरक्षा से जुड़ा सोर्स, यह पुष्टि करता है कि लॉक स्क्रीन को पासवर्ड (या अन्य सुरक्षा) के साथ सेट अप किया गया है. इससे यह पक्का होता है कि उपयोगकर्ता की निजी जानकारी को बाहरी ऐक्सेस से सुरक्षित रखा जाए.
  • फ़िंगरप्रिंट या चेहरे के सेंसर के साथ इंटिग्रेट करने के लिए, बायोमेट्रिक सुरक्षा सोर्स (डिफ़ॉल्ट रूप से छिपा होता है) दिखता है.

सुरक्षा केंद्र के इन सोर्स का सोर्स कोड, Android के कोड खोजने की सुविधा की मदद से ऐक्सेस किया जा सकता है. अगर सेटिंग ऐप्लिकेशन में बदलाव नहीं किया गया है (पैकेज के नाम, सोर्स कोड या लॉक स्क्रीन और बायोमेट्रिक्स से जुड़े सोर्स कोड में बदलाव नहीं किया गया है), तो यह इंटिग्रेशन बिना किसी रुकावट के काम करना चाहिए. अगर ऐसा नहीं होता है, तो सेटिंग में कुछ बदलाव करने पड़ सकते हैं. जैसे, सेटिंग ऐप्लिकेशन के पैकेज का नाम, सुरक्षा केंद्र से इंटिग्रेट किए गए सोर्स, और इंटिग्रेशन को बदलने के लिए, कॉन्फ़िगरेशन फ़ाइल में बदलाव करना. ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन फ़ाइल अपडेट करना और इंटिग्रेशन सेटिंग देखें.

PendingIntent के बारे में जानकारी

अगर Android 14 या इसके बाद के वर्शन में, Settings ऐप्लिकेशन के मौजूदा Safety Center इंटिग्रेशन का इस्तेमाल किया जा रहा है, तो यहां बताई गई गड़बड़ी को ठीक कर दिया गया है. इस मामले में, इस सेक्शन को पढ़ना ज़रूरी नहीं है.

अगर आपको लगता है कि गड़बड़ी नहीं है, तो सेटिंग ऐप्लिकेशन में एक्सएमएल बूलियन रिसॉर्स कॉन्फ़िगरेशन वैल्यू को config_isSafetyCenterLockScreenPendingIntentFixed से true पर सेट करें. इससे, Safety Center में मौजूद गड़बड़ी को ठीक करने का तरीका बंद हो जाएगा.

PendingIntent से जुड़ी समस्या हल करने का तरीका

यह गड़बड़ी, सेटिंग में Intent इंस्टेंस एक्सट्रा का इस्तेमाल करने की वजह से होती है. इससे यह तय किया जाता है कि कौनसा फ़्रैगमेंट खोलना है. Intent#equals, Intent इंस्टेंस एक्स्ट्रा पर ध्यान नहीं देता है, इसलिए गियर मेन्यू आइकॉन और एंट्री के लिए PendingIntent इंस्टेंस को बराबर माना जाता है और वे एक ही यूज़र इंटरफ़ेस (यूआई) पर नेविगेट करते हैं (भले ही उनका मकसद किसी दूसरे यूज़र इंटरफ़ेस (यूआई) पर नेविगेट करना हो). अनुरोध कोड के हिसाब से PendingIntent इंस्टेंस को अलग करके, इस समस्या को QPR रिलीज़ में ठीक किया गया है. इसके अलावा, Intent#setId का इस्तेमाल करके, इसे अलग-अलग किया जा सकता है.

सुरक्षा से जुड़े इंटरनल सोर्स

सुरक्षा केंद्र के कुछ सोर्स इंटरनल होते हैं. इन्हें PermissionController मॉड्यूल में, PermissionController सिस्टम ऐप्लिकेशन में लागू किया जाता है. ये सोर्स, सुरक्षा केंद्र के सामान्य सोर्स की तरह काम करते हैं और इनके लिए कोई खास तरह की कार्रवाई नहीं की जाती है. इन सोर्स का कोड, Android कोड सर्च की मदद से उपलब्ध है.

ये मुख्य रूप से निजता सिग्नल होते हैं. उदाहरण के लिए:

  • सुलभता
  • इस्तेमाल नहीं किए जा रहे ऐप्लिकेशन के लिए अनुमतियां अपने-आप वापस लेना
  • जगह की जानकारी का ऐक्सेस
  • सूचना को सुनने की सुविधा
  • काम से जुड़ी नीति की जानकारी