তথ্য স্থাপত্য

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
  • DashboardFragmentRegistry: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
  • DashboardFragment: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
  • AbstractPreferenceController: 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-এর জন্য প্রয়োজনীয় API-এর বিবরণ তাদের নামে এবং Javadoc-এ ডকুমেন্ট করা আছে।

প্রতিটি PreferenceController-এর জন্য ইউনিট টেস্ট যোগ করার সাজেশন দেওয়া হয়। পরিবর্তন AOSP-তে জমা দেওয়া হলে, ইউনিট টেস্ট করতে হবে। Robolectric-এর উপর ভিত্তি করে কীভাবে পরীক্ষা লিখতে হয় সেই সম্পর্কে আরও তথ্য পেতে, readme ফাইল packages/apps/Settings/tests/robotests/README.md দেখুন।

প্লাগ-ইন স্টাইলের তথ্য স্থাপত্য

প্রতিটি সেটিংস আইটেম পছন্দ হিসেবে প্রয়োগ করা হয়। একটি পছন্দ সহজেই এক পৃষ্ঠা থেকে অন্য পৃষ্ঠায় সরানো যেতে পারে।

একাধিক সেটিংসকে সহজে এক জায়গা থেকে অন্য জায়গায় সরানোর জন্য, Android 8.0-তে প্লাগ-ইন স্টাইলের হোস্ট ফ্র্যাগমেন্ট যোগ করা হয়েছে, যার মধ্যে সেটিংস আইটেম থাকে। সেটিংস আইটেমগুলি প্লাগ-ইন-স্টাইল কন্ট্রোলার হিসাবে মডেল করা হয়। তাই, একটি সেটিংস পৃষ্ঠা একটি সিঙ্গেল হোস্ট ফ্র্যাগমেন্ট এবং একাধিক সেটিং কন্ট্রোলার দ্বারা তৈরি করা হয়।

DashboardFragment

DashboardFragment হল প্লাগ-ইন স্টাইলের পছন্দ কন্ট্রোলারের হোস্ট। ফ্র্যাগমেন্টটি PreferenceFragment থেকে ইনহেরিট করে এবং এতে স্ট্যাটিক ও ডায়নামিক পছন্দ তালিকা উভয়ই বড় ও আপডেট করার হুক থাকে।

স্ট্যাটিক পছন্দ

<Preference> ট্যাগ ব্যবহার করে XML-এ স্ট্যাটিক প্রেফারেন্স তালিকা সংজ্ঞায়িত করা হয়। A DashboardFragment ইমপ্লিমেন্টেশন getPreferenceScreenResId() পদ্ধতি ব্যবহার করে এটি নির্ধারণ করে যে কোন XML ফাইলে দেখানোর জন্য পছন্দের স্ট্যাটিক তালিকা আছে।

ডায়নামিক পছন্দ

ডায়নামিক আইটেম হল এমন একটি টাইল যাতে ইন্টেন্ট থাকে এবং যা এক্সটার্নাল বা ইন্টার্নাল অ্যাক্টিভিটির দিকে নিয়ে যায়। সাধারণত, ইনটেন্ট অন্য একটি সেটিংস পৃষ্ঠায় নিয়ে যায়। যেমন, সেটিংস হোমপেজে "Google" সেটিংস আইটেমটি একটি ডায়নামিক আইটেম। ডায়নামিক আইটেম AndroidManifest-এ (নিচে আলোচনা করা হয়েছে) সংজ্ঞায়িত করা হয়েছে এবং FeatureProvider-এর ( DashboardFeatureProvider হিসেবে সংজ্ঞায়িত) মাধ্যমে লোড করা হয়েছে।

ডায়নামিক সেটিংস, স্ট্যাটিক কনফিগার করা সেটিংসের চেয়ে বেশি হেভিওয়েট হয়, তাই সাধারণত ডেভেলপারদের সেটিংসকে স্ট্যাটিক হিসেবে প্রয়োগ করা উচিত। তবে, নিম্নলিখিত যেকোনও একটি শর্ত পূরণ হলে ডায়নামিক সেটিং উপযোগী হতে পারে:

  • সেটিং সরাসরি সেটিংস অ্যাপে প্রয়োগ করা হয় না (যেমন 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>

রেন্ডার করার সময়, ফ্র্যাগমেন্টটি স্ট্যাটিক XML ও AndroidManifest-এ সংজ্ঞায়িত ডায়নামিক সেটিংস, এই দু'টি জায়গা থেকেই পছন্দের তালিকার জন্য অনুরোধ করবে। Java কোড বা XML-এ PreferenceControllers সংজ্ঞায়িত করা হোক না কেন, DashboardFragment প্রতিটি সেটিংয়ের হ্যান্ডেলিং লজিক PreferenceController-এর মাধ্যমে ম্যানেজ করে (নিচে আলোচনা করা হয়েছে)। তারপর সেগুলি UI-তে একটি মিশ্র তালিকা হিসেবে দেখানো হয়।

PreferenceController

এই বিভাগে বর্ণনা করা হয়েছে যে Android 9 এবং Android 8.x-এ PreferenceController ইমপ্লিমেন্ট করার মধ্যে পার্থক্য রয়েছে।

Android 9 রিলিজে PreferenceController

PreferenceController-এ পছন্দমতো সেটিংসের সাথে ইন্টার‍্যাক্ট করার জন্য প্রয়োজনীয় সব লজিক থাকে, এর মধ্যে ডিসপ্লে করা, আপডেট করা, সার্চ ইন্ডেক্সিং ইত্যাদি অন্তর্ভুক্ত।

PreferenceController-এর ইন্টারফেসকে BasePreferenceController হিসেবে সংজ্ঞায়িত করা হয়। যেমন, এখানে কোড দেখুন packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java

BasePreferenceController-এর একাধিক সাবক্লাস আছে, প্রতিটি নির্দিষ্ট UI স্টাইলের সাথে ম্যাপ করা থাকে যা সেটিংস অ্যাপ ডিফল্ট হিসেবে সাপোর্ট করে। যেমন, TogglePreferenceController-এর এমন API আছে যা টগল-ভিত্তিক পছন্দ UI-এর সাথে ব্যবহারকারীকে কীভাবে ইন্টার‍্যাক্ট করতে হবে তা সরাসরি ম্যাপ করে।

BasePreferenceController-এ getAvailabilityStatus(), displayPreference(), handlePreferenceTreeClicked(), ইত্যাদির মতো API আছে। প্রতিটি API-এর বিস্তারিত ডকুমেন্টেশন ইন্টারফেস ক্লাসে আছে।

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-এর ইন্টারফেসে API isAvailable(), displayPreference(), handlePreferenceTreeClicked() ইত্যাদি আছে। প্রতিটি API-এর বিস্তারিত ডকুমেন্টেশন ইন্টারফেস ক্লাসে পাওয়া যাবে।

ফ্র্যাগমেন্টে কোনও পছন্দ ইনস্টল করার সময়, ড্যাশবোর্ড দেখানোর সময়ের আগে PreferenceController অ্যাটাচ করার একটি পদ্ধতি প্রদান করে। ইনস্টল করার সময়, কন্ট্রোলার ফ্র্যাগমেন্টের সাথে ওয়্যার আপ করা হয় যাতে ভবিষ্যতে প্রাসঙ্গিক সব ইভেন্ট কন্ট্রোলারে পাঠানো হয়।

DashboardFragment স্ক্রিনে PreferenceControllers -এর তালিকা রাখে। ফ্র্যাগমেন্টের onCreate()-এ, isAvailable() পদ্ধতির জন্য সব কন্ট্রোলারকে আহ্বান করা হয় এবং এটি সত্য রিটার্ন করলে, ডিসপ্লে লজিক প্রসেস করার জন্য displayPreference()-কে আহ্বান করা হয়।

DashboardFragment ব্যবহার করুন

পৃষ্ঠা A থেকে B-তে কোনও পছন্দ সরানো

পছন্দটি আসল পৃষ্ঠার পছন্দ XML ফাইলে স্ট্যাটিক্যালি তালিকাভুক্ত থাকলে, আপনার Android রিলিজের জন্য নিচে দেওয়া স্ট্যাটিক সরানোর পদ্ধতি অনুসরণ করুন। অন্যথায়, আপনার Android রিলিজের জন্য ডায়নামিক মুভ প্রসিডিওর ফলো করুন।

Android 9-এ স্ট্যাটিক মুভ

  1. আসল পৃষ্ঠা ও গন্তব্য পৃষ্ঠার জন্য পছন্দ সম্পর্কিত XML ফাইল খুঁজুন। আপনি এই তথ্য পৃষ্ঠার getPreferenceScreenResId() পদ্ধতি থেকে পেতে পারেন।
  2. আসল পৃষ্ঠার XML থেকে পছন্দ সরিয়ে দিন।
  3. গন্তব্য পৃষ্ঠার XML-এ পছন্দ যোগ করুন।
  4. মূল পৃষ্ঠার জাভা ইমপ্লিমেন্টেশন থেকে এই পছন্দের জন্য PreferenceController সরান। এটি সাধারণত createPreferenceControllers()-এ থাকে। কন্ট্রোলার সরাসরি XML-এ ঘোষণা করা হতে পারে।

    মনে রাখবেন: পছন্দে হয়ত PreferenceController নেই।

  5. গন্তব্য পৃষ্ঠার createPreferenceControllers()-এ PreferenceController ইনস্ট্যান্টিয়েট করুন। পুরনো পৃষ্ঠার XML-এ PreferenceController সংজ্ঞায়িত করা থাকলে, নতুন পৃষ্ঠার XML-এও এটি সংজ্ঞায়িত করুন।

Android 9-এ ডায়নামিক মুভ

  1. মূল ও গন্তব্য পৃষ্ঠা কোন বিভাগে হোস্ট করা হয়েছে তা খুঁজে দেখুন। আপনি DashboardFragmentRegistry-এ এই তথ্য খুঁজে পাবেন।
  2. যে AndroidManifest.xml ফাইলে আপনার সরানোর প্রয়োজন এমন সেটিংস আছে সেটি খুলুন এবং এই সেটিংসের প্রতিনিধিত্বকারী অ্যাক্টিভিটি এন্ট্রি খুঁজুন।
  3. com.android.settings.category-এর জন্য অ্যাক্টিভিটির মেটাডেটা ভ্যালু নতুন পৃষ্ঠার বিভাগ কী-তে সেট করুন।

Android 8.x রিলিজের ক্ষেত্রে স্ট্যাটিক মুভমেন্ট

  1. মূল পৃষ্ঠা ও গন্তব্য পৃষ্ঠার জন্য পছন্দ XML ফাইল খুঁজুন।
  2. আপনি পৃষ্ঠার getPreferenceScreenResId() পদ্ধতি থেকে এই তথ্য খুঁজে পেতে পারেন।
  3. মূল পৃষ্ঠার XML থেকে পছন্দ সরিয়ে দিন।
  4. গন্তব্য পৃষ্ঠার XML-এ পছন্দ যোগ করুন।
  5. এই পছন্দের জন্য PreferenceController সরিয়ে দিন আসল পৃষ্ঠার জাভা ইমপ্লিমেন্টেশনে। সাধারণত এটি getPreferenceControllers()-এ থাকে।
  6. মনে রাখবেন: এমন হতে পারে যে পছন্দের মধ্যে PreferenceController নেই।

  7. ডেস্টিনেশন পৃষ্ঠার PreferenceController getPreferenceControllers()-এ ইনস্ট্যানশিয়েট করুন।

Android 8.x রিলিজের ডায়নামিক মুভ

  1. মূল ও গন্তব্য পৃষ্ঠা কোন বিভাগে হোস্ট করা হয়েছে তা খুঁজে দেখুন। আপনি DashboardFragmentRegistry-এ এই তথ্য পাবেন।
  2. যে AndroidManifest.xml ফাইলে আপনার সরানোর প্রয়োজন এমন সেটিংস আছে সেটি খুলুন এবং এই সেটিংসের প্রতিনিধিত্বকারী অ্যাক্টিভিটি এন্ট্রি খুঁজুন।
  3. com.android.settings.category-এর জন্য অ্যাক্টিভিটির মেটাডেটা ভ্যালু পরিবর্তন করুন, নতুন পৃষ্ঠার ক্যাটেগরি কী-তে ভ্যালু পয়েন্ট সেট করুন।

পৃষ্ঠায় নতুন পছন্দ তৈরি করা

মূল পৃষ্ঠার পছন্দ XML ফাইলে পছন্দ স্ট্যাটিকভাবে তালিকাভুক্ত করা থাকলে, নিচে দেওয়া স্ট্যাটিক পদ্ধতি অনুসরণ করুন। অন্যথায়, ডায়নামিক পদ্ধতি অনুসরণ করুন।

স্ট্যাটিক পছন্দ তৈরি করা

  1. পৃষ্ঠার জন্য পছন্দ XML ফাইল খুঁজুন। আপনি এই তথ্য পৃষ্ঠার getPreferenceScreenResId() পদ্ধতি থেকে পেতে পারেন।
  2. XML-এ নতুন পছন্দ আইটেম যোগ করুন। সেটিতে একটি অনন্য android:key আছে কিনা তা নিশ্চিত করুন।
  3. পৃষ্ঠার getPreferenceControllers() পদ্ধতিতে এই পছন্দের জন্য একটি PreferenceController নির্ধারণ করুন।
    • Android 8.x-এ এবং ঐচ্ছিকভাবে Android 9-এ, পৃষ্ঠার createPreferenceControllers() পদ্ধতিতে এই পছন্দের জন্য একটি PreferenceController ইনস্ট্যানশিয়েট করুন।

      এই পছন্দ আগে থেকেই অন্য কোথাও থাকলে, এটির জন্য আগে থেকেই PreferenceController থাকতে পারে। আপনি নতুন PreferenceController তৈরি না করেই সেটি আবার ব্যবহার করতে পারবেন।

    • Android 9 থেকে শুরু করে, আপনি পছন্দসই বিকল্পের পাশে XML-এ 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. এই পৃষ্ঠার জন্য প্রয়োজনীয় সেটিংস যোগ করার ধাপগুলি অনুসরণ করুন। আরও তথ্যের জন্য, প্রয়োগ করা বিভাগ দেখুন।

যাচাইকরণ

  • সেটিংস থেকে রোবোইলেকট্রিক পরীক্ষা চালান। আগে থেকে থাকা ও নতুন সব টেস্টে উত্তীর্ণ হতে হবে।
  • সেটিংস তৈরি ও ইনস্টল করুন, তারপর যে পৃষ্ঠাটি পরিবর্তন করা হচ্ছে সেটি ম্যানুয়ালি খুলুন। পৃষ্ঠাটি সঙ্গে সঙ্গে আপডেট হয়ে যাওয়া উচিত।