इन्फ़ॉर्मेशन आर्किटेक्चर

Android 8.0 ने सेटिंग ऐप्लिकेशन के लिए जानकारी का एक नया आर्किटेक्चर पेश किया है. इससे सेटिंग को व्यवस्थित करने के तरीके को आसान बनाया जा सकता है. साथ ही, उपयोगकर्ताओं के लिए अपने Android डिवाइस को पसंद के मुताबिक बनाने के लिए सेटिंग को जल्दी से ढूंढना आसान हो जाता है. Android 9 में कुछ सुधार किए गए हैं, ताकि सेटिंग के ज़्यादा फ़ंक्शन और उन्हें आसानी से लागू किया जा सके.

उदाहरण और सोर्स

फ़िलहाल, सेटिंग के ज़्यादातर पेज नए फ़्रेमवर्क का इस्तेमाल करके लागू किए गए हैं. DisplaySettings एक अच्छा उदाहरण है: packages/apps/Settings/src/com/android/settings/DisplaySettings.java

ज़रूरी कॉम्पोनेंट के लिए फ़ाइल के पाथ नीचे दिए गए हैं:

  • CategoryKey: packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
  • डैशबोर्डफ़्रैगमेंट रजिस्ट्री: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
  • डैशबोर्डफ़्रैगमेंट: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
  • AbstrackPreferenceController: frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
  • BasePreferenceController (Android 9 में शुरू किया गया): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

लागू करने का तरीका

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

इसलिए, प्राथमिकताओं को लेगसी पेज से नए पेज पर ले जाने के लिए, आपको एक PreferenceController बनाना होगा. साथ ही, कोड को नए DashboardFragment में लागू करने से पहले, उसे कंट्रोलर में ले जाना होगा. जिन एपीआई को PreferenceController की ज़रूरत होती है उनके नाम में बताया गया है और Javadoc में दस्तावेज़ दिया गया है.

हमारा सुझाव है कि आप हर PreferenceController के लिए यूनिट टेस्ट जोड़ें. अगर बदलाव एओएसपी को सबमिट किया जाता है, तो यूनिट टेस्ट की ज़रूरत होती है. Robolectric पर आधारित टेस्ट लिखने के तरीके के बारे में ज़्यादा जानकारी के लिए, readme फ़ाइल packages/apps/Settings/tests/robotests/README.md देखें.

प्लग इन स्टाइल का इन्फ़ॉर्मेशन आर्किटेक्चर

हर सेटिंग आइटम को प्राथमिकता के तौर पर लागू किया जाता है. प्राथमिकता को आसानी से एक पेज से दूसरे पेज पर ले जाया जा सकता है.

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

डैशबोर्ड फ़्रैगमेंट

DashboardFragment, प्लग इन-स्टाइल प्राथमिकता कंट्रोलर का होस्ट है. फ़्रैगमेंट, PreferenceFragment से इनहेरिट किया जाता है. इसमें, स्टैटिक प्राथमिकता की सूचियों और डाइनैमिक प्राथमिकता सूचियों, दोनों को बड़ा और अपडेट करने के हुक होते हैं.

स्टैटिक प्राथमिकताएं

एक्सएमएल में <Preference> टैग का इस्तेमाल करके, प्राथमिकता की स्टैटिक सूची तय की जाती है. DashboardFragment लागू करने की प्रोसेस में, getPreferenceScreenResId() तरीके का इस्तेमाल करके यह तय किया जाता है कि किस एक्सएमएल फ़ाइल में, दिखाई जाने वाली प्राथमिकताओं की स्टैटिक सूची शामिल है.

डाइनैमिक प्राथमिकताएं

डाइनैमिक आइटम, इंटेंट वाली टाइल को दिखाता है. इससे कोई बाहरी या अंदरूनी गतिविधि होती है. आम तौर पर, इंटेंट किसी दूसरे सेटिंग पेज पर ले जाता है. उदाहरण के लिए, सेटिंग के होम पेज पर मौजूद "Google" सेटिंग आइटम एक डाइनैमिक आइटम है. डाइनैमिक आइटम की जानकारी AndroidManifest (नीचे बताई गई है) में दी गई है. साथ ही, ये DashboardFeatureProvider के तौर पर बताए गए FeatureProvider की मदद से लोड की जाती हैं.

डाइनैमिक सेटिंग, स्टैटिक तरीके से कॉन्फ़िगर की गई सेटिंग की तुलना में ज़्यादा भारी होती हैं. इसलिए, आम तौर पर डेवलपर को इस सेटिंग को स्टैटिक के रूप में लागू करना चाहिए. हालांकि, डाइनैमिक सेटिंग तब काम आ सकती है, जब इनमें से कोई एक बात सही हो:

  • यह सेटिंग, सीधे तौर पर Settings ऐप्लिकेशन में लागू नहीं होती है. जैसे, OEM/मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन से लागू की गई सेटिंग को इंजेक्ट करना.
  • सेटिंग, 'सेटिंग' के होम पेज पर दिखनी चाहिए.
  • आपके पास सेटिंग के लिए पहले से ही एक ऐक्टिविटी है और अतिरिक्त स्टैटिक कॉन्फ़िगरेशन को लागू नहीं करना है.

किसी ऐक्टिविटी को डाइनैमिक सेटिंग के तौर पर कॉन्फ़िगर करने के लिए, ये काम करें:

  • गतिविधि में इंटेंट फ़िल्टर जोड़कर, गतिविधि को डाइनैमिक सेटिंग के तौर पर मार्क करें.
  • सेटिंग ऐप्लिकेशन को बताएं कि यह किस कैटगरी से जुड़ा है. कैटगरी एक कॉन्सटेंट है, जिसके बारे में CategoryKey में बताया गया है.
  • ज़रूरी नहीं: सेटिंग दिखने पर, खास जानकारी वाला टेक्स्ट जोड़ें.

यहां DisplaySettings के लिए सेटिंग ऐप्लिकेशन से लिया गया एक उदाहरण दिया गया है.

<activity android:name="Settings$DisplaySettingsActivity"
                   android:label="@string/display_settings"
                   android:icon="@drawable/ic_settings_display">
             <!-- Mark the activity as a dynamic setting -->
              <intent-filter>
                     <action android:name="com.android.settings.action.IA_SETTINGS" />
              </intent-filter>
             <!-- Tell Settings app which category it belongs to -->
              <meta-data android:name="com.android.settings.category"
                     android:value="com.android.settings.category.ia.homepage" />
             <!-- Add a summary text when the setting is displayed -->
              <meta-data android:name="com.android.settings.summary"
                     android:resource="@string/display_dashboard_summary"/>
             </activity>

रेंडर करते समय, फ़्रैगमेंट AndroidManifest में तय की गई स्टैटिक एक्सएमएल और डाइनैमिक सेटिंग, दोनों की प्राथमिकताओं की सूची मांगेगा. चाहे PreferenceController को Java कोड में बताया गया हो या एक्सएमएल में, DashboardFragment हर सेटिंग के हैंडलिंग लॉजिक को PreferenceController की मदद से मैनेज करता है. इसके बारे में नीचे बताया गया है. इसके बाद, उन्हें यूज़र इंटरफ़ेस (यूआई) में मिला-जुला सूची के तौर पर दिखाया जाता है.

प्राथमिकता नियंत्रक

जैसा कि इस सेक्शन में बताया गया है, Android 9 और Android 8.x में PreferenceController लागू करने के बीच कुछ अंतर होते हैं.

Android 9 की रिलीज़ में PreferenceController

PreferenceController में प्राथमिकता के साथ इंटरैक्ट करने के लिए सभी लॉजिक शामिल होते हैं. जैसे, पेज को दिखाना, अपडेट करना, खोज इंडेक्स करना वगैरह.

PreferenceController का इंटरफ़ेस, BasePreferenceController के तौर पर बताया गया है. उदाहरण के लिए, packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java में कोड देखें

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

BasePreferenceController में getAvailabilityStatus(), displayPreference(), handlePreferenceTreeClicked(), वगैरह जैसे एपीआई मौजूद हैं. हर एपीआई की ज़्यादा जानकारी देने वाला दस्तावेज़ इंटरफ़ेस क्लास में होता है.

BasePreferenceController (और इसकी सब-क्लास, जैसे कि TogglePreferenceController) को लागू करने पर पाबंदी यह है कि कंस्ट्रक्टर के हस्ताक्षर, इनमें से किसी एक से मैच होने चाहिए:

  • public MyController(Context context, String key) {}
  • public MyController(Context context) {}

फ़्रैगमेंट के लिए प्राथमिकता इंस्टॉल करते समय, डैशबोर्ड पर डिसप्ले टाइम से पहले PreferenceController जोड़ने का तरीका दिया जाता है. इंस्टॉल के समय, कंट्रोलर को फ़्रैगमेंट से कनेक्ट किया जाता है, ताकि आने वाले समय में होने वाले सभी इवेंट, कंट्रोलर को भेजे जाएं.

DashboardFragment, स्क्रीन पर PreferenceController की सूची सेव रखता है. फ़्रैगमेंट के onCreate() पर, getAvailabilityStatus() तरीके के लिए सभी कंट्रोलर इस्तेमाल किए जाते हैं. अगर इस तरीके से सही नतीजे मिलते हैं, तो डिसप्ले लॉजिक को प्रोसेस करने के लिए displayPreference() को शुरू किया जाता है. getAvailabilityStatus() की मदद से सेटिंग फ़्रेमवर्क को बताना भी ज़रूरी है कि खोज के दौरान कौनसे आइटम उपलब्ध हैं.

Android 8.x रिलीज़ में PreferenceController

PreferenceController में प्राथमिकता के साथ इंटरैक्ट करने के लिए सभी लॉजिक शामिल होते हैं. जैसे, पेज को दिखाना, अपडेट करना, और खोज को इंडेक्स करना वगैरह.

प्राथमिकता वाले इंटरैक्शन के हिसाब से, PreferenceController के इंटरफ़ेस में एपीआई isAvailable(), displayPreference(), handlePreferenceTreeClicked() वगैरह शामिल हैं. हर एपीआई से जुड़े ज़्यादा जानकारी वाले दस्तावेज़, इंटरफ़ेस क्लास में मिल सकते हैं.

फ़्रैगमेंट के लिए प्राथमिकता इंस्टॉल करते समय, डैशबोर्ड पर डिसप्ले टाइम से पहले PreferenceController जोड़ने का तरीका दिया जाता है. इंस्टॉल के समय, कंट्रोलर को फ़्रैगमेंट से कनेक्ट किया जाता है, ताकि आने वाले समय में होने वाले सभी इवेंट, कंट्रोलर को भेजे जाएं.

DashboardFragment, स्क्रीन पर PreferenceControllers की सूची बनाए रखता है. फ़्रैगमेंट के onCreate() पर, isAvailable() तरीके के लिए सभी कंट्रोलर इस्तेमाल किए जाते हैं. अगर इसके सही नतीजे मिलते हैं, तो डिसप्ले लॉजिक को प्रोसेस करने के लिए displayPreference() को शुरू किया जाता है.

डैशबोर्ड फ़्रैगमेंट का इस्तेमाल करें

प्राथमिकता को पेज A से B पर ले जाएं

अगर प्राथमिकता को मूल पेज की प्राथमिकता वाली एक्सएमएल फ़ाइल में स्टैटिक रूप से लिस्ट किया गया है, तो अपनी Android रिलीज़ के लिए, नीचे दी गई स्टैटिक ट्रांसफ़र प्रोसेस का पालन करें. अगर ऐसा नहीं है, तो अपने Android डिवाइस की रिलीज़ के लिए, डाइनैमिक मूव प्रोसेस का पालन करें.

Android 9 में स्टैटिक मूव

  1. मूल पेज और डेस्टिनेशन पेज के लिए, प्राथमिकता वाली एक्सएमएल फ़ाइलें ढूंढें. आपको यह जानकारी, पेज के getPreferenceScreenResId() तरीके से मिल सकती है.
  2. मूल पेज की एक्सएमएल से प्राथमिकता हटाएं.
  3. प्राथमिकता को डेस्टिनेशन पेज के एक्सएमएल में जोड़ें.
  4. ओरिजनल पेज के Java लागू करने के तरीके से, इस प्राथमिकता के लिए PreferenceController को हटाएं. आम तौर पर, यह createPreferenceControllers() में होता है. कंट्रोलर का एलान सीधे एक्सएमएल में किया जा सकता है.

    ध्यान दें: हो सकता है कि प्राथमिकता में PreferenceController न हो.

  5. डेस्टिनेशन पेज के createPreferenceControllers() में PreferenceController को इंस्टैंशिएट करें. अगर पुराने पेज पर, एक्सएमएल में PreferenceController की जानकारी दी गई है, तो नए पेज के लिए भी एक्सएमएल में इसकी जानकारी दें.

Android 9 में डाइनैमिक मूव करना

  1. देखें कि मूल पेज और डेस्टिनेशन पेज पर किस कैटगरी को होस्ट किया जाता है. आपको यह जानकारी DashboardFragmentRegistry में मिलेगी.
  2. वह AndroidManifest.xml फ़ाइल खोलें जिसमें वह सेटिंग मौजूद है जिसे आपको ले जाना है. इसके बाद, इस सेटिंग की जानकारी देने वाली ऐक्टिविटी एंट्री ढूंढें.
  3. com.android.settings.category के लिए गतिविधि की मेटाडेटा वैल्यू को नए पेज की कैटगरी कुंजी पर सेट करें.

Android 8.x रिलीज़ में स्टैटिक मूवमेंट

  1. मूल पेज और डेस्टिनेशन पेज के लिए प्राथमिकता एक्सएमएल फ़ाइलें ढूंढें.
  2. आपको यह जानकारी, पेज के getPreferenceScreenResId() तरीके से मिल सकती है.
  3. मूल पेज की एक्सएमएल में से प्राथमिकता हटाएं.
  4. प्राथमिकता को गंतव्य पेज के एक्सएमएल में जोड़ें.
  5. ओरिजनल पेज के Java लागू करने के तरीके में, इस प्राथमिकता के लिए PreferenceController को हटाएं. आम तौर पर, यह getPreferenceControllers() में होता है.
  6. ध्यान दें: यह मुमकिन है कि पसंद में कोई PreferenceController न हो.

  7. डेस्टिनेशन पेज के getPreferenceControllers() में PreferenceController को इंस्टैंशिएट करें.

Android 8.x रिलीज़ में डाइनैमिक मूव करना

  1. देखें कि मूल पेज और डेस्टिनेशन पेज पर किस कैटगरी को होस्ट किया जाता है. आपको यह जानकारी DashboardFragmentRegistry में मिलेगी.
  2. वह AndroidManifest.xml फ़ाइल खोलें जिसमें वह सेटिंग मौजूद है जिसे आपको ले जाना है. इसके बाद, इस सेटिंग की जानकारी देने वाली ऐक्टिविटी एंट्री ढूंढें.
  3. com.android.settings.category के लिए गतिविधि की मेटाडेटा वैल्यू बदलें और वैल्यू पॉइंट को नए पेज की कैटगरी की कुंजी पर सेट करें.

पेज में नई प्राथमिकता बनाएं

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

स्टैटिक प्राथमिकता बनाएं

  1. पेज के लिए, अपनी पसंद की एक्सएमएल फ़ाइलें ढूंढें. यह जानकारी आपको पेज के getPreferenceScreenResId() तरीके से मिल सकती है.
  2. एक्सएमएल में एक नया प्राथमिकता आइटम जोड़ें. पक्का करें कि उसका android:key यूनीक हो.
  3. इस प्राथमिकता के लिए, पेज के getPreferenceControllers() तरीके में जाकर, PreferenceController तय करें.
    • Android 8.x में और विकल्प के तौर पर Android 9 में, पेज के createPreferenceControllers() वाले तरीके में इस प्राथमिकता के लिए PreferenceController को शुरू करें.

      अगर यह प्राथमिकता पहले से ही दूसरी जगहों पर मौजूद है, तो हो सकता है कि इसके लिए पहले से ही PreferenceController मौजूद हो. कोई भी नया आईडी बनाए बिना PreferenceController का फिर से इस्तेमाल किया जा सकता है.

    • Android 9 से, एक्सएमएल में, प्राथमिकता के आगे PreferenceController का एलान करने का विकल्प चुना जा सकता है. उदाहरण के लिए:
      <Preference
              android:key="reset_dashboard"
              android:title="@string/reset_dashboard_title"
              settings:controller="com.android.settings.system.ResetPreferenceController"/>
      

डाइनैमिक प्राथमिकता बनाएं

  1. देखें कि मूल पेज और डेस्टिनेशन पेज पर किस कैटगरी को होस्ट किया जाता है. आपको यह जानकारी DashboardFragmentRegistry में मिलेगी.
  2. AndroidManifest में कोई नई गतिविधि बनाएं
  3. सेटिंग तय करने के लिए, नई ऐक्टिविटी में ज़रूरी मेटाडेटा जोड़ें. com.android.settings.category के लिए मेटाडेटा वैल्यू को वही वैल्यू पर सेट करें जो पहले चरण में तय की गई है.

एक नया पेज बनाएं

  1. DashboardFragment से लिया गया नया फ़्रैगमेंट बनाएं.
  2. DashboardFragmentRegistry में इसकी कैटगरी तय करें.

    ध्यान दें: यह चरण ज़रूरी नहीं है. अगर आपको इस पेज में कोई डाइनैमिक प्राथमिकता नहीं चाहिए, तो आपको कैटगरी कुंजी देने की ज़रूरत नहीं है.

  3. इस पेज के लिए ज़रूरी सेटिंग जोड़ने के लिए, यह तरीका अपनाएं. ज़्यादा जानकारी के लिए, लागू करना सेक्शन देखें.

पुष्टि करें

  • सेटिंग में जाकर, रोबोलेक्टिक टेस्ट करें. सभी मौजूदा और नए टेस्ट पास होने चाहिए.
  • सेटिंग बनाएं और इंस्टॉल करें. इसके बाद, जिस पेज में बदलाव किया जा रहा है उसे मैन्युअल तरीके से खोलें. पेज तुरंत अपडेट हो जाना चाहिए.