diff --git a/res/values/attrs.xml b/res/values/attrs.xml index a88d6f6ec57..b2d5468f854 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -72,6 +72,8 @@ + + diff --git a/src/com/android/settings/core/PreferenceXmlParserUtils.java b/src/com/android/settings/core/PreferenceXmlParserUtils.java index ce5c5051f5a..db6cd41f9bc 100644 --- a/src/com/android/settings/core/PreferenceXmlParserUtils.java +++ b/src/com/android/settings/core/PreferenceXmlParserUtils.java @@ -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(); @@ -344,6 +353,11 @@ public class PreferenceXmlParserUtils { private static boolean isAppended(TypedArray styledAttributes) { return styledAttributes.getInt(R.styleable.PreferenceScreen_staticPreferenceLocation, - PREPEND_VALUE) == APPEND_VALUE; + PREPEND_VALUE) == APPEND_VALUE; } -} + + private static String getUnavailableSliceSubtitle(TypedArray styledAttributes) { + return styledAttributes.getString( + R.styleable.Preference_unavailableSliceSubtitle); + } +} \ No newline at end of file diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java index b2b8310d1c8..925306e7a5e 100644 --- a/src/com/android/settings/slices/SliceBuilderUtils.java +++ b/src/com/android/settings/slices/SliceBuilderUtils.java @@ -425,7 +425,10 @@ public class SliceBuilderUtils { final String title = data.getTitle(); final Set 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(); diff --git a/src/com/android/settings/slices/SliceData.java b/src/com/android/settings/slices/SliceData.java index 87058847f3c..9d52d56a8ae 100644 --- a/src/com/android/settings/slices/SliceData.java +++ b/src/com/android/settings/slices/SliceData.java @@ -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"); diff --git a/src/com/android/settings/slices/SliceDataConverter.java b/src/com/android/settings/slices/SliceDataConverter.java index cb2980d6442..dcc80898ca8 100644 --- a/src/com/android/settings/slices/SliceDataConverter.java +++ b/src/com/android/settings/slices/SliceDataConverter.java @@ -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 = diff --git a/src/com/android/settings/slices/SlicesDatabaseAccessor.java b/src/com/android/settings/slices/SlicesDatabaseAccessor.java index c75f3ef10c0..ae77dd2a9b9 100644 --- a/src/com/android/settings/slices/SlicesDatabaseAccessor.java +++ b/src/com/android/settings/slices/SlicesDatabaseAccessor.java @@ -50,6 +50,7 @@ public class SlicesDatabaseAccessor { IndexColumns.PLATFORM_SLICE, IndexColumns.SLICE_TYPE, IndexColumns.ALLOW_DYNAMIC_SUMMARY_IN_SLICE, + IndexColumns.UNAVAILABLE_SLICE_SUBTITLE, }; // Cursor value for boolean true @@ -167,6 +168,8 @@ public class SlicesDatabaseAccessor { cursor.getColumnIndex(IndexColumns.ALLOW_DYNAMIC_SUMMARY_IN_SLICE)) == TRUE; int sliceType = cursor.getInt( cursor.getColumnIndex(IndexColumns.SLICE_TYPE)); + final String unavailableSliceSubtitle = cursor.getString( + cursor.getColumnIndex(IndexColumns.UNAVAILABLE_SLICE_SUBTITLE)); if (isIntentOnly) { sliceType = SliceData.SliceType.INTENT; @@ -185,6 +188,7 @@ public class SlicesDatabaseAccessor { .setPlatformDefined(isPlatformDefined) .setSliceType(sliceType) .setDynamicSummaryAllowed(isDynamicSummaryAllowed) + .setUnavailableSliceSubtitle(unavailableSliceSubtitle) .build(); } diff --git a/src/com/android/settings/slices/SlicesDatabaseHelper.java b/src/com/android/settings/slices/SlicesDatabaseHelper.java index e4630992657..8dc86fb7996 100644 --- a/src/com/android/settings/slices/SlicesDatabaseHelper.java +++ b/src/com/android/settings/slices/SlicesDatabaseHelper.java @@ -36,7 +36,7 @@ public class SlicesDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "slices_index.db"; private static final String SHARED_PREFS_TAG = "slices_shared_prefs"; - private static final int DATABASE_VERSION = 3; + private static final int DATABASE_VERSION = 4; public interface Tables { String TABLE_SLICES_INDEX = "slices_index"; @@ -99,6 +99,11 @@ public class SlicesDatabaseHelper extends SQLiteOpenHelper { * preference controller. */ String ALLOW_DYNAMIC_SUMMARY_IN_SLICE = "allow_dynamic_summary_in_slice"; + + /** + * Customized subtitle if it's a unavailable slice + */ + String UNAVAILABLE_SLICE_SUBTITLE = "unavailable_slice_subtitle"; } private static final String CREATE_SLICES_TABLE = @@ -125,6 +130,8 @@ public class SlicesDatabaseHelper extends SQLiteOpenHelper { IndexColumns.SLICE_TYPE + ", " + IndexColumns.ALLOW_DYNAMIC_SUMMARY_IN_SLICE + + ", " + + IndexColumns.UNAVAILABLE_SLICE_SUBTITLE + ");"; private final Context mContext; @@ -151,7 +158,7 @@ public class SlicesDatabaseHelper extends SQLiteOpenHelper { @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < DATABASE_VERSION) { - Log.d(TAG, "Reconstructing DB from " + oldVersion + "to " + newVersion); + Log.d(TAG, "Reconstructing DB from " + oldVersion + " to " + newVersion); reconstruct(db); } } diff --git a/src/com/android/settings/slices/SlicesIndexer.java b/src/com/android/settings/slices/SlicesIndexer.java index 0c39429ccfc..ec2be2922de 100644 --- a/src/com/android/settings/slices/SlicesIndexer.java +++ b/src/com/android/settings/slices/SlicesIndexer.java @@ -113,6 +113,8 @@ class SlicesIndexer implements Runnable { values.put(IndexColumns.SLICE_TYPE, dataRow.getSliceType()); values.put(IndexColumns.ALLOW_DYNAMIC_SUMMARY_IN_SLICE, dataRow.isDynamicSummaryAllowed()); + values.put(IndexColumns.UNAVAILABLE_SLICE_SUBTITLE, + dataRow.getUnavailableSliceSubtitle()); database.replaceOrThrow(Tables.TABLE_SLICES_INDEX, null /* nullColumnHack */, values); diff --git a/tests/robotests/res/xml-mcc999/location_settings.xml b/tests/robotests/res/xml-mcc999/location_settings.xml index 91e4c4130bd..a25f36d0437 100644 --- a/tests/robotests/res/xml-mcc999/location_settings.xml +++ b/tests/robotests/res/xml-mcc999/location_settings.xml @@ -27,6 +27,7 @@ settings:controller="com.android.settings.slices.FakePreferenceController" settings:keywords="a, b, c" settings:platform_slice="true" - settings:allowDynamicSummaryInSlice="true"/> + settings:allowDynamicSummaryInSlice="true" + settings:unavailableSliceSubtitle="subtitleOfUnavailableSlice"/> \ No newline at end of file diff --git a/tests/robotests/res/xml-mcc999/night_display_settings.xml b/tests/robotests/res/xml-mcc999/night_display_settings.xml new file mode 100644 index 00000000000..c23a2cfd7f2 --- /dev/null +++ b/tests/robotests/res/xml-mcc999/night_display_settings.xml @@ -0,0 +1,43 @@ + + + + + + + + + + \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java b/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java index 9627a489c54..b8051a19e2d 100644 --- a/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java +++ b/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java @@ -16,12 +16,12 @@ package com.android.settings.core; -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_APPEND; import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEY; import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEYWORDS; import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_SEARCHABLE; +import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_UNAVAILABLE_SLICE_SUBTITLE; import static com.google.common.truth.Truth.assertThat; @@ -35,7 +35,6 @@ import android.util.Xml; import com.android.settings.R; import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag; -import java.util.Objects; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,6 +46,7 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.List; +import java.util.Objects; /** * These tests use a series of preferences that have specific attributes which are sometimes @@ -320,7 +320,7 @@ public class PreferenceXmlParserUtilsTest { @Test @Config(qualifiers = "mcc999") public void extractMetadata_requestAppendProperty_shouldDefaultToFalse() - throws Exception { + throws Exception { final List metadata = PreferenceXmlParserUtils.extractMetadata(mContext, R.xml.display_settings, MetadataFlag.FLAG_INCLUDE_PREF_SCREEN | MetadataFlag.FLAG_NEED_PREF_APPEND); @@ -333,7 +333,7 @@ public class PreferenceXmlParserUtilsTest { @Test @Config(qualifiers = "mcc999") public void extractMetadata_requestAppendProperty_shouldReturnCorrectValue() - throws Exception { + throws Exception { final List metadata = PreferenceXmlParserUtils.extractMetadata(mContext, R.xml.battery_saver_schedule_settings, MetadataFlag.FLAG_INCLUDE_PREF_SCREEN | MetadataFlag.FLAG_NEED_PREF_APPEND); @@ -343,6 +343,46 @@ public class PreferenceXmlParserUtilsTest { } } + @Test + @Config(qualifiers = "mcc999") + public void extractMetadata_requestUnavailableSliceSubtitle_shouldDefaultNull() + throws Exception { + final List metadata = PreferenceXmlParserUtils.extractMetadata(mContext, + R.xml.night_display_settings, + MetadataFlag.FLAG_NEED_KEY | MetadataFlag.FLAG_UNAVAILABLE_SLICE_SUBTITLE); + + boolean bundleWithKey1Found = false; + for (Bundle bundle : metadata) { + if (bundle.getString(METADATA_KEY).equals("key1")) { + assertThat(bundle.getString(METADATA_UNAVAILABLE_SLICE_SUBTITLE)).isNull(); + bundleWithKey1Found = true; + break; + } + } + assertThat(bundleWithKey1Found).isTrue(); + } + + @Test + @Config(qualifiers = "mcc999") + public void extractMetadata_requestUnavailableSliceSubtitle_shouldReturnAttributeValue() + throws Exception { + final String expectedSubtitle = "subtitleOfUnavailable"; + final List metadata = PreferenceXmlParserUtils.extractMetadata(mContext, + R.xml.night_display_settings, + MetadataFlag.FLAG_NEED_KEY | MetadataFlag.FLAG_UNAVAILABLE_SLICE_SUBTITLE); + + boolean bundleWithKey2Found = false; + for (Bundle bundle : metadata) { + if (bundle.getString(METADATA_KEY).equals("key2")) { + assertThat(bundle.getString(METADATA_UNAVAILABLE_SLICE_SUBTITLE)).isEqualTo( + expectedSubtitle); + bundleWithKey2Found = true; + break; + } + } + assertThat(bundleWithKey2Found).isTrue(); + } + /** * @param resId the ID for the XML preference * @return an XML resource parser that points to the start tag diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java index 2d893a67836..c2d1e938229 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java @@ -449,7 +449,7 @@ public class SliceBuilderUtilsTest { R.drawable.ic_settings).toIcon().getResId(); final SliceData data = getDummyData(FakeUnavailablePreferenceController.class, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE, 0 /* icon */, - IS_DYNAMIC_SUMMARY_ALLOWED); + IS_DYNAMIC_SUMMARY_ALLOWED, null /* unavailableSliceSubtitle */); Settings.Global.putInt(mContext.getContentResolver(), FakeUnavailablePreferenceController.AVAILABILITY_KEY, BasePreferenceController.DISABLED_DEPENDENT_SETTING); @@ -518,33 +518,65 @@ public class SliceBuilderUtilsTest { assertThat(actualIconResource).isEqualTo(settingsIcon); } + @Test + public void buildUnavailableSlice_customizeSubtitle_returnsSliceWithCustomizedSubtitle() { + final String subtitleOfUnavailableSlice = "subtitleOfUnavailableSlice"; + final SliceData data = getDummyData(FakeUnavailablePreferenceController.class, + SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE, 0 /* icon */, + IS_DYNAMIC_SUMMARY_ALLOWED, subtitleOfUnavailableSlice); + Settings.Global.putInt(mContext.getContentResolver(), + FakeUnavailablePreferenceController.AVAILABILITY_KEY, + BasePreferenceController.DISABLED_DEPENDENT_SETTING); + + final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); + + final SliceMetadata metadata = SliceMetadata.from(mContext, slice); + assertThat(metadata.getSubtitle()).isEqualTo(subtitleOfUnavailableSlice); + } + + @Test + public void buildUnavailableSlice_notCustomizeSubtitle_returnsSliceWithDefaultSubtitle() { + final SliceData data = getDummyData(FakeUnavailablePreferenceController.class, + SliceData.SliceType.SWITCH); + Settings.Global.putInt(mContext.getContentResolver(), + FakeUnavailablePreferenceController.AVAILABILITY_KEY, + BasePreferenceController.DISABLED_DEPENDENT_SETTING); + + final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); + + final SliceMetadata metadata = SliceMetadata.from(mContext, slice); + assertThat(metadata.getSubtitle()).isEqualTo( + mContext.getString(R.string.disabled_dependent_setting_summary)); + } + private SliceData getDummyData() { return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE, - ICON, IS_DYNAMIC_SUMMARY_ALLOWED); + ICON, IS_DYNAMIC_SUMMARY_ALLOWED, null /* unavailableSliceSubtitle */); } private SliceData getDummyData(boolean isDynamicSummaryAllowed) { return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE, - ICON, isDynamicSummaryAllowed); + ICON, isDynamicSummaryAllowed, null /* unavailableSliceSubtitle */); } private SliceData getDummyData(Class prefController, int sliceType, int icon) { - return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE, - icon, IS_DYNAMIC_SUMMARY_ALLOWED); + return getDummyData(prefController, SUMMARY, sliceType, SCREEN_TITLE, + icon, IS_DYNAMIC_SUMMARY_ALLOWED, null /* unavailableSliceSubtitle */); } private SliceData getDummyData(String summary, String screenTitle) { return getDummyData(TOGGLE_CONTROLLER, summary, SliceData.SliceType.SWITCH, screenTitle, - ICON, IS_DYNAMIC_SUMMARY_ALLOWED); + ICON, IS_DYNAMIC_SUMMARY_ALLOWED, null /* unavailableSliceSubtitle */); } private SliceData getDummyData(Class prefController, int sliceType) { return getDummyData(prefController, SUMMARY, sliceType, SCREEN_TITLE, ICON, - IS_DYNAMIC_SUMMARY_ALLOWED); + IS_DYNAMIC_SUMMARY_ALLOWED, null /* unavailableSliceSubtitle */); } private SliceData getDummyData(Class prefController, String summary, int sliceType, - String screenTitle, int icon, boolean isDynamicSummaryAllowed) { + String screenTitle, int icon, boolean isDynamicSummaryAllowed, + String unavailableSliceSubtitle) { return new SliceData.Builder() .setKey(KEY) .setTitle(TITLE) @@ -557,6 +589,7 @@ public class SliceBuilderUtilsTest { .setPreferenceControllerClassName(prefController.getName()) .setSliceType(sliceType) .setDynamicSummaryAllowed(isDynamicSummaryAllowed) + .setUnavailableSliceSubtitle(unavailableSliceSubtitle) .build(); } } diff --git a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java index b935e762c14..7c1319c0bb0 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java @@ -125,6 +125,8 @@ public class SliceDataConverterTest { assertThat(fakeSlice.getSliceType()).isEqualTo(SliceData.SliceType.SLIDER); assertThat(fakeSlice.isPlatformDefined()).isTrue(); // from XML assertThat(fakeSlice.isDynamicSummaryAllowed()).isTrue(); // from XML + assertThat(fakeSlice.getUnavailableSliceSubtitle()).isEqualTo( + "subtitleOfUnavailableSlice"); // from XML } private void assertFakeA11ySlice(SliceData fakeSlice) { diff --git a/tests/robotests/src/com/android/settings/slices/SliceDataTest.java b/tests/robotests/src/com/android/settings/slices/SliceDataTest.java index 579af1fbee0..b6c7af5499a 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceDataTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceDataTest.java @@ -39,6 +39,7 @@ public class SliceDataTest { private final int SLICE_TYPE = SliceData.SliceType.SWITCH; private final boolean IS_PLATFORM_DEFINED = true; private final boolean IS_DYNAMIC_SUMMARY_ALLOWED = true; + private final String UNAVAILABLE_SLICE_SUBTITLE = "subtitleOfUnavailableSlice"; @Test public void testBuilder_buildsMatchingObject() { @@ -54,7 +55,8 @@ public class SliceDataTest { .setPreferenceControllerClassName(PREF_CONTROLLER) .setSliceType(SLICE_TYPE) .setPlatformDefined(IS_PLATFORM_DEFINED) - .setDynamicSummaryAllowed(IS_DYNAMIC_SUMMARY_ALLOWED); + .setDynamicSummaryAllowed(IS_DYNAMIC_SUMMARY_ALLOWED) + .setUnavailableSliceSubtitle(UNAVAILABLE_SLICE_SUBTITLE); SliceData data = builder.build(); @@ -70,6 +72,7 @@ public class SliceDataTest { assertThat(data.getSliceType()).isEqualTo(SLICE_TYPE); assertThat(data.isPlatformDefined()).isEqualTo(IS_PLATFORM_DEFINED); assertThat(data.isDynamicSummaryAllowed()).isEqualTo(IS_DYNAMIC_SUMMARY_ALLOWED); + assertThat(data.getUnavailableSliceSubtitle()).isEqualTo(UNAVAILABLE_SLICE_SUBTITLE); } @Test(expected = SliceData.InvalidSliceDataException.class) diff --git a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java index f4b68a57781..a657ede7b92 100644 --- a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java +++ b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java @@ -109,12 +109,14 @@ public class SlicesDatabaseAccessorTest { assertThat(data.getUri()).isNull(); assertThat(data.getPreferenceController()).isEqualTo(FAKE_CONTROLLER_NAME); assertThat(data.isDynamicSummaryAllowed()).isFalse(); /* default value */ + assertThat(data.getUnavailableSliceSubtitle()).isNull(); } @Test public void testGetSliceDataFromKey_allowDynamicSummary_validSliceReturned() { String key = "key"; - insertSpecialCase(key, true /* isPlatformSlice */, true /* isDynamicSummaryAllowed */); + insertSpecialCase(key, true /* isPlatformSlice */, true /* isDynamicSummaryAllowed */, + null /* customizedUnavailableSliceSubtitle */); SliceData data = mAccessor.getSliceDataFromKey(key); @@ -133,7 +135,8 @@ public class SlicesDatabaseAccessorTest { @Test public void testGetSliceDataFromKey_doNotAllowDynamicSummary_validSliceReturned() { String key = "key"; - insertSpecialCase(key, true /* isPlatformSlice */, false /* isDynamicSummaryAllowed */); + insertSpecialCase(key, true /* isPlatformSlice */, false /* isDynamicSummaryAllowed */, + null /* customizedUnavailableSliceSubtitle */); SliceData data = mAccessor.getSliceDataFromKey(key); @@ -243,16 +246,58 @@ public class SlicesDatabaseAccessorTest { assertThat(keys).isNotEmpty(); } + @Test + public void testGetSliceDataFromKey_defaultUnavailableSlice_validSliceReturned() { + String key = "key"; + insertSpecialCase(key, true /* isPlatformSlice */, true /* isDynamicSummaryAllowed */, + null /* customizedUnavailableSliceSubtitle */); + + SliceData data = mAccessor.getSliceDataFromKey(key); + + assertThat(data.getKey()).isEqualTo(key); + assertThat(data.getTitle()).isEqualTo(FAKE_TITLE); + assertThat(data.getSummary()).isEqualTo(FAKE_SUMMARY); + assertThat(data.getScreenTitle()).isEqualTo(FAKE_SCREEN_TITLE); + assertThat(data.getKeywords()).isEqualTo(FAKE_KEYWORDS); + assertThat(data.getIconResource()).isEqualTo(FAKE_ICON); + assertThat(data.getFragmentClassName()).isEqualTo(FAKE_FRAGMENT_NAME); + assertThat(data.getUri()).isNull(); + assertThat(data.getPreferenceController()).isEqualTo(FAKE_CONTROLLER_NAME); + assertThat(data.getUnavailableSliceSubtitle()).isNull(); + } + + @Test + public void testGetSliceDataFromKey_customizeSubtitleOfUnavailableSlice_validSliceReturned() { + String key = "key"; + String subtitle = "subtitle"; + insertSpecialCase(key, true /* isPlatformSlice */, true /* isDynamicSummaryAllowed */, + subtitle); + + SliceData data = mAccessor.getSliceDataFromKey(key); + + assertThat(data.getKey()).isEqualTo(key); + assertThat(data.getTitle()).isEqualTo(FAKE_TITLE); + assertThat(data.getSummary()).isEqualTo(FAKE_SUMMARY); + assertThat(data.getScreenTitle()).isEqualTo(FAKE_SCREEN_TITLE); + assertThat(data.getKeywords()).isEqualTo(FAKE_KEYWORDS); + assertThat(data.getIconResource()).isEqualTo(FAKE_ICON); + assertThat(data.getFragmentClassName()).isEqualTo(FAKE_FRAGMENT_NAME); + assertThat(data.getUri()).isNull(); + assertThat(data.getPreferenceController()).isEqualTo(FAKE_CONTROLLER_NAME); + assertThat(data.getUnavailableSliceSubtitle()).isEqualTo(subtitle); + } + private void insertSpecialCase(String key) { insertSpecialCase(key, true); } private void insertSpecialCase(String key, boolean isPlatformSlice) { - insertSpecialCase(key, isPlatformSlice, false /* isDynamicSummaryAllowed */); + insertSpecialCase(key, isPlatformSlice, false /* isDynamicSummaryAllowed */, + null /*customizedUnavailableSliceSubtitle*/); } private void insertSpecialCase(String key, boolean isPlatformSlice, - boolean isDynamicSummaryAllowed) { + boolean isDynamicSummaryAllowed, String customizedUnavailableSliceSubtitle) { ContentValues values = new ContentValues(); values.put(SlicesDatabaseHelper.IndexColumns.KEY, key); values.put(SlicesDatabaseHelper.IndexColumns.TITLE, FAKE_TITLE); @@ -266,6 +311,8 @@ public class SlicesDatabaseAccessorTest { values.put(SlicesDatabaseHelper.IndexColumns.ALLOW_DYNAMIC_SUMMARY_IN_SLICE, isDynamicSummaryAllowed); values.put(SlicesDatabaseHelper.IndexColumns.SLICE_TYPE, SliceData.SliceType.INTENT); + values.put(SlicesDatabaseHelper.IndexColumns.UNAVAILABLE_SLICE_SUBTITLE, + customizedUnavailableSliceSubtitle); mDb.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values); } diff --git a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseHelperTest.java b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseHelperTest.java index 2bc344312eb..0e92c05c9cb 100644 --- a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseHelperTest.java +++ b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseHelperTest.java @@ -74,6 +74,7 @@ public class SlicesDatabaseHelperTest { IndexColumns.PLATFORM_SLICE, IndexColumns.SLICE_TYPE, IndexColumns.ALLOW_DYNAMIC_SUMMARY_IN_SLICE, + IndexColumns.UNAVAILABLE_SLICE_SUBTITLE, }; assertThat(columnNames).isEqualTo(expectedNames); diff --git a/tests/robotests/src/com/android/settings/slices/SlicesIndexerTest.java b/tests/robotests/src/com/android/settings/slices/SlicesIndexerTest.java index 827c3f66b3a..b63dfd923c2 100644 --- a/tests/robotests/src/com/android/settings/slices/SlicesIndexerTest.java +++ b/tests/robotests/src/com/android/settings/slices/SlicesIndexerTest.java @@ -55,6 +55,7 @@ public class SlicesIndexerTest { private final boolean PLATFORM_DEFINED = true; private final boolean IS_DYNAMIC_SUMMARY_ALLOWED = true; private final int SLICE_TYPE = SliceData.SliceType.SLIDER; + private final String UNAVAILABLE_SLICE_SUBTITLE = "subtitleOfUnavailableSlice"; private Context mContext; @@ -145,6 +146,9 @@ public class SlicesIndexerTest { cursor.getColumnIndex( IndexColumns.ALLOW_DYNAMIC_SUMMARY_IN_SLICE))) .isEqualTo(1 /* true */); + assertThat(cursor.getString( + cursor.getColumnIndex(IndexColumns.UNAVAILABLE_SLICE_SUBTITLE))) + .isEqualTo(UNAVAILABLE_SLICE_SUBTITLE); cursor.moveToNext(); } } finally { @@ -179,7 +183,8 @@ public class SlicesIndexerTest { .setPreferenceControllerClassName(PREF_CONTROLLER) .setPlatformDefined(PLATFORM_DEFINED) .setSliceType(SLICE_TYPE) - .setDynamicSummaryAllowed(IS_DYNAMIC_SUMMARY_ALLOWED); + .setDynamicSummaryAllowed(IS_DYNAMIC_SUMMARY_ALLOWED) + .setUnavailableSliceSubtitle(UNAVAILABLE_SLICE_SUBTITLE); for (int i = 0; i < KEYS.length; i++) { builder.setKey(KEYS[i]).setTitle(TITLES[i]);