From c7cd6c46712f06d65c43c028969474c4b026ed4a Mon Sep 17 00:00:00 2001 From: Yi-Ling Chuang Date: Mon, 18 Nov 2019 16:39:02 +0800 Subject: [PATCH] Add a new column for slices_index table. To distinguish public and non-public slices, add public_slice column to the database so we can return corresponding results based on this value. Bug: 141088937 Test: robotests Change-Id: I05d003875a8be27e5cb735b4814eb86d6dc40174 --- .../android/settings/slices/SliceData.java | 14 +++++ .../settings/slices/SliceDataConverter.java | 2 + .../settings/slices/SlicesDatabaseHelper.java | 13 ++++- .../settings/slices/SlicesIndexer.java | 1 + .../slices/FakePreferenceController.java | 5 ++ .../slices/SliceDataConverterTest.java | 1 + .../settings/slices/SliceDataTest.java | 4 +- .../slices/SlicesDatabaseHelperTest.java | 1 + .../settings/slices/SlicesIndexerTest.java | 57 ++++++++++++++++++- 9 files changed, 93 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/slices/SliceData.java b/src/com/android/settings/slices/SliceData.java index 0f3a678256c..60f5e3fb840 100644 --- a/src/com/android/settings/slices/SliceData.java +++ b/src/com/android/settings/slices/SliceData.java @@ -73,6 +73,8 @@ public class SliceData { private final String mUnavailableSliceSubtitle; + private final boolean mIsPublicSlice; + public String getKey() { return mKey; } @@ -117,6 +119,10 @@ public class SliceData { return mUnavailableSliceSubtitle; } + public boolean isPublicSlice() { + return mIsPublicSlice; + } + private SliceData(Builder builder) { mKey = builder.mKey; mTitle = builder.mTitle; @@ -129,6 +135,7 @@ public class SliceData { mPreferenceController = builder.mPrefControllerClassName; mSliceType = builder.mSliceType; mUnavailableSliceSubtitle = builder.mUnavailableSliceSubtitle; + mIsPublicSlice = builder.mIsPublicSlice; } @Override @@ -168,6 +175,8 @@ public class SliceData { private String mUnavailableSliceSubtitle; + private boolean mIsPublicSlice; + public Builder setKey(String key) { mKey = key; return this; @@ -224,6 +233,11 @@ public class SliceData { return this; } + public Builder setIsPublicSlice(boolean isPublicSlice) { + mIsPublicSlice = isPublicSlice; + 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 551a18672c8..5608169a4db 100644 --- a/src/com/android/settings/slices/SliceDataConverter.java +++ b/src/com/android/settings/slices/SliceDataConverter.java @@ -212,6 +212,7 @@ class SliceDataConverter { final int sliceType = controller.getSliceType(); final String unavailableSliceSubtitle = bundle.getString( METADATA_UNAVAILABLE_SLICE_SUBTITLE); + final boolean isPublicSlice = controller.isPublicSlice(); final SliceData xmlSlice = new SliceData.Builder() .setKey(key) @@ -224,6 +225,7 @@ class SliceDataConverter { .setFragmentName(fragmentName) .setSliceType(sliceType) .setUnavailableSliceSubtitle(unavailableSliceSubtitle) + .setIsPublicSlice(isPublicSlice) .build(); xmlSliceData.add(xmlSlice); diff --git a/src/com/android/settings/slices/SlicesDatabaseHelper.java b/src/com/android/settings/slices/SlicesDatabaseHelper.java index 6c13ef9ec76..fe4420b26b0 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 = 7; + private static final int DATABASE_VERSION = 8; public interface Tables { String TABLE_SLICES_INDEX = "slices_index"; @@ -98,6 +98,11 @@ public class SlicesDatabaseHelper extends SQLiteOpenHelper { * The uri of slice. */ String SLICE_URI = "slice_uri"; + + /** + * Whether the slice should be exposed publicly. + */ + String PUBLIC_SLICE = "public_slice"; } private static final String CREATE_SLICES_TABLE = @@ -124,6 +129,12 @@ public class SlicesDatabaseHelper extends SQLiteOpenHelper { IndexColumns.SLICE_TYPE + ", " + IndexColumns.UNAVAILABLE_SLICE_SUBTITLE + + ", " + + + IndexColumns.PUBLIC_SLICE + + + " INTEGER DEFAULT 0 " + + ");"; private final Context mContext; diff --git a/src/com/android/settings/slices/SlicesIndexer.java b/src/com/android/settings/slices/SlicesIndexer.java index 7b49b4bde9a..3a68a322853 100644 --- a/src/com/android/settings/slices/SlicesIndexer.java +++ b/src/com/android/settings/slices/SlicesIndexer.java @@ -112,6 +112,7 @@ class SlicesIndexer implements Runnable { values.put(IndexColumns.SLICE_TYPE, dataRow.getSliceType()); values.put(IndexColumns.UNAVAILABLE_SLICE_SUBTITLE, dataRow.getUnavailableSliceSubtitle()); + values.put(IndexColumns.PUBLIC_SLICE, dataRow.isPublicSlice()); database.replaceOrThrow(Tables.TABLE_SLICES_INDEX, null /* nullColumnHack */, values); diff --git a/tests/robotests/src/com/android/settings/slices/FakePreferenceController.java b/tests/robotests/src/com/android/settings/slices/FakePreferenceController.java index 3e4da200a26..fc4ebc86dcb 100644 --- a/tests/robotests/src/com/android/settings/slices/FakePreferenceController.java +++ b/tests/robotests/src/com/android/settings/slices/FakePreferenceController.java @@ -41,6 +41,11 @@ public class FakePreferenceController extends BasePreferenceController { return true; } + @Override + public boolean isPublicSlice() { + return true; + } + @Override public boolean useDynamicSliceSummary() { return true; diff --git a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java index 3ce964ce556..0c654a46b06 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java @@ -128,6 +128,7 @@ public class SliceDataConverterTest { assertThat(fakeSlice.getSliceType()).isEqualTo(SliceData.SliceType.SLIDER); assertThat(fakeSlice.getUnavailableSliceSubtitle()).isEqualTo( "subtitleOfUnavailableSlice"); // from XML + assertThat(fakeSlice.isPublicSlice()).isTrue(); } 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 6074fe384a1..fa3f8b985c5 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceDataTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceDataTest.java @@ -52,7 +52,8 @@ public class SliceDataTest { .setUri(URI) .setPreferenceControllerClassName(PREF_CONTROLLER) .setSliceType(SLICE_TYPE) - .setUnavailableSliceSubtitle(UNAVAILABLE_SLICE_SUBTITLE); + .setUnavailableSliceSubtitle(UNAVAILABLE_SLICE_SUBTITLE) + .setIsPublicSlice(true); SliceData data = builder.build(); @@ -67,6 +68,7 @@ public class SliceDataTest { assertThat(data.getPreferenceController()).isEqualTo(PREF_CONTROLLER); assertThat(data.getSliceType()).isEqualTo(SLICE_TYPE); assertThat(data.getUnavailableSliceSubtitle()).isEqualTo(UNAVAILABLE_SLICE_SUBTITLE); + assertThat(data.isPublicSlice()).isEqualTo(true); } @Test(expected = SliceData.InvalidSliceDataException.class) diff --git a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseHelperTest.java b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseHelperTest.java index fad9c25ee92..65214fc0861 100644 --- a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseHelperTest.java +++ b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseHelperTest.java @@ -75,6 +75,7 @@ public class SlicesDatabaseHelperTest { IndexColumns.CONTROLLER, IndexColumns.SLICE_TYPE, IndexColumns.UNAVAILABLE_SLICE_SUBTITLE, + IndexColumns.PUBLIC_SLICE }; 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 1501e45a697..3cb68c01682 100644 --- a/tests/robotests/src/com/android/settings/slices/SlicesIndexerTest.java +++ b/tests/robotests/src/com/android/settings/slices/SlicesIndexerTest.java @@ -105,8 +105,8 @@ public class SlicesIndexerTest { } @Test - public void testInsertSliceData_mockDataInserted() { - final List sliceData = getDummyIndexableData(); + public void testInsertSliceData_nonPublicSlice_mockDataInserted() { + final List sliceData = getDummyIndexableData(false); doReturn(sliceData).when(mManager).getSliceData(); mManager.run(); @@ -140,6 +140,53 @@ public class SlicesIndexerTest { assertThat(cursor.getString( cursor.getColumnIndex(IndexColumns.UNAVAILABLE_SLICE_SUBTITLE))) .isEqualTo(UNAVAILABLE_SLICE_SUBTITLE); + assertThat(cursor.getInt( + cursor.getColumnIndex(IndexColumns.PUBLIC_SLICE))).isEqualTo(0); + cursor.moveToNext(); + } + } finally { + db.close(); + } + } + + @Test + public void insertSliceData_publicSlice_mockDataInserted() { + final List sliceData = getDummyIndexableData(true); + doReturn(sliceData).when(mManager).getSliceData(); + + mManager.run(); + + final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase(); + try (Cursor cursor = db.rawQuery("SELECT * FROM slices_index", null)) { + assertThat(cursor.getCount()).isEqualTo(sliceData.size()); + + cursor.moveToFirst(); + for (int i = 0; i < sliceData.size(); i++) { + assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY))) + .isEqualTo(KEYS[i]); + assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE))) + .isEqualTo(TITLES[i]); + assertThat( + cursor.getString(cursor.getColumnIndex(IndexColumns.FRAGMENT))) + .isEqualTo(FRAGMENT_NAME); + assertThat(cursor.getString( + cursor.getColumnIndex(IndexColumns.SCREENTITLE))).isEqualTo(SCREEN_TITLE); + assertThat( + cursor.getString(cursor.getColumnIndex(IndexColumns.KEYWORDS))) + .isEqualTo(KEYWORDS); + assertThat( + cursor.getInt(cursor.getColumnIndex(IndexColumns.ICON_RESOURCE))) + .isEqualTo(ICON); + assertThat( + cursor.getString(cursor.getColumnIndex(IndexColumns.CONTROLLER))) + .isEqualTo(PREF_CONTROLLER); + assertThat(cursor.getInt(cursor.getColumnIndex(IndexColumns.SLICE_TYPE))) + .isEqualTo(SLICE_TYPE); + assertThat(cursor.getString( + cursor.getColumnIndex(IndexColumns.UNAVAILABLE_SLICE_SUBTITLE))) + .isEqualTo(UNAVAILABLE_SLICE_SUBTITLE); + assertThat(cursor.getInt( + cursor.getColumnIndex(IndexColumns.PUBLIC_SLICE))).isEqualTo(1); cursor.moveToNext(); } } finally { @@ -162,7 +209,7 @@ public class SlicesIndexerTest { db.close(); } - private List getDummyIndexableData() { + private List getDummyIndexableData(boolean isPublicSlice) { final List sliceData = new ArrayList<>(); final SliceData.Builder builder = new SliceData.Builder() .setSummary(SUMMARY) @@ -175,6 +222,10 @@ public class SlicesIndexerTest { .setSliceType(SLICE_TYPE) .setUnavailableSliceSubtitle(UNAVAILABLE_SLICE_SUBTITLE); + if (isPublicSlice) { + builder.setIsPublicSlice(true); + } + for (int i = 0; i < KEYS.length; i++) { builder.setKey(KEYS[i]).setTitle(TITLES[i]); sliceData.add(builder.build());