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 - AbstractPreferenceController :
frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java - বেসপ্রেফারেন্স কন্ট্রোলার (অ্যান্ড্রয়েড 9 এ প্রবর্তিত):
packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java
বাস্তবায়ন
ডিভাইস নির্মাতারা বিদ্যমান সেটিংস তথ্য আর্কিটেকচারকে মানিয়ে নিতে এবং অংশীদার-নির্দিষ্ট বৈশিষ্ট্যগুলিকে মিটমাট করার জন্য প্রয়োজনীয় অতিরিক্ত সেটিংস পৃষ্ঠাগুলি সন্নিবেশ করতে উত্সাহিত করা হয়৷ লিগ্যাসি পৃষ্ঠা ( SettingsPreferencePage হিসাবে বাস্তবায়িত) থেকে একটি নতুন পৃষ্ঠায় ( DashboardFragment ব্যবহার করে বাস্তবায়িত) পছন্দগুলি সরানো জটিল হতে পারে৷ লিগ্যাসি পৃষ্ঠার পছন্দ সম্ভবত একটি PreferenceController দিয়ে প্রয়োগ করা হয় না।
তাই একটি লিগ্যাসি পৃষ্ঠা থেকে একটি নতুন পৃষ্ঠায় একটি পছন্দ স্থানান্তর করার সময়, আপনাকে একটি PreferenceController তৈরি করতে হবে এবং নতুন DashboardFragment ইনস্ট্যান্টিয়েট করার আগে কোডটিকে কন্ট্রোলারে সরাতে হবে। PreferenceController যে API গুলি প্রয়োজন সেগুলি তাদের নামে বর্ণনা করা হয়েছে এবং Javadoc-এ নথিভুক্ত করা হয়েছে৷
প্রতিটি PreferenceController জন্য একটি ইউনিট পরীক্ষা যোগ করার জন্য এটি অত্যন্ত বাঞ্ছনীয়। যদি পরিবর্তনটি AOSP-এ জমা দেওয়া হয়, তাহলে একটি ইউনিট পরীক্ষা প্রয়োজন। কিভাবে Roboelectric ভিত্তিক পরীক্ষা লিখতে হয় সে সম্পর্কে আরও তথ্য পেতে, readme ফাইল packages/apps/Settings/tests/robotests/README.md দেখুন।
প্লাগইন-স্টাইল তথ্য আর্কিটেকচার
প্রতিটি সেটিংস আইটেম একটি পছন্দ হিসাবে প্রয়োগ করা হয়. একটি পছন্দ সহজেই এক পৃষ্ঠা থেকে অন্য পৃষ্ঠায় সরানো যেতে পারে।
একাধিক সেটিংসের চারপাশে সরানো সহজ করার জন্য, Android 8.0 একটি প্লাগইন-স্টাইল হোস্ট ফ্র্যাগমেন্ট চালু করেছে যাতে সেটিংস আইটেম রয়েছে। সেটিংস আইটেম প্লাগইন-স্টাইল কন্ট্রোলার হিসাবে মডেল করা হয়. সুতরাং, একটি সেটিংস পৃষ্ঠা একটি একক হোস্ট ফ্র্যাগমেন্ট এবং একাধিক সেটিং কন্ট্রোলার দ্বারা নির্মিত হয়।
ড্যাশবোর্ড ফ্র্যাগমেন্ট
DashboardFragment হল প্লাগইন-স্টাইল প্রেফারেন্স কন্ট্রোলারের হোস্ট। ফ্র্যাগমেন্টটি PreferenceFragment থেকে উত্তরাধিকারসূত্রে প্রাপ্ত এবং স্ট্যাটিক পছন্দ তালিকা এবং গতিশীল পছন্দ তালিকা উভয়ই প্রসারিত ও আপডেট করার জন্য হুক রয়েছে।
স্ট্যাটিক পছন্দ
একটি স্ট্যাটিক পছন্দ তালিকা XML-এ <Preference> ট্যাগ ব্যবহার করে সংজ্ঞায়িত করা হয়। একটি 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>
রেন্ডারের সময়, ফ্র্যাগমেন্টটি AndroidManifest এ সংজ্ঞায়িত স্ট্যাটিক XML এবং গতিশীল সেটিংস উভয় থেকে পছন্দগুলির একটি তালিকা চাইবে। PreferenceController জাভা কোডে বা XML-এ সংজ্ঞায়িত করা হোক না কেন, DashboardFragment PreferenceController মাধ্যমে প্রতিটি সেটিংসের হ্যান্ডলিং লজিক পরিচালনা করে (নীচে আলোচনা করা হয়েছে)। তারপরে তারা UI এ একটি মিশ্র তালিকা হিসাবে প্রদর্শিত হয়।
পছন্দ কন্ট্রোলার
এই বিভাগে বর্ণিত 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 API আছে যেমন getAvailabilityStatus() , displayPreference() , handlePreferenceTreeClicked(), ইত্যাদি। প্রতিটি 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 এর ইন্টারফেসে APIs isAvailable() , displayPreference() , handlePreferenceTreeClicked() ইত্যাদি রয়েছে। প্রতিটি API-এর বিস্তারিত ডকুমেন্টেশন ইন্টারফেস ক্লাসে পাওয়া যাবে।
ফ্র্যাগমেন্টে একটি পছন্দ ইনস্টল করার সময়, ড্যাশবোর্ড প্রদর্শন সময়ের আগে একটি PreferenceController সংযুক্ত করার একটি পদ্ধতি প্রদান করে। ইনস্টল করার সময়, কন্ট্রোলারটি টুকরো পর্যন্ত সংযুক্ত থাকে তাই ভবিষ্যতের সমস্ত প্রাসঙ্গিক ঘটনা নিয়ামকের কাছে পাঠানো হয়।
DashboardFragment স্ক্রিনে PreferenceControllers গুলির একটি তালিকা রাখে। ফ্র্যাগমেন্টের onCreate() এ, সমস্ত কন্ট্রোলারকে isAvailable() পদ্ধতির জন্য আহ্বান করা হয় এবং যদি এটি সত্য হয়, তাহলে displayPreference() ডিসপ্লে লজিক প্রক্রিয়া করার জন্য আহ্বান করা হয়।
ড্যাশবোর্ড ফ্র্যাগমেন্ট ব্যবহার করুন
পৃষ্ঠা A থেকে B তে একটি পছন্দ সরান
যদি পছন্দটি স্থিরভাবে মূল পৃষ্ঠার পছন্দ XML ফাইলে তালিকাভুক্ত করা হয়, তাহলে নীচে আপনার অ্যান্ড্রয়েড রিলিজের জন্য স্ট্যাটিক সরানোর পদ্ধতি অনুসরণ করুন। অন্যথায়, আপনার অ্যান্ড্রয়েড রিলিজের জন্য ডায়নামিক মুভ পদ্ধতি অনুসরণ করুন।
অ্যান্ড্রয়েড 9 এ স্ট্যাটিক মুভ
- আসল পৃষ্ঠা এবং গন্তব্য পৃষ্ঠার জন্য পছন্দের XML ফাইলগুলি খুঁজুন৷ আপনি পৃষ্ঠার
getPreferenceScreenResId()পদ্ধতি থেকে এই তথ্য খুঁজে পেতে পারেন। - মূল পৃষ্ঠার XML থেকে পছন্দ সরান।
- গন্তব্য পৃষ্ঠার XML-এ পছন্দ যোগ করুন।
- মূল পৃষ্ঠার জাভা বাস্তবায়ন থেকে এই পছন্দের জন্য
PreferenceControllerসরান। সাধারণত এটিcreatePreferenceControllers()এ থাকে। নিয়ামক সরাসরি XML এ ঘোষণা করা যেতে পারে।দ্রষ্টব্য : পছন্দের একটি
PreferenceControllerনাও থাকতে পারে। - গন্তব্য পৃষ্ঠার
createPreferenceControllers()এPreferenceControllerইনস্ট্যান্ট করুন। যদি পুরানো পৃষ্ঠায় XML-এPreferenceControllerসংজ্ঞায়িত করা হয়, তাহলে নতুন পৃষ্ঠার জন্যও XML-এ সংজ্ঞায়িত করুন।
অ্যান্ড্রয়েড 9 এ ডায়নামিক মুভ
- কোন বিভাগটি আসল এবং গন্তব্য পৃষ্ঠা হোস্ট করে তা খুঁজুন। আপনি
DashboardFragmentRegistryএই তথ্যটি পেতে পারেন। -
AndroidManifest.xmlফাইলটি খুলুন যাতে আপনার সরানোর জন্য প্রয়োজনীয় সেটিং রয়েছে এবং এই সেটিং প্রতিনিধিত্বকারী কার্যকলাপ এন্ট্রি খুঁজুন৷ -
com.android.settings.categoryএর জন্য কার্যকলাপের মেটাডেটা মান নতুন পৃষ্ঠার বিভাগ কী-তে সেট করুন।
Android 8.x রিলিজে স্ট্যাটিক মুভ
- আসল পৃষ্ঠা এবং গন্তব্য পৃষ্ঠার জন্য পছন্দের XML ফাইলগুলি খুঁজুন৷ আপনি পৃষ্ঠার
- মূল পৃষ্ঠার XML-এ পছন্দ সরান৷
- গন্তব্য পৃষ্ঠার XML-এ অগ্রাধিকার যোগ করুন।
- মূল পৃষ্ঠার জাভা বাস্তবায়নে এই পছন্দের জন্য
PreferenceControllerসরান। সাধারণত এটিgetPreferenceControllers()এ থাকে। - গন্তব্য পৃষ্ঠার
getPreferenceControllers()এPreferenceControllerইনস্ট্যান্ট করুন।
getPreferenceScreenResId() পদ্ধতি থেকে এই তথ্য খুঁজে পেতে পারেন। দ্রষ্টব্য: এটা সম্ভব যে পছন্দের একটি PreferenceController নেই।
Android 8.x রিলিজে ডায়নামিক মুভ
- কোন বিভাগটি আসল এবং গন্তব্য পৃষ্ঠা হোস্ট করে তা খুঁজুন। আপনি
DashboardFragmentRegistryএই তথ্যটি পেতে পারেন। -
AndroidManifest.xmlফাইলটি খুলুন যাতে আপনার সরানোর জন্য প্রয়োজনীয় সেটিং রয়েছে এবং এই সেটিং প্রতিনিধিত্বকারী কার্যকলাপ এন্ট্রি খুঁজুন৷ -
com.android.settings.categoryএর জন্য কার্যকলাপের মেটাডেটা মান পরিবর্তন করুন, নতুন পৃষ্ঠার বিভাগ কী-তে মান পয়েন্ট সেট করুন।
একটি পৃষ্ঠায় একটি নতুন পছন্দ তৈরি করুন
যদি পছন্দটি স্থিরভাবে মূল পৃষ্ঠার পছন্দ XML ফাইলে তালিকাভুক্ত করা হয়, তাহলে নীচের স্ট্যাটিক পদ্ধতি অনুসরণ করুন। অন্যথায় গতিশীল পদ্ধতি অনুসরণ করুন।
একটি স্ট্যাটিক পছন্দ তৈরি করুন
- পৃষ্ঠার জন্য পছন্দ XML ফাইল খুঁজুন. আপনি পৃষ্ঠার getPreferenceScreenResId() পদ্ধতি থেকে এই তথ্যটি খুঁজে পেতে পারেন।
- XML-এ একটি নতুন পছন্দ আইটেম যোগ করুন। নিশ্চিত করুন যে এটিতে একটি অনন্য
android:keyআছে। - পৃষ্ঠার
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"/>
- Android 8.x-এ এবং ঐচ্ছিকভাবে Android 9-এ, পৃষ্ঠার
একটি গতিশীল পছন্দ তৈরি করুন
- কোন বিভাগটি আসল এবং গন্তব্য পৃষ্ঠা হোস্ট করে তা খুঁজুন। আপনি
DashboardFragmentRegistryএই তথ্যটি পেতে পারেন। -
AndroidManifestএ একটি নতুন কার্যকলাপ তৈরি করুন - সেটিং সংজ্ঞায়িত করতে নতুন কার্যকলাপে প্রয়োজনীয় মেটাডেটা যোগ করুন।
com.android.settings.categoryএর মেটাডেটা মান ধাপ 1-এ সংজ্ঞায়িত একই মান সেট করুন।
একটি নতুন পৃষ্ঠা তৈরি করুন
-
DashboardFragmentথেকে উত্তরাধিকারসূত্রে একটি নতুন খণ্ড তৈরি করুন। -
DashboardFragmentRegistryএর বিভাগ নির্ধারণ করুন।দ্রষ্টব্য: এই পদক্ষেপটি ঐচ্ছিক। এই পৃষ্ঠায় আপনার যদি কোনো গতিশীল পছন্দের প্রয়োজন না হয়, তাহলে আপনাকে একটি বিভাগ কী প্রদান করতে হবে না।
- এই পৃষ্ঠার জন্য প্রয়োজনীয় সেটিংস যোগ করার জন্য পদক্ষেপগুলি অনুসরণ করুন৷ আরও তথ্যের জন্য, বাস্তবায়ন বিভাগ দেখুন।
বৈধতা
- সেটিংসে রোবোলেক্ট্রিক পরীক্ষা চালান। সমস্ত বিদ্যমান এবং নতুন পরীক্ষা পাস করা উচিত.
- সেটিংস তৈরি এবং ইনস্টল করুন, তারপর ম্যানুয়ালি পৃষ্ঠাটি খুলুন যা পরিবর্তন করা হচ্ছে। পৃষ্ঠাটি অবিলম্বে আপডেট করা উচিত।