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:
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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();
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user