From 838d69da50244c1ce7086991652af708c68c4ab3 Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Tue, 24 Apr 2018 15:30:20 -0700 Subject: [PATCH] Index database before getting Uri Descendants onGetSliceDescendants would return empty results if the call was made before the database was indexed. This CL checks the index before building the list. Change-Id: I2e0f88893138a048dbd529d465d68fa4b1a3dc12 Fixes: 78196823 Test: robotests --- .../slices/SlicesDatabaseAccessor.java | 1 + .../search/SearchIndexableResourcesTest.java | 1 + .../slices/SliceBroadcastReceiverTest.java | 4 +- .../slices/SliceDataConverterTest.java | 2 +- .../slices/SlicesDatabaseAccessorTest.java | 38 ++++++++++++++++++- .../testutils/FakeFeatureFactory.java | 5 ++- .../FakeIndexProvider.java | 4 +- 7 files changed, 47 insertions(+), 8 deletions(-) rename tests/robotests/src/com/android/settings/{search => testutils}/FakeIndexProvider.java (92%) diff --git a/src/com/android/settings/slices/SlicesDatabaseAccessor.java b/src/com/android/settings/slices/SlicesDatabaseAccessor.java index b09573383d8..b14a716acab 100644 --- a/src/com/android/settings/slices/SlicesDatabaseAccessor.java +++ b/src/com/android/settings/slices/SlicesDatabaseAccessor.java @@ -89,6 +89,7 @@ public class SlicesDatabaseAccessor { * @return a list of keys in the Slices database matching on {@param isPlatformSlice}. */ public List getSliceKeys(boolean isPlatformSlice) { + verifyIndexing(); final String whereClause; if (isPlatformSlice) { diff --git a/tests/robotests/src/com/android/settings/search/SearchIndexableResourcesTest.java b/tests/robotests/src/com/android/settings/search/SearchIndexableResourcesTest.java index dcf68aa8491..eff95fe327f 100644 --- a/tests/robotests/src/com/android/settings/search/SearchIndexableResourcesTest.java +++ b/tests/robotests/src/com/android/settings/search/SearchIndexableResourcesTest.java @@ -27,6 +27,7 @@ import android.database.Cursor; import android.text.TextUtils; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.FakeIndexProvider; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.wifi.WifiSettings; diff --git a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java index 0b6e4b5bb32..c7bf0437e9a 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java @@ -31,7 +31,6 @@ import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; -import android.database.ContentObserver; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.provider.Settings; @@ -40,14 +39,13 @@ import android.util.Pair; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.core.BasePreferenceController; -import com.android.settings.search.FakeIndexProvider; +import com.android.settings.testutils.FakeIndexProvider; import com.android.settings.search.SearchFeatureProvider; import com.android.settings.search.SearchFeatureProviderImpl; import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeSliderController; import com.android.settings.testutils.FakeToggleController; -import com.android.settings.testutils.FakeUnavailablePreferenceController; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.After; diff --git a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java index 2c87ac4f33c..87ada3697e3 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java @@ -33,7 +33,7 @@ import android.text.TextUtils; import com.android.settings.R; import com.android.settings.accessibility.AccessibilitySettings; import com.android.settings.accessibility.AccessibilitySlicePreferenceController; -import com.android.settings.search.FakeIndexProvider; +import com.android.settings.testutils.FakeIndexProvider; import com.android.settings.search.SearchFeatureProvider; import com.android.settings.search.SearchFeatureProviderImpl; import com.android.settings.testutils.FakeFeatureFactory; diff --git a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java index 820f45c836f..1788d930757 100644 --- a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java +++ b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java @@ -25,9 +25,13 @@ import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; +import android.view.accessibility.AccessibilityManager; -import com.android.settings.search.FakeIndexProvider; +import com.android.settings.testutils.FakeIndexProvider; +import com.android.settings.search.SearchFeatureProvider; +import com.android.settings.search.SearchFeatureProviderImpl; import com.android.settings.testutils.DatabaseTestUtils; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.After; @@ -35,8 +39,15 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowAccessibilityManager; +import java.util.ArrayList; import java.util.List; +import java.util.Locale; + +import org.robolectric.shadow.api.Shadow; + @RunWith(SettingsRobolectricTestRunner.class) public class SlicesDatabaseAccessorTest { @@ -157,6 +168,31 @@ public class SlicesDatabaseAccessorTest { assertThat(keys).containsExactly(key); } + @Test + @Config(qualifiers = "mcc999") + public void getSliceKeys_indexesDatabase() { + // Force new indexing + Locale.setDefault(new Locale("ca")); + // Register the fake a11y Service + ShadowAccessibilityManager shadowAccessibilityManager = Shadow.extract( + RuntimeEnvironment.application.getSystemService(AccessibilityManager.class)); + shadowAccessibilityManager.setInstalledAccessibilityServiceList(new ArrayList<>()); + final SearchFeatureProvider provider = new SearchFeatureProviderImpl(); + final SlicesFeatureProvider sliceProvider = spy(new SlicesFeatureProviderImpl()); + final FakeFeatureFactory factory = FakeFeatureFactory.setupForTest(); + factory.searchFeatureProvider = provider; + factory.slicesFeatureProvider = sliceProvider; + // Fake the indexable list. + provider.getSearchIndexableResources().getProviderValues().clear(); + provider.getSearchIndexableResources().getProviderValues().add( + FakeIndexProvider.class); + + final SlicesDatabaseAccessor accessor = new SlicesDatabaseAccessor(mContext); + final List keys = accessor.getSliceKeys(true); + + assertThat(keys).isNotEmpty(); + } + private void insertSpecialCase(String key) { insertSpecialCase(key, true); } diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java index 8945af924e7..7010621aea5 100644 --- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java +++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java @@ -61,11 +61,12 @@ public class FakeFeatureFactory extends FeatureFactory { public final UserFeatureProvider userFeatureProvider; public final AssistGestureFeatureProvider assistGestureFeatureProvider; public final BluetoothFeatureProvider bluetoothFeatureProvider; - public final SlicesFeatureProvider slicesFeatureProvider; - public SearchFeatureProvider searchFeatureProvider; public final AccountFeatureProvider mAccountFeatureProvider; public final DeviceIndexFeatureProvider deviceIndexFeatureProvider; + public SlicesFeatureProvider slicesFeatureProvider; + public SearchFeatureProvider searchFeatureProvider; + /** * Call this in {@code @Before} method of the test class to use fake factory. */ diff --git a/tests/robotests/src/com/android/settings/search/FakeIndexProvider.java b/tests/robotests/src/com/android/settings/testutils/FakeIndexProvider.java similarity index 92% rename from tests/robotests/src/com/android/settings/search/FakeIndexProvider.java rename to tests/robotests/src/com/android/settings/testutils/FakeIndexProvider.java index e5f1631b01c..c9177e1c5dd 100644 --- a/tests/robotests/src/com/android/settings/search/FakeIndexProvider.java +++ b/tests/robotests/src/com/android/settings/testutils/FakeIndexProvider.java @@ -15,12 +15,14 @@ * */ -package com.android.settings.search; +package com.android.settings.testutils; import android.content.Context; import android.provider.SearchIndexableResource; import com.android.settings.R; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.Indexable; import java.util.ArrayList; import java.util.List;