Integrated SearchIndexableResources interface in Settings

- New SearchIndexableResources interface returns SearchIndexableBundle,
we don't need reflection to get SearchIndexableProvider

Bug: 135053028
Test: robolectric, check database search_index.db items
Change-Id: I5ed3416ccf72ef3d38db817fcb4aff7502649ed4
This commit is contained in:
Raff Tsai
2019-09-27 13:45:23 +08:00
parent cdaa57742e
commit c5e1fc677c
14 changed files with 109 additions and 105 deletions

View File

@@ -68,6 +68,7 @@ import com.android.settings.slices.SettingsSliceProvider;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
import com.android.settingslib.search.Indexable; import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableRaw; import com.android.settingslib.search.SearchIndexableRaw;
import java.util.ArrayList; import java.util.ArrayList;
@@ -260,14 +261,14 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
} }
private List<String> getNonIndexableKeysFromProvider(Context context) { private List<String> getNonIndexableKeysFromProvider(Context context) {
final Collection<Class> values = getIndexableProviderValues(context); final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(context)
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
final List<String> nonIndexableKeys = new ArrayList<>(); final List<String> nonIndexableKeys = new ArrayList<>();
for (Class<?> clazz : values) { for (SearchIndexableData bundle : bundles) {
final long startTime = System.currentTimeMillis(); final long startTime = System.currentTimeMillis();
final Indexable.SearchIndexProvider provider = Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
DatabaseIndexingUtils.getSearchIndexProvider(clazz);
List<String> providerNonIndexableKeys; List<String> providerNonIndexableKeys;
try { try {
providerNonIndexableKeys = provider.getNonIndexableKeys(context); providerNonIndexableKeys = provider.getNonIndexableKeys(context);
@@ -281,7 +282,8 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
if (System.getProperty(SYSPROP_CRASH_ON_ERROR) != null) { if (System.getProperty(SYSPROP_CRASH_ON_ERROR) != null) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
Log.e(TAG, "Error trying to get non-indexable keys from: " + clazz.getName(), e); Log.e(TAG, "Error trying to get non-indexable keys from: "
+ bundle.getTargetClass().getName(), e);
continue; continue;
} }
@@ -310,12 +312,12 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
} }
private List<SearchIndexableResource> getSearchIndexableResourcesFromProvider(Context context) { private List<SearchIndexableResource> getSearchIndexableResourcesFromProvider(Context context) {
final Collection<Class> values = getIndexableProviderValues(context); final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(context)
final List<SearchIndexableResource> resourceList = new ArrayList<>(); .getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
List<SearchIndexableResource> resourceList = new ArrayList<>();
for (Class<?> clazz : values) { for (SearchIndexableData bundle : bundles) {
final Indexable.SearchIndexProvider provider = Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
DatabaseIndexingUtils.getSearchIndexProvider(clazz);
final List<SearchIndexableResource> resList = final List<SearchIndexableResource> resList =
provider.getXmlResourcesToIndex(context, true); provider.getXmlResourcesToIndex(context, true);
@@ -325,7 +327,7 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
for (SearchIndexableResource item : resList) { for (SearchIndexableResource item : resList) {
item.className = TextUtils.isEmpty(item.className) item.className = TextUtils.isEmpty(item.className)
? clazz.getName() ? bundle.getTargetClass().getName()
: item.className; : item.className;
} }
@@ -336,14 +338,14 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
} }
private List<SearchIndexableRaw> getSearchIndexableRawFromProvider(Context context) { private List<SearchIndexableRaw> getSearchIndexableRawFromProvider(Context context) {
final Collection<Class> values = getIndexableProviderValues(context); final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(context)
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
final List<SearchIndexableRaw> rawList = new ArrayList<>(); final List<SearchIndexableRaw> rawList = new ArrayList<>();
for (Class<?> clazz : values) { for (SearchIndexableData bundle : bundles) {
final Indexable.SearchIndexProvider provider = Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
DatabaseIndexingUtils.getSearchIndexProvider(clazz); final List<SearchIndexableRaw> providerRaws = provider.getRawDataToIndex(context,
final List<SearchIndexableRaw> providerRaws = true /* enabled */);
provider.getRawDataToIndex(context, true /* enabled */);
if (providerRaws == null) { if (providerRaws == null) {
continue; continue;
@@ -352,7 +354,7 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
for (SearchIndexableRaw raw : providerRaws) { for (SearchIndexableRaw raw : providerRaws) {
// The classname and intent information comes from the PreIndexData // The classname and intent information comes from the PreIndexData
// This will be more clear when provider conversion is done at PreIndex time. // This will be more clear when provider conversion is done at PreIndex time.
raw.className = clazz.getName(); raw.className = bundle.getTargetClass().getName();
} }
rawList.addAll(providerRaws); rawList.addAll(providerRaws);
@@ -362,12 +364,12 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
} }
private List<SearchIndexableRaw> getDynamicSearchIndexableRawFromProvider(Context context) { private List<SearchIndexableRaw> getDynamicSearchIndexableRawFromProvider(Context context) {
final Collection<Class> values = getIndexableProviderValues(context); final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(context)
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
final List<SearchIndexableRaw> rawList = new ArrayList<>(); final List<SearchIndexableRaw> rawList = new ArrayList<>();
for (Class<?> clazz : values) { for (SearchIndexableData bundle : bundles) {
final Indexable.SearchIndexProvider provider = final Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
DatabaseIndexingUtils.getSearchIndexProvider(clazz);
final List<SearchIndexableRaw> providerRaws = final List<SearchIndexableRaw> providerRaws =
provider.getDynamicRawDataToIndex(context, true /* enabled */); provider.getDynamicRawDataToIndex(context, true /* enabled */);
@@ -378,7 +380,7 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
for (SearchIndexableRaw raw : providerRaws) { for (SearchIndexableRaw raw : providerRaws) {
// The classname and intent information comes from the PreIndexData // The classname and intent information comes from the PreIndexData
// This will be more clear when provider conversion is done at PreIndex time. // This will be more clear when provider conversion is done at PreIndex time.
raw.className = clazz.getName(); raw.className = bundle.getTargetClass().getName();
} }
rawList.addAll(providerRaws); rawList.addAll(providerRaws);
@@ -410,9 +412,4 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
return rawList; return rawList;
} }
private Collection<Class> getIndexableProviderValues(Context context) {
return FeatureFactory.getFactory(context)
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
}
} }

View File

@@ -53,9 +53,9 @@ import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag; import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.search.Indexable.SearchIndexProvider;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.search.Indexable.SearchIndexProvider;
import com.android.settingslib.search.SearchIndexableData;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
@@ -101,14 +101,13 @@ class SliceDataConverter {
public List<SliceData> getSliceData() { public List<SliceData> getSliceData() {
List<SliceData> sliceData = new ArrayList<>(); List<SliceData> sliceData = new ArrayList<>();
final Collection<Class> indexableClasses = FeatureFactory.getFactory(mContext) final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(mContext)
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues(); .getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
for (Class clazz : indexableClasses) { for (SearchIndexableData bundle : bundles) {
final String fragmentName = clazz.getName(); final String fragmentName = bundle.getTargetClass().getName();
final SearchIndexProvider provider = DatabaseIndexingUtils.getSearchIndexProvider( final SearchIndexProvider provider = bundle.getSearchIndexProvider();
clazz);
// CodeInspection test guards against the null check. Keep check in case of bad actors. // CodeInspection test guards against the null check. Keep check in case of bad actors.
if (provider == null) { if (provider == null) {

View File

@@ -10,12 +10,11 @@ import android.util.AttributeSet;
import android.util.Xml; import android.util.Xml;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.SearchFeatureProvider; import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl; import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.security.SecuritySettings;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.search.Indexable; import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexableData;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -35,9 +34,6 @@ import java.util.Set;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class XmlControllerAttributeTest { public class XmlControllerAttributeTest {
// List of classes that are too hard to mock in order to retrieve xml information.
private final List<Class> illegalClasses = Arrays.asList(SecuritySettings.class);
// List of XML that could be retrieved from the illegalClasses list. // List of XML that could be retrieved from the illegalClasses list.
private final List<Integer> whitelistXml = Arrays.asList(R.xml.security_dashboard_settings); private final List<Integer> whitelistXml = Arrays.asList(R.xml.security_dashboard_settings);
@@ -112,14 +108,12 @@ public class XmlControllerAttributeTest {
private Set<Integer> getIndexableXml() { private Set<Integer> getIndexableXml() {
Set<Integer> xmlResSet = new HashSet<>(); Set<Integer> xmlResSet = new HashSet<>();
Collection<Class> indexableClasses = Collection<SearchIndexableData> SearchIndexableDatas =
mSearchProvider.getSearchIndexableResources().getProviderValues(); mSearchProvider.getSearchIndexableResources().getProviderValues();
indexableClasses.removeAll(illegalClasses);
for (Class clazz : indexableClasses) { for (SearchIndexableData bundle : SearchIndexableDatas) {
Indexable.SearchIndexProvider provider = Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
DatabaseIndexingUtils.getSearchIndexProvider(clazz);
if (provider == null) { if (provider == null) {
continue; continue;

View File

@@ -12,7 +12,6 @@
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*
*/ */
package com.android.settings.search; package com.android.settings.search;
@@ -41,14 +40,14 @@ public class DatabaseIndexingUtils {
} catch (NoSuchFieldException e) { } catch (NoSuchFieldException e) {
Log.d(TAG, "Cannot find field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'"); Log.d(TAG, "Cannot find field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
} catch (SecurityException se) { } catch (SecurityException se) {
Log.d(TAG, "Security exception for field '" + Log.d(TAG,
FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'"); "Security exception for field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
Log.d(TAG, "Illegal access to field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'"); Log.d(TAG, "Illegal access to field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
Log.d(TAG, "Illegal argument when accessing field '" + Log.d(TAG, "Illegal argument when accessing field '"
FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'"); + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
} }
return null; return null;
} }
} }

View File

@@ -26,6 +26,7 @@ import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.codeinspection.CodeInspector; import com.android.settings.core.codeinspection.CodeInspector;
import com.android.settings.dashboard.DashboardFragmentSearchIndexProviderInspector; import com.android.settings.dashboard.DashboardFragmentSearchIndexProviderInspector;
import com.android.settingslib.search.Indexable; import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableResources; import com.android.settingslib.search.SearchIndexableResources;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
@@ -54,7 +55,7 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
+ " but these are not: \n"; + " but these are not: \n";
private static final String NOT_PROVIDING_VALID_RESOURCE_ERROR = private static final String NOT_PROVIDING_VALID_RESOURCE_ERROR =
"SearchIndexableProvider must either provide no resource to index, or valid ones. " "SearchIndexableProvider must either provide no resource to index, or valid ones. "
+ "But the followings contain resource with xml id = 0\n"; + "But the followings contain resource with xml id = 0\n";
private final List<String> notImplementingIndexProviderGrandfatherList; private final List<String> notImplementingIndexProviderGrandfatherList;
private final List<String> notInSearchIndexableRegistryGrandfatherList; private final List<String> notInSearchIndexableRegistryGrandfatherList;
@@ -79,6 +80,13 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
final Set<String> notInSearchProviderRegistry = new ArraySet<>(); final Set<String> notInSearchProviderRegistry = new ArraySet<>();
final Set<String> notSharingPreferenceControllers = new ArraySet<>(); final Set<String> notSharingPreferenceControllers = new ArraySet<>();
final Set<String> notProvidingValidResource = new ArraySet<>(); final Set<String> notProvidingValidResource = new ArraySet<>();
final Set<Class> providerClasses = new ArraySet<>();
final SearchFeatureProvider provider = new SearchFeatureProviderImpl();
for (SearchIndexableData bundle :
provider.getSearchIndexableResources().getProviderValues()) {
providerClasses.add(bundle.getTargetClass());
}
for (Class clazz : mClasses) { for (Class clazz : mClasses) {
if (!isConcreteSettingsClass(clazz)) { if (!isConcreteSettingsClass(clazz)) {
@@ -108,8 +116,7 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
continue; continue;
} }
// Must be in SearchProviderRegistry // Must be in SearchProviderRegistry
SearchFeatureProvider provider = new SearchFeatureProviderImpl(); if (!providerClasses.contains(clazz)) {
if (!provider.getSearchIndexableResources().getProviderValues().contains(clazz)) {
if (!notInSearchIndexableRegistryGrandfatherList.remove(className)) { if (!notInSearchIndexableRegistryGrandfatherList.remove(className)) {
notInSearchProviderRegistry.add(className); notInSearchProviderRegistry.add(className);
} }

View File

@@ -21,7 +21,6 @@ import static android.provider.SearchIndexablesContract.COLUMN_INDEX_NON_INDEXAB
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -32,6 +31,7 @@ import android.text.TextUtils;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.FakeIndexProvider; import com.android.settings.testutils.FakeIndexProvider;
import com.android.settings.wifi.WifiSettings; import com.android.settings.wifi.WifiSettings;
import com.android.settingslib.search.SearchIndexableData;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@@ -65,11 +65,11 @@ public class SearchIndexableResourcesTest {
.doesNotContain(String.class); .doesNotContain(String.class);
final int beforeCount = final int beforeCount =
mSearchProvider.getSearchIndexableResources().getProviderValues().size(); mSearchProvider.getSearchIndexableResources().getProviderValues().size();
final SearchIndexableData testBundle = new SearchIndexableData(null, null);
mSearchProvider.getSearchIndexableResources().addIndex(String.class); mSearchProvider.getSearchIndexableResources().addIndex(testBundle);
assertThat(mSearchProvider.getSearchIndexableResources().getProviderValues()) assertThat(mSearchProvider.getSearchIndexableResources().getProviderValues())
.contains(String.class); .contains(testBundle);
final int afterCount = final int afterCount =
mSearchProvider.getSearchIndexableResources().getProviderValues().size(); mSearchProvider.getSearchIndexableResources().getProviderValues().size();
assertThat(afterCount).isEqualTo(beforeCount + 1); assertThat(afterCount).isEqualTo(beforeCount + 1);
@@ -77,14 +77,22 @@ public class SearchIndexableResourcesTest {
@Test @Test
public void testIndexHasWifiSettings() { public void testIndexHasWifiSettings() {
assertThat(mSearchProvider.getSearchIndexableResources().getProviderValues()) boolean hasWifi = false;
.contains(WifiSettings.class); for (SearchIndexableData bundle :
mSearchProvider.getSearchIndexableResources().getProviderValues()) {
if (bundle.getTargetClass().getName().equals(WifiSettings.class.getName())) {
hasWifi = true;
break;
}
}
assertThat(hasWifi).isTrue();
} }
@Test @Test
public void testNonIndexableKeys_GetsKeyFromProvider() { public void testNonIndexableKeys_GetsKeyFromProvider() {
mSearchProvider.getSearchIndexableResources().getProviderValues().clear(); mSearchProvider.getSearchIndexableResources().getProviderValues().clear();
mSearchProvider.getSearchIndexableResources().addIndex(FakeIndexProvider.class); mSearchProvider.getSearchIndexableResources().addIndex(
new SearchIndexableData(null, FakeIndexProvider.SEARCH_INDEX_DATA_PROVIDER));
SettingsSearchIndexablesProvider provider = spy(new SettingsSearchIndexablesProvider()); SettingsSearchIndexablesProvider provider = spy(new SettingsSearchIndexablesProvider());
@@ -105,9 +113,10 @@ public class SearchIndexableResourcesTest {
@Test @Test
public void testAllClassNamesHaveProviders() { public void testAllClassNamesHaveProviders() {
for (Class clazz : mSearchProvider.getSearchIndexableResources().getProviderValues()) { for (SearchIndexableData data :
if (DatabaseIndexingUtils.getSearchIndexProvider(clazz) == null) { mSearchProvider.getSearchIndexableResources().getProviderValues()) {
fail(clazz.getName() + "is not an index provider"); if (DatabaseIndexingUtils.getSearchIndexProvider(data.getTargetClass()) == null) {
fail(data.getTargetClass().getName() + "is not an index provider");
} }
} }
} }

View File

@@ -13,6 +13,7 @@ import android.provider.SearchIndexablesContract;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.search.SearchIndexableData;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@@ -46,7 +47,8 @@ public class SettingsSearchIndexablesProviderTest {
final SearchFeatureProvider featureProvider = new SearchFeatureProviderImpl(); final SearchFeatureProvider featureProvider = new SearchFeatureProviderImpl();
featureProvider.getSearchIndexableResources().getProviderValues().clear(); featureProvider.getSearchIndexableResources().getProviderValues().clear();
featureProvider.getSearchIndexableResources().getProviderValues() featureProvider.getSearchIndexableResources().getProviderValues()
.add(FakeSettingsFragment.class); .add(new SearchIndexableData(FakeSettingsFragment.class,
FakeSettingsFragment.SEARCH_INDEX_DATA_PROVIDER));
mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
mFakeFeatureFactory.searchFeatureProvider = featureProvider; mFakeFeatureFactory.searchFeatureProvider = featureProvider;
} }

View File

@@ -31,11 +31,11 @@ import com.android.settings.core.SliderPreferenceController;
import com.android.settings.core.TogglePreferenceController; import com.android.settings.core.TogglePreferenceController;
import com.android.settings.core.codeinspection.CodeInspector; import com.android.settings.core.codeinspection.CodeInspector;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.SearchFeatureProvider; import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl; import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.search.Indexable; import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexableData;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
@@ -146,13 +146,12 @@ public class SliceControllerInXmlCodeInspector extends CodeInspector {
private List<Integer> getIndexableXml() { private List<Integer> getIndexableXml() {
final List<Integer> xmlResSet = new ArrayList<>(); final List<Integer> xmlResSet = new ArrayList<>();
final Collection<Class> indexableClasses = FeatureFactory.getFactory( final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(
mContext).getSearchFeatureProvider().getSearchIndexableResources() mContext).getSearchFeatureProvider().getSearchIndexableResources()
.getProviderValues(); .getProviderValues();
for (Class clazz : indexableClasses) { for (SearchIndexableData bundle : bundles) {
Indexable.SearchIndexProvider provider = DatabaseIndexingUtils.getSearchIndexProvider( Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
clazz);
if (provider == null) { if (provider == null) {
continue; continue;

View File

@@ -37,6 +37,7 @@ import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl; import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.FakeIndexProvider; import com.android.settings.testutils.FakeIndexProvider;
import com.android.settingslib.search.SearchIndexableData;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@@ -92,7 +93,8 @@ public class SliceDataConverterTest {
public void testFakeProvider_convertsFakeData() { public void testFakeProvider_convertsFakeData() {
mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear(); mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
mSearchFeatureProvider.getSearchIndexableResources().getProviderValues() mSearchFeatureProvider.getSearchIndexableResources().getProviderValues()
.add(FakeIndexProvider.class); .add(new SearchIndexableData(FakeIndexProvider.class,
FakeIndexProvider.SEARCH_INDEX_DATA_PROVIDER));
doReturn(getFakeService()).when(mSliceDataConverter).getAccessibilityServiceInfoList(); doReturn(getFakeService()).when(mSliceDataConverter).getAccessibilityServiceInfoList();

View File

@@ -24,9 +24,7 @@ import static org.mockito.Mockito.spy;
import android.app.ApplicationPackageManager; import android.app.ApplicationPackageManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri; import android.net.Uri;
import android.provider.SettingsSlicesContract; import android.provider.SettingsSlicesContract;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
@@ -40,6 +38,7 @@ import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils; import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils; import com.android.settings.testutils.shadow.ShadowUtils;
import com.android.settingslib.search.SearchIndexableData;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@@ -217,7 +216,8 @@ public class SlicesDatabaseAccessorTest {
// Fake the indexable list. // Fake the indexable list.
provider.getSearchIndexableResources().getProviderValues().clear(); provider.getSearchIndexableResources().getProviderValues().clear();
provider.getSearchIndexableResources().getProviderValues().add( provider.getSearchIndexableResources().getProviderValues().add(
FakeIndexProvider.class); new SearchIndexableData(FakeIndexProvider.class,
FakeIndexProvider.SEARCH_INDEX_DATA_PROVIDER));
final SlicesDatabaseAccessor accessor = new SlicesDatabaseAccessor(mContext); final SlicesDatabaseAccessor accessor = new SlicesDatabaseAccessor(mContext);
final List<Uri> keys = accessor.getSliceUris(SettingsSliceProvider.SLICE_AUTHORITY); final List<Uri> keys = accessor.getSliceUris(SettingsSliceProvider.SLICE_AUTHORITY);

View File

@@ -29,8 +29,8 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableResources; import com.android.settingslib.search.SearchIndexableResources;
import org.junit.Before; import org.junit.Before;
@@ -60,10 +60,10 @@ public class PreferenceControllerContractTest {
final SearchIndexableResources resources = final SearchIndexableResources resources =
FeatureFactory.getFactory(mContext).getSearchFeatureProvider() FeatureFactory.getFactory(mContext).getSearchFeatureProvider()
.getSearchIndexableResources(); .getSearchIndexableResources();
for (Class<?> clazz : resources.getProviderValues()) { for (SearchIndexableData bundle : resources.getProviderValues()) {
final BaseSearchIndexProvider provider = final BaseSearchIndexProvider provider =
(BaseSearchIndexProvider) DatabaseIndexingUtils.getSearchIndexProvider(clazz); (BaseSearchIndexProvider) bundle.getSearchIndexProvider();
if (provider == null) { if (provider == null) {
continue; continue;
} }

View File

@@ -32,8 +32,8 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag; import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.search.Indexable; import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableRaw; import com.android.settingslib.search.SearchIndexableRaw;
import com.android.settingslib.search.SearchIndexableResources; import com.android.settingslib.search.SearchIndexableResources;
@@ -120,8 +120,8 @@ public class UniquePreferenceTest {
final SearchIndexableResources resources = final SearchIndexableResources resources =
FeatureFactory.getFactory(mContext).getSearchFeatureProvider() FeatureFactory.getFactory(mContext).getSearchFeatureProvider()
.getSearchIndexableResources(); .getSearchIndexableResources();
for (Class<?> clazz : resources.getProviderValues()) { for (SearchIndexableData SearchIndexableData : resources.getProviderValues()) {
verifyPreferenceKeys(uniqueKeys, duplicatedKeys, nullKeyClasses, clazz); verifyPreferenceKeys(uniqueKeys, duplicatedKeys, nullKeyClasses, SearchIndexableData);
} }
if (!nullKeyClasses.isEmpty()) { if (!nullKeyClasses.isEmpty()) {
@@ -145,14 +145,12 @@ public class UniquePreferenceTest {
} }
private void verifyPreferenceKeys(Set<String> uniqueKeys, Set<String> duplicatedKeys, private void verifyPreferenceKeys(Set<String> uniqueKeys, Set<String> duplicatedKeys,
Set<String> nullKeyClasses, Class<?> clazz) Set<String> nullKeyClasses, SearchIndexableData searchIndexableData)
throws IOException, XmlPullParserException, Resources.NotFoundException { throws IOException, XmlPullParserException, Resources.NotFoundException {
if (clazz == null) {
return; final String className = searchIndexableData.getTargetClass().getName();
}
final String className = clazz.getName();
final Indexable.SearchIndexProvider provider = final Indexable.SearchIndexProvider provider =
DatabaseIndexingUtils.getSearchIndexProvider(clazz); searchIndexableData.getSearchIndexProvider();
final List<SearchIndexableRaw> rawsToIndex = provider.getRawDataToIndex(mContext, true); final List<SearchIndexableRaw> rawsToIndex = provider.getRawDataToIndex(mContext, true);
final List<SearchIndexableResource> resourcesToIndex = final List<SearchIndexableResource> resourcesToIndex =
provider.getXmlResourcesToIndex(mContext, true); provider.getXmlResourcesToIndex(mContext, true);

View File

@@ -33,8 +33,8 @@ import androidx.test.filters.MediumTest;
import androidx.test.runner.AndroidJUnit4; import androidx.test.runner.AndroidJUnit4;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.search.Indexable; import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableResources; import com.android.settingslib.search.SearchIndexableResources;
import com.google.android.collect.Sets; import com.google.android.collect.Sets;
@@ -84,22 +84,21 @@ public class UserRestrictionTest {
final SearchIndexableResources resources = final SearchIndexableResources resources =
FeatureFactory.getFactory(mContext).getSearchFeatureProvider() FeatureFactory.getFactory(mContext).getSearchFeatureProvider()
.getSearchIndexableResources(); .getSearchIndexableResources();
for (Class<?> clazz : resources.getProviderValues()) { for (SearchIndexableData bundle : resources.getProviderValues()) {
verifyUserRestriction(clazz); verifyUserRestriction(bundle);
} }
} }
private void verifyUserRestriction(Class<?> clazz) private void verifyUserRestriction(SearchIndexableData searchIndexableData)
throws IOException, XmlPullParserException, Resources.NotFoundException { throws IOException, XmlPullParserException, Resources.NotFoundException {
if (clazz == null) {
return;
}
final String className = clazz.getName();
final Indexable.SearchIndexProvider provider = final Indexable.SearchIndexProvider provider =
DatabaseIndexingUtils.getSearchIndexProvider(clazz); searchIndexableData.getSearchIndexProvider();
final List<SearchIndexableResource> resourcesToIndex = final List<SearchIndexableResource> resourcesToIndex =
provider.getXmlResourcesToIndex(mContext, true); provider.getXmlResourcesToIndex(mContext, true);
final String className = searchIndexableData.getTargetClass().getName();
if (resourcesToIndex == null) { if (resourcesToIndex == null) {
Log.d(TAG, className + "is not providing SearchIndexableResource, skipping"); Log.d(TAG, className + "is not providing SearchIndexableResource, skipping");
return; return;

View File

@@ -31,8 +31,8 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.settings.core.PreferenceXmlParserUtils; import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.search.Indexable; import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableResources; import com.android.settingslib.search.SearchIndexableResources;
import org.junit.Before; import org.junit.Before;
@@ -67,8 +67,8 @@ public class SliceDataContractTest {
FeatureFactory.getFactory(mContext).getSearchFeatureProvider() FeatureFactory.getFactory(mContext).getSearchFeatureProvider()
.getSearchIndexableResources(); .getSearchIndexableResources();
for (Class<?> clazz : resources.getProviderValues()) { for (SearchIndexableData SearchIndexableData : resources.getProviderValues()) {
verifyPreferenceTitle(nullTitleFragments, clazz); verifyPreferenceTitle(nullTitleFragments, SearchIndexableData);
} }
if (!nullTitleFragments.isEmpty()) { if (!nullTitleFragments.isEmpty()) {
@@ -82,14 +82,13 @@ public class SliceDataContractTest {
} }
} }
private void verifyPreferenceTitle(Set<String> nullTitleFragments, Class<?> clazz) private void verifyPreferenceTitle(Set<String> nullTitleFragments,
SearchIndexableData searchIndexableData)
throws IOException, XmlPullParserException { throws IOException, XmlPullParserException {
if (clazz == null) {
return; final String className = searchIndexableData.getTargetClass().getName();
}
final String className = clazz.getName();
final Indexable.SearchIndexProvider provider = final Indexable.SearchIndexProvider provider =
DatabaseIndexingUtils.getSearchIndexProvider(clazz); searchIndexableData.getSearchIndexProvider();
final List<SearchIndexableResource> resourcesToIndex = final List<SearchIndexableResource> resourcesToIndex =
provider.getXmlResourcesToIndex(mContext, true); provider.getXmlResourcesToIndex(mContext, true);