Phụ đề ưu tiên

Trong hầu hết trường hợp, việc thêm bản tóm tắt về lựa chọn ưu tiên tương đối đơn giản vì chỉ cần thêm thuộc tính android:summary vào lựa chọn ưu tiên tương ứng bằng tài nguyên chuỗi thích hợp. Tuy nhiên, nếu phụ đề tự động cập nhật thì có thể cần phải có bộ điều khiển tùy chọn tùy chỉnh.

Phụ đề tĩnh

Cách thêm phụ đề tĩnh vào một lựa chọn ưu tiên:

  1. Thêm thuộc tính android:summary vào lựa chọn ưu tiên. Ví dụ: để thêm một cho tuỳ chọn cài đặt màn hình L0, hãy thêm nội dung như sau vào thuộc tính lựa chọn ưu tiên:
    android:summary="@string/display_settings_summary"
    

    Ví dụ: hãy xem xét mẫu mã ưu tiên đầy đủ sau:

    <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"/>
    

Phụ đề động

Phụ đề được chỉ định bằng thuộc tính android:summary ở dạng tĩnh nên không thể cập nhật dựa trên một số điều kiện nhất định. Đối với phụ đề động, bạn cần phải điều chỉnh lựa chọn ưu tiên cho lựa chọn ưu tiên. Ví dụ sau sửa đổi tuỳ chọn vị trí L0 thành có phụ đề cho biết vị trí đang bật hay tắt và nêu rõ số lượng ứng dụng (nếu bật) hiện có quyền truy cập thông tin vị trí.

  1. Xác định các chuỗi mới:
    <!-- 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. Tạo một PreferenceController mới, LocationEntryPreferenceController, để tự động đặt và thay đổi văn bản tóm tắt tuỳ chọn vị trí:
    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;
        }
    }
    

    Đối với bộ điều khiển mẫu này:

    • Nếu thông tin vị trí bị tắt, thì văn bản tóm tắt sẽ được đặt thành Chuỗi location_settings_summary_location_off.
    • Nếu bạn bật dịch vụ vị trí, thì số lượng ứng dụng có quyền truy cập thông tin vị trí sẽ được thêm vào. Trong khi đang tải, chuỗi location_settings_loading_app_permission_stats là hiển thị. Khi dữ liệu được tải, đơn vị kiểm soát đặt bản tóm tắt thành Chuỗi location_settings_summary_location_on chứa số lượng ứng dụng có quyền truy cập được chỉ định.
    • Khi khởi động bộ điều khiển lựa chọn ưu tiên, tay điều khiển sẽ đăng ký dịch vụ nhận và làm mới trạng thái lựa chọn ưu tiên khi trạng thái vị trí thay đổi.
  3. Sửa đổi tệp XML của mảnh để đính kèm bộ điều khiển mới vào lựa chọn ưu tiên có liên quan:
    <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"/>