الترجمة المفضّلة

في معظم الأحيان، تكون إضافة ملخّصات الخيارات المفضّلة سهلة نسبيًا، لأنّها تتطلّب فقط إضافة السمة 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. أنشئ عنصر تحكّم جديدًا في الإعدادات المفضّلة، 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.
    • إذا كان الموقع الجغرافي مفعّلاً، تتم إضافة عدد التطبيقات التي حصلت على إذن الوصول إلى الموقع الجغرافي. أثناء loading هذا، يتم عرض سلسلة 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"/>