import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.search.Indexable;
+import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableRaw;
import java.util.ArrayList;
}
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<>();
- for (Class<?> clazz : values) {
+ for (SearchIndexableData bundle : bundles) {
final long startTime = System.currentTimeMillis();
- final Indexable.SearchIndexProvider provider =
- DatabaseIndexingUtils.getSearchIndexProvider(clazz);
-
+ Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
List<String> providerNonIndexableKeys;
try {
providerNonIndexableKeys = provider.getNonIndexableKeys(context);
if (System.getProperty(SYSPROP_CRASH_ON_ERROR) != null) {
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;
}
}
private List<SearchIndexableResource> getSearchIndexableResourcesFromProvider(Context context) {
- final Collection<Class> values = getIndexableProviderValues(context);
- final List<SearchIndexableResource> resourceList = new ArrayList<>();
+ final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(context)
+ .getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
+ List<SearchIndexableResource> resourceList = new ArrayList<>();
- for (Class<?> clazz : values) {
- final Indexable.SearchIndexProvider provider =
- DatabaseIndexingUtils.getSearchIndexProvider(clazz);
+ for (SearchIndexableData bundle : bundles) {
+ Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
final List<SearchIndexableResource> resList =
provider.getXmlResourcesToIndex(context, true);
for (SearchIndexableResource item : resList) {
item.className = TextUtils.isEmpty(item.className)
- ? clazz.getName()
+ ? bundle.getTargetClass().getName()
: item.className;
}
}
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<>();
- for (Class<?> clazz : values) {
- final Indexable.SearchIndexProvider provider =
- DatabaseIndexingUtils.getSearchIndexProvider(clazz);
- final List<SearchIndexableRaw> providerRaws =
- provider.getRawDataToIndex(context, true /* enabled */);
+ for (SearchIndexableData bundle : bundles) {
+ Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
+ final List<SearchIndexableRaw> providerRaws = provider.getRawDataToIndex(context,
+ true /* enabled */);
if (providerRaws == null) {
continue;
for (SearchIndexableRaw raw : providerRaws) {
// The classname and intent information comes from the PreIndexData
// 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);
}
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<>();
- for (Class<?> clazz : values) {
- final Indexable.SearchIndexProvider provider =
- DatabaseIndexingUtils.getSearchIndexProvider(clazz);
+ for (SearchIndexableData bundle : bundles) {
+ final Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
final List<SearchIndexableRaw> providerRaws =
provider.getDynamicRawDataToIndex(context, true /* enabled */);
for (SearchIndexableRaw raw : providerRaws) {
// The classname and intent information comes from the PreIndexData
// 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);
return rawList;
}
-
- private Collection<Class> getIndexableProviderValues(Context context) {
- return FeatureFactory.getFactory(context)
- .getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
- }
}
import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag;
import com.android.settings.dashboard.DashboardFragment;
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.search.Indexable.SearchIndexProvider;
+import com.android.settingslib.search.SearchIndexableData;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
public List<SliceData> getSliceData() {
List<SliceData> sliceData = new ArrayList<>();
- final Collection<Class> indexableClasses = FeatureFactory.getFactory(mContext)
+ final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(mContext)
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
- for (Class clazz : indexableClasses) {
- final String fragmentName = clazz.getName();
+ for (SearchIndexableData bundle : bundles) {
+ final String fragmentName = bundle.getTargetClass().getName();
- final SearchIndexProvider provider = DatabaseIndexingUtils.getSearchIndexProvider(
- clazz);
+ final SearchIndexProvider provider = bundle.getSearchIndexProvider();
// CodeInspection test guards against the null check. Keep check in case of bad actors.
if (provider == null) {
import android.util.Xml;
import com.android.settings.R;
-import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
-import com.android.settings.security.SecuritySettings;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.search.Indexable;
+import com.android.settingslib.search.SearchIndexableData;
import org.junit.Before;
import org.junit.Test;
@RunWith(RobolectricTestRunner.class)
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.
private final List<Integer> whitelistXml = Arrays.asList(R.xml.security_dashboard_settings);
private Set<Integer> getIndexableXml() {
Set<Integer> xmlResSet = new HashSet<>();
- Collection<Class> indexableClasses =
+ Collection<SearchIndexableData> SearchIndexableDatas =
mSearchProvider.getSearchIndexableResources().getProviderValues();
- indexableClasses.removeAll(illegalClasses);
- for (Class clazz : indexableClasses) {
+ for (SearchIndexableData bundle : SearchIndexableDatas) {
- Indexable.SearchIndexProvider provider =
- DatabaseIndexingUtils.getSearchIndexProvider(clazz);
+ Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
if (provider == null) {
continue;
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
- *
*/
package com.android.settings.search;
} catch (NoSuchFieldException e) {
Log.d(TAG, "Cannot find field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
} catch (SecurityException se) {
- Log.d(TAG, "Security exception for field '" +
- FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
+ Log.d(TAG,
+ "Security exception for field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
} catch (IllegalAccessException e) {
Log.d(TAG, "Illegal access to field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
} catch (IllegalArgumentException e) {
- Log.d(TAG, "Illegal argument when accessing field '" +
- FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
+ Log.d(TAG, "Illegal argument when accessing field '"
+ + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
}
return null;
}
-}
\ No newline at end of file
+}
import com.android.settings.core.codeinspection.CodeInspector;
import com.android.settings.dashboard.DashboardFragmentSearchIndexProviderInspector;
import com.android.settingslib.search.Indexable;
+import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableResources;
import org.robolectric.RuntimeEnvironment;
+ " but these are not: \n";
private static final String NOT_PROVIDING_VALID_RESOURCE_ERROR =
"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> notInSearchIndexableRegistryGrandfatherList;
final Set<String> notInSearchProviderRegistry = new ArraySet<>();
final Set<String> notSharingPreferenceControllers = 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) {
if (!isConcreteSettingsClass(clazz)) {
continue;
}
// Must be in SearchProviderRegistry
- SearchFeatureProvider provider = new SearchFeatureProviderImpl();
- if (!provider.getSearchIndexableResources().getProviderValues().contains(clazz)) {
+ if (!providerClasses.contains(clazz)) {
if (!notInSearchIndexableRegistryGrandfatherList.remove(className)) {
notInSearchProviderRegistry.add(className);
}
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail;
-
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.FakeIndexProvider;
import com.android.settings.wifi.WifiSettings;
+import com.android.settingslib.search.SearchIndexableData;
import org.junit.After;
import org.junit.Before;
.doesNotContain(String.class);
final int beforeCount =
mSearchProvider.getSearchIndexableResources().getProviderValues().size();
-
- mSearchProvider.getSearchIndexableResources().addIndex(String.class);
+ final SearchIndexableData testBundle = new SearchIndexableData(null, null);
+ mSearchProvider.getSearchIndexableResources().addIndex(testBundle);
assertThat(mSearchProvider.getSearchIndexableResources().getProviderValues())
- .contains(String.class);
+ .contains(testBundle);
final int afterCount =
mSearchProvider.getSearchIndexableResources().getProviderValues().size();
assertThat(afterCount).isEqualTo(beforeCount + 1);
@Test
public void testIndexHasWifiSettings() {
- assertThat(mSearchProvider.getSearchIndexableResources().getProviderValues())
- .contains(WifiSettings.class);
+ boolean hasWifi = false;
+ for (SearchIndexableData bundle :
+ mSearchProvider.getSearchIndexableResources().getProviderValues()) {
+ if (bundle.getTargetClass().getName().equals(WifiSettings.class.getName())) {
+ hasWifi = true;
+ break;
+ }
+ }
+ assertThat(hasWifi).isTrue();
}
@Test
public void testNonIndexableKeys_GetsKeyFromProvider() {
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());
@Test
public void testAllClassNamesHaveProviders() {
- for (Class clazz : mSearchProvider.getSearchIndexableResources().getProviderValues()) {
- if (DatabaseIndexingUtils.getSearchIndexProvider(clazz) == null) {
- fail(clazz.getName() + "is not an index provider");
+ for (SearchIndexableData data :
+ mSearchProvider.getSearchIndexableResources().getProviderValues()) {
+ if (DatabaseIndexingUtils.getSearchIndexProvider(data.getTargetClass()) == null) {
+ fail(data.getTargetClass().getName() + "is not an index provider");
}
}
}
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.search.SearchIndexableData;
import org.junit.After;
import org.junit.Before;
final SearchFeatureProvider featureProvider = new SearchFeatureProviderImpl();
featureProvider.getSearchIndexableResources().getProviderValues().clear();
featureProvider.getSearchIndexableResources().getProviderValues()
- .add(FakeSettingsFragment.class);
+ .add(new SearchIndexableData(FakeSettingsFragment.class,
+ FakeSettingsFragment.SEARCH_INDEX_DATA_PROVIDER));
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
mFakeFeatureFactory.searchFeatureProvider = featureProvider;
}
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.core.codeinspection.CodeInspector;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.search.Indexable;
+import com.android.settingslib.search.SearchIndexableData;
import org.robolectric.RuntimeEnvironment;
import org.xmlpull.v1.XmlPullParserException;
private List<Integer> getIndexableXml() {
final List<Integer> xmlResSet = new ArrayList<>();
- final Collection<Class> indexableClasses = FeatureFactory.getFactory(
+ final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(
mContext).getSearchFeatureProvider().getSearchIndexableResources()
.getProviderValues();
- for (Class clazz : indexableClasses) {
- Indexable.SearchIndexProvider provider = DatabaseIndexingUtils.getSearchIndexProvider(
- clazz);
+ for (SearchIndexableData bundle : bundles) {
+ Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
if (provider == null) {
continue;
import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.FakeIndexProvider;
+import com.android.settingslib.search.SearchIndexableData;
import org.junit.After;
import org.junit.Before;
public void testFakeProvider_convertsFakeData() {
mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
mSearchFeatureProvider.getSearchIndexableResources().getProviderValues()
- .add(FakeIndexProvider.class);
+ .add(new SearchIndexableData(FakeIndexProvider.class,
+ FakeIndexProvider.SEARCH_INDEX_DATA_PROVIDER));
doReturn(getFakeService()).when(mSliceDataConverter).getAccessibilityServiceInfoList();
import android.app.ApplicationPackageManager;
import android.content.ComponentName;
import android.content.ContentResolver;
-import android.content.ContentValues;
import android.content.Context;
-import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.provider.SettingsSlicesContract;
import android.view.accessibility.AccessibilityManager;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils;
+import com.android.settingslib.search.SearchIndexableData;
import org.junit.After;
import org.junit.Before;
// Fake the indexable list.
provider.getSearchIndexableResources().getProviderValues().clear();
provider.getSearchIndexableResources().getProviderValues().add(
- FakeIndexProvider.class);
+ new SearchIndexableData(FakeIndexProvider.class,
+ FakeIndexProvider.SEARCH_INDEX_DATA_PROVIDER));
final SlicesDatabaseAccessor accessor = new SlicesDatabaseAccessor(mContext);
final List<Uri> keys = accessor.getSliceUris(SettingsSliceProvider.SLICE_AUTHORITY);
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableResources;
import org.junit.Before;
final SearchIndexableResources resources =
FeatureFactory.getFactory(mContext).getSearchFeatureProvider()
.getSearchIndexableResources();
- for (Class<?> clazz : resources.getProviderValues()) {
+ for (SearchIndexableData bundle : resources.getProviderValues()) {
final BaseSearchIndexProvider provider =
- (BaseSearchIndexProvider) DatabaseIndexingUtils.getSearchIndexProvider(clazz);
+ (BaseSearchIndexProvider) bundle.getSearchIndexProvider();
if (provider == null) {
continue;
}
import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.search.Indexable;
+import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableRaw;
import com.android.settingslib.search.SearchIndexableResources;
final SearchIndexableResources resources =
FeatureFactory.getFactory(mContext).getSearchFeatureProvider()
.getSearchIndexableResources();
- for (Class<?> clazz : resources.getProviderValues()) {
- verifyPreferenceKeys(uniqueKeys, duplicatedKeys, nullKeyClasses, clazz);
+ for (SearchIndexableData SearchIndexableData : resources.getProviderValues()) {
+ verifyPreferenceKeys(uniqueKeys, duplicatedKeys, nullKeyClasses, SearchIndexableData);
}
if (!nullKeyClasses.isEmpty()) {
}
private void verifyPreferenceKeys(Set<String> uniqueKeys, Set<String> duplicatedKeys,
- Set<String> nullKeyClasses, Class<?> clazz)
+ Set<String> nullKeyClasses, SearchIndexableData searchIndexableData)
throws IOException, XmlPullParserException, Resources.NotFoundException {
- if (clazz == null) {
- return;
- }
- final String className = clazz.getName();
+
+ final String className = searchIndexableData.getTargetClass().getName();
final Indexable.SearchIndexProvider provider =
- DatabaseIndexingUtils.getSearchIndexProvider(clazz);
+ searchIndexableData.getSearchIndexProvider();
final List<SearchIndexableRaw> rawsToIndex = provider.getRawDataToIndex(mContext, true);
final List<SearchIndexableResource> resourcesToIndex =
provider.getXmlResourcesToIndex(mContext, true);
import androidx.test.runner.AndroidJUnit4;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.search.Indexable;
+import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableResources;
import com.google.android.collect.Sets;
final SearchIndexableResources resources =
FeatureFactory.getFactory(mContext).getSearchFeatureProvider()
.getSearchIndexableResources();
- for (Class<?> clazz : resources.getProviderValues()) {
- verifyUserRestriction(clazz);
+ for (SearchIndexableData bundle : resources.getProviderValues()) {
+ verifyUserRestriction(bundle);
}
}
- private void verifyUserRestriction(Class<?> clazz)
+ private void verifyUserRestriction(SearchIndexableData searchIndexableData)
throws IOException, XmlPullParserException, Resources.NotFoundException {
- if (clazz == null) {
- return;
- }
- final String className = clazz.getName();
+
final Indexable.SearchIndexProvider provider =
- DatabaseIndexingUtils.getSearchIndexProvider(clazz);
+ searchIndexableData.getSearchIndexProvider();
final List<SearchIndexableResource> resourcesToIndex =
provider.getXmlResourcesToIndex(mContext, true);
+ final String className = searchIndexableData.getTargetClass().getName();
+
if (resourcesToIndex == null) {
Log.d(TAG, className + "is not providing SearchIndexableResource, skipping");
return;
import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.search.Indexable;
+import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableResources;
import org.junit.Before;
FeatureFactory.getFactory(mContext).getSearchFeatureProvider()
.getSearchIndexableResources();
- for (Class<?> clazz : resources.getProviderValues()) {
- verifyPreferenceTitle(nullTitleFragments, clazz);
+ for (SearchIndexableData SearchIndexableData : resources.getProviderValues()) {
+ verifyPreferenceTitle(nullTitleFragments, SearchIndexableData);
}
if (!nullTitleFragments.isEmpty()) {
}
}
- private void verifyPreferenceTitle(Set<String> nullTitleFragments, Class<?> clazz)
+ private void verifyPreferenceTitle(Set<String> nullTitleFragments,
+ SearchIndexableData searchIndexableData)
throws IOException, XmlPullParserException {
- if (clazz == null) {
- return;
- }
- final String className = clazz.getName();
+
+ final String className = searchIndexableData.getTargetClass().getName();
final Indexable.SearchIndexProvider provider =
- DatabaseIndexingUtils.getSearchIndexProvider(clazz);
+ searchIndexableData.getSearchIndexProvider();
final List<SearchIndexableResource> resourcesToIndex =
provider.getXmlResourcesToIndex(mContext, true);