सबटाइटल की प्राथमिकता

ज़्यादातर मामलों में, प्राथमिकता की खास जानकारी जोड़ना आसान होता है. इसके लिए, आपको सिर्फ़ सही स्ट्रिंग रिसॉर्स के साथ, संबंधित प्राथमिकता में android:summary एट्रिब्यूट जोड़ना होता है. हालांकि, अगर सबटाइटल डाइनैमिक तौर पर अपडेट होने चाहिए, तो कस्टम प्राथमिकता कंट्रोलर की ज़रूरत पड़ सकती है.

स्टैटिक सबटाइटल

किसी प्राथमिकता में स्टैटिक सबटाइटल जोड़ने के लिए:

  1. प्राथमिकता में android:summary एट्रिब्यूट जोड़ें. उदाहरण के लिए, L0 डिसप्ले सेटिंग की प्राथमिकता में खास जानकारी जोड़ने के लिए, प्राथमिकता एट्रिब्यूट में कुछ ऐसा जोड़ें:
    android:summary="@string/display_settings_summary"
    

    उदाहरण के लिए, प्राथमिकता कोड का पूरा सैंपल देखें:

    <Preference
            android:fragment="com.android.car.settings.display.DisplaySettingsFragment"
            android:icon="@drawable/ic_settings_display"
            android:key="@string/pk_display_settings_entry"
            android:title="@string/display_settings"
            android:summary="@string/display_settings_summary"
            settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
    

डाइनैमिक सबटाइटल

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

  1. नई स्ट्रिंग तय करें:
    <!-- Summary for Location settings when location is off [CHAR LIMIT=NONE] -->
        <string name="location_settings_summary_location_off">Off</string>
        <!-- Summary for Location settings when location is on, explaining how many apps have location permission [CHAR LIMIT=NONE]-->
        <plurals name="location_settings_summary_location_on">
            <item quantity="one">On - <xliff:g id="count">%1$d</xliff:g> app has access to location</item>
            <item quantity="other">On - <xliff:g id="count">%1$d</xliff:g> apps have access to location</item>
        </plurals>
        <!-- Location settings, loading the number of apps which have location permission [CHAR LIMIT=30] -->
        <string name="location_settings_loading_app_permission_stats">Loading\u2026</string>
    
  2. जगह की जानकारी की सेटिंग की खास जानकारी वाले टेक्स्ट को डाइनैमिक तौर पर सेट करने और बदलने के लिए, एक नया PreferenceController, LocationEntryPreferenceController बनाएं:
    public class LocationEntryPreferenceController extends PreferenceController<Preference> {
    
        private static final Logger LOG = new Logger(LocationEntryPreferenceController.class);
        private static final IntentFilter INTENT_FILTER_LOCATION_MODE_CHANGED =
                new IntentFilter(LocationManager.MODE_CHANGED_ACTION);
    
        private final Context mContext;
        private final LocationManager mLocationManager;
        /** Total number of apps that have location permissions. */
        private int mNumTotal = -1;
        private int mNumTotalLoading = 0;
        private AtomicInteger mLoadingInProgress = new AtomicInteger(0);
    
        private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                refreshUi();
            }
        };
    
        public LocationEntryPreferenceController(Context context, String preferenceKey,
                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
            super(context, preferenceKey, fragmentController, uxRestrictions);
            mContext = context;
            mLocationManager = (LocationManager) getContext().getSystemService(
                    Service.LOCATION_SERVICE);
        }
    
        @Override
        protected Class<Preference> getPreferenceType() {
            return Preference.class;
        }
    
        @Override
        protected void onStartInternal() {
            getContext().registerReceiver(mReceiver, INTENT_FILTER_LOCATION_MODE_CHANGED);
        }
    
        @Override
        protected void onStopInternal() {
            getContext().unregisterReceiver(mReceiver);
        }
    
        @Override
        protected void updateState(Preference preference) {
            super.updateState(preference);
            updateSummary(preference);
            if (!mLocationManager.isLocationEnabled() || mLoadingInProgress.get() != 0) {
                return;
            }
            mNumTotalLoading = 0;
            // Retrieve a list of users inside the current user profile group.
            List<UserHandle> users = mContext.getSystemService(
                    UserManager.class).getUserProfiles();
            mLoadingInProgress.set(users.size());
            for (UserHandle user : users) {
                Context userContext = createPackageContextAsUser(mContext, user.getIdentifier());
                if (userContext == null) {
                    if (mLoadingInProgress.decrementAndGet() == 0) {
                        setLocationAppCount(preference, mNumTotalLoading);
                    }
                    continue;
                }
                PermissionControllerManager permController =
                        userContext.getSystemService(PermissionControllerManager.class);
                permController.countPermissionApps(
                        Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION),
                        PermissionControllerManager.COUNT_ONLY_WHEN_GRANTED,
                        (numApps) -> {
                            mNumTotalLoading += numApps;
                            if (mLoadingInProgress.decrementAndGet() == 0) {
                                setLocationAppCount(preference, mNumTotalLoading);
                            }
                        }, null);
            }
        }
    
        @VisibleForTesting
        void setLocationAppCount(Preference preference, int numApps) {
            mNumTotal = numApps;
            updateSummary(preference);
        }
    
        private void updateSummary(Preference preference) {
            String summary = "";
            if (mLocationManager.isLocationEnabled()) {
                if (mNumTotal == -1) {
                    summary = mContext.getString(R.string.location_settings_loading_app_permission_stats);
                } else {
                    summary = mContext.getResources().getQuantityString(
                            R.plurals.location_settings_summary_location_on,
                            mNumTotal, mNumTotal);
                }
            } else {
                summary = mContext.getString(R.string.location_settings_summary_location_off);
            }
            preference.setSummary(summary);
        }
    
        private Context createPackageContextAsUser(Context context, int userId) {
            try {
                return context.createPackageContextAsUser(
                        context.getPackageName(), 0 /* flags */, UserHandle.of(userId));
            } catch (PackageManager.NameNotFoundException e) {
                LOG.e("Failed to create user context", e);
            }
            return null;
        }
    }
    

    इस सैंपल कंट्रोलर के लिए:

    • अगर जगह की जानकारी की सुविधा बंद है, तो खास जानकारी वाला टेक्स्ट, location_settings_summary_location_off स्ट्रिंग पर सेट होता है.
    • अगर जगह की जानकारी की सुविधा चालू है, तो उन ऐप्लिकेशन की संख्या जोड़ी जाती है जिनके पास जगह की जानकारी की अनुमति है. यह लोड होने के दौरान, location_settings_loading_app_permission_stats स्ट्रिंग दिखती है. डेटा लोड होने पर, कंट्रोलर location_settings_summary_location_on स्ट्रिंग में खास ऐक्सेस वाले ऐप्लिकेशन की संख्या के साथ खास जानकारी सेट करता है.
    • प्राथमिकता कंट्रोलर शुरू होने पर, कंट्रोलर एक रिसीवर रजिस्टर करता है और जगह की जानकारी की स्थिति बदलने पर, प्राथमिकता की स्थिति को रीफ़्रेश करता है.
  3. नए कंट्रोलर को काम की प्राथमिकता से जोड़ने के लिए, फ़्रैगमेंट एक्सएमएल फ़ाइल में बदलाव करें:
    <Preference
            android:fragment="com.android.car.settings.location.LocationSettingsFragment"
            android:icon="@drawable/ic_settings_location"
            android:key="@string/pk_location_settings_entry"
            android:title="@string/location_settings_title"
            settings:controller="com.android.car.settings.location.LocationEntryPreferenceController"/>