ترجمات التفضيل

بالنسبة للجزء الأكبر، تعد إضافة ملخصات التفضيلات أمرًا بسيطًا نسبيًا لأنها تتضمن فقط إضافة سمة 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. قم بتعديل ملف XML المجزأ لإرفاق وحدة التحكم الجديدة بالتفضيلات ذات الصلة:
    <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"/>