Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce16d7ad authored by Console Chen's avatar Console Chen
Browse files

Adding the ability to customize the subtitle on an unavailable slice

When a slice is depending on some setting and the setting is off,
it shows "depends on another setting".
Add an new attribute for Preference to customize the subtitle when
a slice is unavailable.

Bug: 118399193
Test: Robo test on com.android.settings.slices, com.android.settings.core
Change-Id: I84a8400295b36abb357e5baf98e9be3a8d6ea897
parent e5e94b95
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -72,6 +72,8 @@
        <attr name="platform_slice" format="boolean" />
        <!-- Whether or not dynamic summary text from PreferenceController is allowed when creating slice object, by default it's false. -->
        <attr name="allowDynamicSummaryInSlice" format="boolean" />
        <!-- customized subtitle if it's an unavailable slice -->
        <attr name="unavailableSliceSubtitle" format="string" />
    </declare-styleable>

    <declare-styleable name="PreferenceScreen">
+17 −3
Original line number Diff line number Diff line
@@ -72,9 +72,11 @@ public class PreferenceXmlParserUtils {
            MetadataFlag.FLAG_NEED_PREF_SUMMARY,
            MetadataFlag.FLAG_NEED_PREF_ICON,
            MetadataFlag.FLAG_NEED_SEARCHABLE,
            MetadataFlag.FLAG_ALLOW_DYNAMIC_SUMMARY_IN_SLICE})
            MetadataFlag.FLAG_ALLOW_DYNAMIC_SUMMARY_IN_SLICE,
            MetadataFlag.FLAG_UNAVAILABLE_SLICE_SUBTITLE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface MetadataFlag {

        int FLAG_INCLUDE_PREF_SCREEN = 1;
        int FLAG_NEED_KEY = 1 << 1;
        int FLAG_NEED_PREF_TYPE = 1 << 2;
@@ -87,6 +89,7 @@ public class PreferenceXmlParserUtils {
        int FLAG_NEED_SEARCHABLE = 1 << 9;
        int FLAG_ALLOW_DYNAMIC_SUMMARY_IN_SLICE = 1 << 10;
        int FLAG_NEED_PREF_APPEND = 1 << 11;
        int FLAG_UNAVAILABLE_SLICE_SUBTITLE = 1 << 12;
    }

    public static final String METADATA_PREF_TYPE = "type";
@@ -101,6 +104,8 @@ public class PreferenceXmlParserUtils {
    public static final String METADATA_ALLOW_DYNAMIC_SUMMARY_IN_SLICE =
            "allow_dynamic_summary_in_slice";
    public static final String METADATA_APPEND = "staticPreferenceLocation";
    public static final String METADATA_UNAVAILABLE_SLICE_SUBTITLE =
            "unavailable_slice_subtitle";

    private static final String ENTRIES_SEPARATOR = "|";

@@ -249,6 +254,10 @@ public class PreferenceXmlParserUtils {
                preferenceMetadata.putBoolean(METADATA_APPEND,
                        isAppended(preferenceScreenAttributes));
            }
            if (hasFlag(flags, MetadataFlag.FLAG_UNAVAILABLE_SLICE_SUBTITLE)) {
                preferenceMetadata.putString(METADATA_UNAVAILABLE_SLICE_SUBTITLE,
                        getUnavailableSliceSubtitle(preferenceAttributes));
            }
            metadata.add(preferenceMetadata);

            preferenceAttributes.recycle();
@@ -346,4 +355,9 @@ public class PreferenceXmlParserUtils {
        return styledAttributes.getInt(R.styleable.PreferenceScreen_staticPreferenceLocation,
                PREPEND_VALUE) == APPEND_VALUE;
    }

    private static String getUnavailableSliceSubtitle(TypedArray styledAttributes) {
        return styledAttributes.getString(
                R.styleable.Preference_unavailableSliceSubtitle);
    }
}
 No newline at end of file
+5 −2
Original line number Diff line number Diff line
@@ -425,7 +425,10 @@ public class SliceBuilderUtils {
        final String title = data.getTitle();
        final Set<String> keywords = buildSliceKeywords(data);
        @ColorInt final int color = Utils.getColorAccentDefaultColor(context);
        final CharSequence summary = context.getText(R.string.disabled_dependent_setting_summary);

        final String customSubtitle = data.getUnavailableSliceSubtitle();
        final CharSequence subtitle = !TextUtils.isEmpty(customSubtitle) ? customSubtitle
                : context.getText(R.string.disabled_dependent_setting_summary);
        final IconCompat icon = getSafeIcon(context, data);
        final SliceAction primaryAction = SliceAction.createDeeplink(
                getContentPendingIntent(context, data),
@@ -436,7 +439,7 @@ public class SliceBuilderUtils {
                .addRow(new RowBuilder()
                        .setTitle(title)
                        .setTitleItem(icon, ListBuilder.ICON_IMAGE)
                        .setSubtitle(summary)
                        .setSubtitle(subtitle)
                        .setPrimaryAction(primaryAction))
                .setKeywords(keywords)
                .build();
+15 −1
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ import java.lang.annotation.RetentionPolicy;
 * Note that {@link #mKey} is treated as a primary key for this class and determines equality.
 */
public class SliceData {

    /**
     * Flags indicating the UI type of the Slice.
     */
@@ -76,6 +75,8 @@ public class SliceData {

    private final boolean mIsDynamicSummaryAllowed;

    private final String mUnavailableSliceSubtitle;

    public String getKey() {
        return mKey;
    }
@@ -124,6 +125,10 @@ public class SliceData {
        return mIsDynamicSummaryAllowed;
    }

    public String getUnavailableSliceSubtitle() {
        return mUnavailableSliceSubtitle;
    }

    private SliceData(Builder builder) {
        mKey = builder.mKey;
        mTitle = builder.mTitle;
@@ -137,6 +142,7 @@ public class SliceData {
        mSliceType = builder.mSliceType;
        mIsPlatformDefined = builder.mIsPlatformDefined;
        mIsDynamicSummaryAllowed = builder.mIsDynamicSummaryAllowed;
        mUnavailableSliceSubtitle = builder.mUnavailableSliceSubtitle;
    }

    @Override
@@ -178,6 +184,8 @@ public class SliceData {

        private boolean mIsDynamicSummaryAllowed;

        private String mUnavailableSliceSubtitle;

        public Builder setKey(String key) {
            mKey = key;
            return this;
@@ -238,6 +246,12 @@ public class SliceData {
            return this;
        }

        public Builder setUnavailableSliceSubtitle(
                String unavailableSliceSubtitle) {
            mUnavailableSliceSubtitle = unavailableSliceSubtitle;
            return this;
        }

        public SliceData build() {
            if (TextUtils.isEmpty(mKey)) {
                throw new InvalidSliceDataException("Key cannot be empty");
+7 −3
Original line number Diff line number Diff line
@@ -16,12 +16,12 @@

package com.android.settings.slices;

import static com.android.settings.core.PreferenceXmlParserUtils
        .METADATA_ALLOW_DYNAMIC_SUMMARY_IN_SLICE;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_ALLOW_DYNAMIC_SUMMARY_IN_SLICE;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_CONTROLLER;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_ICON;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEY;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_PLATFORM_SLICE_FLAG;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_UNAVAILABLE_SLICE_SUBTITLE;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_SUMMARY;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_TITLE;

@@ -189,7 +189,8 @@ class SliceDataConverter {
                            | MetadataFlag.FLAG_NEED_PREF_ICON
                            | MetadataFlag.FLAG_NEED_PREF_SUMMARY
                            | MetadataFlag.FLAG_NEED_PLATFORM_SLICE_FLAG
                            | MetadataFlag.FLAG_ALLOW_DYNAMIC_SUMMARY_IN_SLICE);
                            | MetadataFlag.FLAG_ALLOW_DYNAMIC_SUMMARY_IN_SLICE
                            | MetadataFlag.FLAG_UNAVAILABLE_SLICE_SUBTITLE);

            for (Bundle bundle : metadata) {
                // TODO (b/67996923) Non-controller Slices should become intent-only slices.
@@ -208,6 +209,8 @@ class SliceDataConverter {
                final boolean isPlatformSlice = bundle.getBoolean(METADATA_PLATFORM_SLICE_FLAG);
                final boolean isDynamicSummaryAllowed = bundle.getBoolean(
                        METADATA_ALLOW_DYNAMIC_SUMMARY_IN_SLICE);
                final String unavailableSliceSubtitle = bundle.getString(
                        METADATA_UNAVAILABLE_SLICE_SUBTITLE);

                final SliceData xmlSlice = new SliceData.Builder()
                        .setKey(key)
@@ -220,6 +223,7 @@ class SliceDataConverter {
                        .setSliceType(sliceType)
                        .setPlatformDefined(isPlatformSlice)
                        .setDynamicSummaryAllowed(isDynamicSummaryAllowed)
                        .setUnavailableSliceSubtitle(unavailableSliceSubtitle)
                        .build();

                final BasePreferenceController controller =
Loading