Add capability for OEMs to supply their own SearchIndexableResources.

This moves SearchIndexableResources to be supplied by FeatureFactory
rather than its own singleton, which in effect allows OEMs to supply their
own, in the case where they have their own classes they want to be
indexed (or, remove certain classes that used to be indexed).

Bug: 72179744
Test: All tests pass.

Change-Id: Ia06b2026df7eca4c53b44a5a589c4aaa0b69d96c
This commit is contained in:
Ben Lin
2018-01-17 17:53:20 -08:00
parent 182a0fc91b
commit 4d163fcc93
16 changed files with 312 additions and 231 deletions

View File

@@ -48,6 +48,11 @@ public interface SearchFeatureProvider {
DatabaseIndexingManager getIndexingManager(Context context); DatabaseIndexingManager getIndexingManager(Context context);
/**
* @return a {@link SearchIndexableResources} to be used for indexing search results.
*/
SearchIndexableResources getSearchIndexableResources();
default String getSettingsIntelligencePkgName() { default String getSettingsIntelligencePkgName() {
return "com.android.settings.intelligence"; return "com.android.settings.intelligence";
} }

View File

@@ -36,6 +36,7 @@ public class SearchFeatureProviderImpl implements SearchFeatureProvider {
private static final String METRICS_ACTION_SETTINGS_INDEX = "search_synchronous_indexing"; private static final String METRICS_ACTION_SETTINGS_INDEX = "search_synchronous_indexing";
private DatabaseIndexingManager mDatabaseIndexingManager; private DatabaseIndexingManager mDatabaseIndexingManager;
private SearchIndexableResources mSearchIndexableResources;
@Override @Override
public void verifyLaunchSearchResultPageCaller(Context context, ComponentName caller) { public void verifyLaunchSearchResultPageCaller(Context context, ComponentName caller) {
@@ -72,6 +73,14 @@ public class SearchFeatureProviderImpl implements SearchFeatureProvider {
.histogram(context, METRICS_ACTION_SETTINGS_INDEX, indexingTime); .histogram(context, METRICS_ACTION_SETTINGS_INDEX, indexingTime);
} }
@Override
public SearchIndexableResources getSearchIndexableResources() {
if (mSearchIndexableResources == null) {
mSearchIndexableResources = new SearchIndexableResourcesImpl();
}
return mSearchIndexableResources;
}
protected boolean isSignatureWhitelisted(Context context, String callerPackage) { protected boolean isSignatureWhitelisted(Context context, String callerPackage) {
return false; return false;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2014 The Android Open Source Project * Copyright (C) 2018 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -16,170 +16,14 @@
package com.android.settings.search; package com.android.settings.search;
import android.support.annotation.VisibleForTesting;
import com.android.settings.DateTimeSettings;
import com.android.settings.DisplaySettings;
import com.android.settings.LegalSettings;
import com.android.settings.accessibility.AccessibilitySettings;
import com.android.settings.accessibility.AccessibilityShortcutPreferenceFragment;
import com.android.settings.accessibility.MagnificationPreferenceFragment;
import com.android.settings.accounts.UserAndAccountDashboardFragment;
import com.android.settings.applications.AppAndNotificationDashboardFragment;
import com.android.settings.applications.DefaultAppSettings;
import com.android.settings.applications.SpecialAccessSettings;
import com.android.settings.applications.assist.ManageAssist;
import com.android.settings.backup.BackupSettingsActivity;
import com.android.settings.backup.BackupSettingsFragment;
import com.android.settings.bluetooth.BluetoothSettings;
import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
import com.android.settings.datausage.DataUsageSummary;
import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
import com.android.settings.development.DevelopmentSettingsDashboardFragment;
import com.android.settings.deviceinfo.DeviceInfoSettings;
import com.android.settings.deviceinfo.StorageDashboardFragment;
import com.android.settings.deviceinfo.StorageSettings;
import com.android.settings.display.AmbientDisplaySettings;
import com.android.settings.display.NightDisplaySettings;
import com.android.settings.display.ScreenZoomSettings;
import com.android.settings.dream.DreamSettings;
import com.android.settings.enterprise.EnterprisePrivacySettings;
import com.android.settings.fuelgauge.BatterySaverSettings;
import com.android.settings.fuelgauge.PowerUsageAdvanced;
import com.android.settings.fuelgauge.PowerUsageSummary;
import com.android.settings.fuelgauge.SmartBatterySettings;
import com.android.settings.gestures.AssistGestureSettings;
import com.android.settings.gestures.DoubleTapPowerSettings;
import com.android.settings.gestures.DoubleTapScreenSettings;
import com.android.settings.gestures.DoubleTwistGestureSettings;
import com.android.settings.gestures.GestureSettings;
import com.android.settings.gestures.PickupGestureSettings;
import com.android.settings.gestures.SwipeToNotificationSettings;
import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
import com.android.settings.inputmethod.PhysicalKeyboardFragment;
import com.android.settings.inputmethod.VirtualKeyboardFragment;
import com.android.settings.language.LanguageAndInputSettings;
import com.android.settings.location.LocationMode;
import com.android.settings.location.LocationSettings;
import com.android.settings.location.ScanningSettings;
import com.android.settings.network.NetworkDashboardFragment;
import com.android.settings.nfc.PaymentSettings;
import com.android.settings.notification.ConfigureNotificationSettings;
import com.android.settings.notification.SoundSettings;
import com.android.settings.notification.ZenModeAutomationSettings;
import com.android.settings.notification.ZenModeBehaviorSettings;
import com.android.settings.notification.ZenModeSettings;
import com.android.settings.print.PrintSettingsFragment;
import com.android.settings.security.EncryptionAndCredential;
import com.android.settings.security.LockscreenDashboardFragment;
import com.android.settings.security.ScreenPinningSettings;
import com.android.settings.security.SecuritySettingsV2;
import com.android.settings.security.screenlock.ScreenLockSettings;
import com.android.settings.sim.SimSettings;
import com.android.settings.support.SupportDashboardActivity;
import com.android.settings.system.ResetDashboardFragment;
import com.android.settings.system.SystemDashboardFragment;
import com.android.settings.tts.TextToSpeechSettings;
import com.android.settings.tts.TtsEnginePreferenceFragment;
import com.android.settings.users.UserSettings;
import com.android.settings.wallpaper.WallpaperTypeSettings;
import com.android.settings.wfd.WifiDisplaySettings;
import com.android.settings.wifi.ConfigureWifiSettings;
import com.android.settings.wifi.WifiSettings;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public final class SearchIndexableResources { public interface SearchIndexableResources {
@VisibleForTesting /**
static final Set<Class> sProviders = new HashSet<>(); * Returns a collection of classes that should be indexed for search.
*
@VisibleForTesting * Each class should have the SEARCH_INDEX_DATA_PROVIDER public static member.
static void addIndex(Class indexClass) { */
sProviders.add(indexClass); Collection<Class> getProviderValues();
}
static {
addIndex(WifiSettings.class);
addIndex(NetworkDashboardFragment.class);
addIndex(ConfigureWifiSettings.class);
addIndex(BluetoothSettings.class);
addIndex(SimSettings.class);
addIndex(DataUsageSummary.class);
addIndex(ScreenZoomSettings.class);
addIndex(DisplaySettings.class);
addIndex(AmbientDisplaySettings.class);
addIndex(WallpaperTypeSettings.class);
addIndex(AppAndNotificationDashboardFragment.class);
addIndex(SoundSettings.class);
addIndex(ZenModeSettings.class);
addIndex(StorageSettings.class);
addIndex(PowerUsageAdvanced.class);
addIndex(DefaultAppSettings.class);
addIndex(ManageAssist.class);
addIndex(SpecialAccessSettings.class);
addIndex(UserSettings.class);
addIndex(AssistGestureSettings.class);
addIndex(PickupGestureSettings.class);
addIndex(DoubleTapScreenSettings.class);
addIndex(DoubleTapPowerSettings.class);
addIndex(DoubleTwistGestureSettings.class);
addIndex(SwipeToNotificationSettings.class);
addIndex(GestureSettings.class);
addIndex(LanguageAndInputSettings.class);
addIndex(LocationSettings.class);
addIndex(LocationMode.class);
addIndex(ScanningSettings.class);
addIndex(SecuritySettingsV2.class);
addIndex(ScreenLockSettings.class);
addIndex(EncryptionAndCredential.class);
addIndex(ScreenPinningSettings.class);
addIndex(UserAndAccountDashboardFragment.class);
addIndex(VirtualKeyboardFragment.class);
addIndex(AvailableVirtualKeyboardFragment.class);
addIndex(PhysicalKeyboardFragment.class);
addIndex(BackupSettingsActivity.class);
addIndex(BackupSettingsFragment.class);
addIndex(DateTimeSettings.class);
addIndex(AccessibilitySettings.class);
addIndex(PrintSettingsFragment.class);
addIndex(DevelopmentSettingsDashboardFragment.class);
addIndex(DeviceInfoSettings.class);
addIndex(LegalSettings.class);
addIndex(SystemDashboardFragment.class);
addIndex(ResetDashboardFragment.class);
addIndex(StorageDashboardFragment.class);
addIndex(ConnectedDeviceDashboardFragment.class);
addIndex(ConnectedDeviceDashboardFragmentOld.class);
addIndex(AdvancedConnectedDeviceDashboardFragment.class);
addIndex(EnterprisePrivacySettings.class);
addIndex(PaymentSettings.class);
addIndex(TextToSpeechSettings.class);
addIndex(TtsEnginePreferenceFragment.class);
addIndex(MagnificationPreferenceFragment.class);
addIndex(AccessibilityShortcutPreferenceFragment.class);
addIndex(DreamSettings.class);
addIndex(SupportDashboardActivity.class);
addIndex(AutomaticStorageManagerSettings.class);
addIndex(ConfigureNotificationSettings.class);
addIndex(PowerUsageSummary.class);
addIndex(BatterySaverSettings.class);
addIndex(LockscreenDashboardFragment.class);
addIndex(WifiDisplaySettings.class);
addIndex(ZenModeBehaviorSettings.class);
addIndex(ZenModeAutomationSettings.class);
addIndex(NightDisplaySettings.class);
addIndex(SmartBatterySettings.class);
}
private SearchIndexableResources() {
}
public static Collection<Class> providerValues() {
return sProviders;
}
} }

View File

@@ -0,0 +1,182 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* 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;
import android.support.annotation.VisibleForTesting;
import com.android.settings.DateTimeSettings;
import com.android.settings.DisplaySettings;
import com.android.settings.LegalSettings;
import com.android.settings.accessibility.AccessibilitySettings;
import com.android.settings.accessibility.AccessibilityShortcutPreferenceFragment;
import com.android.settings.accessibility.MagnificationPreferenceFragment;
import com.android.settings.accounts.UserAndAccountDashboardFragment;
import com.android.settings.applications.AppAndNotificationDashboardFragment;
import com.android.settings.applications.DefaultAppSettings;
import com.android.settings.applications.SpecialAccessSettings;
import com.android.settings.applications.assist.ManageAssist;
import com.android.settings.backup.BackupSettingsActivity;
import com.android.settings.backup.BackupSettingsFragment;
import com.android.settings.bluetooth.BluetoothSettings;
import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
import com.android.settings.datausage.DataUsageSummary;
import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
import com.android.settings.development.DevelopmentSettingsDashboardFragment;
import com.android.settings.deviceinfo.DeviceInfoSettings;
import com.android.settings.deviceinfo.StorageDashboardFragment;
import com.android.settings.deviceinfo.StorageSettings;
import com.android.settings.display.AmbientDisplaySettings;
import com.android.settings.display.NightDisplaySettings;
import com.android.settings.display.ScreenZoomSettings;
import com.android.settings.dream.DreamSettings;
import com.android.settings.enterprise.EnterprisePrivacySettings;
import com.android.settings.fuelgauge.BatterySaverSettings;
import com.android.settings.fuelgauge.PowerUsageAdvanced;
import com.android.settings.fuelgauge.PowerUsageSummary;
import com.android.settings.fuelgauge.SmartBatterySettings;
import com.android.settings.gestures.AssistGestureSettings;
import com.android.settings.gestures.DoubleTapPowerSettings;
import com.android.settings.gestures.DoubleTapScreenSettings;
import com.android.settings.gestures.DoubleTwistGestureSettings;
import com.android.settings.gestures.GestureSettings;
import com.android.settings.gestures.PickupGestureSettings;
import com.android.settings.gestures.SwipeToNotificationSettings;
import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
import com.android.settings.inputmethod.PhysicalKeyboardFragment;
import com.android.settings.inputmethod.VirtualKeyboardFragment;
import com.android.settings.language.LanguageAndInputSettings;
import com.android.settings.location.LocationMode;
import com.android.settings.location.LocationSettings;
import com.android.settings.location.ScanningSettings;
import com.android.settings.network.NetworkDashboardFragment;
import com.android.settings.nfc.PaymentSettings;
import com.android.settings.notification.ConfigureNotificationSettings;
import com.android.settings.notification.SoundSettings;
import com.android.settings.notification.ZenModeAutomationSettings;
import com.android.settings.notification.ZenModeBehaviorSettings;
import com.android.settings.notification.ZenModeSettings;
import com.android.settings.print.PrintSettingsFragment;
import com.android.settings.security.EncryptionAndCredential;
import com.android.settings.security.LockscreenDashboardFragment;
import com.android.settings.security.ScreenPinningSettings;
import com.android.settings.security.SecuritySettingsV2;
import com.android.settings.security.screenlock.ScreenLockSettings;
import com.android.settings.sim.SimSettings;
import com.android.settings.support.SupportDashboardActivity;
import com.android.settings.system.ResetDashboardFragment;
import com.android.settings.system.SystemDashboardFragment;
import com.android.settings.tts.TextToSpeechSettings;
import com.android.settings.tts.TtsEnginePreferenceFragment;
import com.android.settings.users.UserSettings;
import com.android.settings.wallpaper.WallpaperTypeSettings;
import com.android.settings.wfd.WifiDisplaySettings;
import com.android.settings.wifi.ConfigureWifiSettings;
import com.android.settings.wifi.WifiSettings;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class SearchIndexableResourcesImpl implements SearchIndexableResources {
private final Set<Class> sProviders = new HashSet<>();
@VisibleForTesting
void addIndex(Class indexClass) {
sProviders.add(indexClass);
}
public SearchIndexableResourcesImpl() {
addIndex(WifiSettings.class);
addIndex(NetworkDashboardFragment.class);
addIndex(ConfigureWifiSettings.class);
addIndex(BluetoothSettings.class);
addIndex(SimSettings.class);
addIndex(DataUsageSummary.class);
addIndex(ScreenZoomSettings.class);
addIndex(DisplaySettings.class);
addIndex(AmbientDisplaySettings.class);
addIndex(WallpaperTypeSettings.class);
addIndex(AppAndNotificationDashboardFragment.class);
addIndex(SoundSettings.class);
addIndex(ZenModeSettings.class);
addIndex(StorageSettings.class);
addIndex(PowerUsageAdvanced.class);
addIndex(DefaultAppSettings.class);
addIndex(ManageAssist.class);
addIndex(SpecialAccessSettings.class);
addIndex(UserSettings.class);
addIndex(AssistGestureSettings.class);
addIndex(PickupGestureSettings.class);
addIndex(DoubleTapScreenSettings.class);
addIndex(DoubleTapPowerSettings.class);
addIndex(DoubleTwistGestureSettings.class);
addIndex(SwipeToNotificationSettings.class);
addIndex(GestureSettings.class);
addIndex(LanguageAndInputSettings.class);
addIndex(LocationSettings.class);
addIndex(LocationMode.class);
addIndex(ScanningSettings.class);
addIndex(SecuritySettingsV2.class);
addIndex(ScreenLockSettings.class);
addIndex(EncryptionAndCredential.class);
addIndex(ScreenPinningSettings.class);
addIndex(UserAndAccountDashboardFragment.class);
addIndex(VirtualKeyboardFragment.class);
addIndex(AvailableVirtualKeyboardFragment.class);
addIndex(PhysicalKeyboardFragment.class);
addIndex(BackupSettingsActivity.class);
addIndex(BackupSettingsFragment.class);
addIndex(DateTimeSettings.class);
addIndex(AccessibilitySettings.class);
addIndex(PrintSettingsFragment.class);
addIndex(DevelopmentSettingsDashboardFragment.class);
addIndex(DeviceInfoSettings.class);
addIndex(LegalSettings.class);
addIndex(SystemDashboardFragment.class);
addIndex(ResetDashboardFragment.class);
addIndex(StorageDashboardFragment.class);
addIndex(ConnectedDeviceDashboardFragment.class);
addIndex(ConnectedDeviceDashboardFragmentOld.class);
addIndex(AdvancedConnectedDeviceDashboardFragment.class);
addIndex(EnterprisePrivacySettings.class);
addIndex(PaymentSettings.class);
addIndex(TextToSpeechSettings.class);
addIndex(TtsEnginePreferenceFragment.class);
addIndex(MagnificationPreferenceFragment.class);
addIndex(AccessibilityShortcutPreferenceFragment.class);
addIndex(DreamSettings.class);
addIndex(SupportDashboardActivity.class);
addIndex(AutomaticStorageManagerSettings.class);
addIndex(ConfigureNotificationSettings.class);
addIndex(PowerUsageSummary.class);
addIndex(BatterySaverSettings.class);
addIndex(LockscreenDashboardFragment.class);
addIndex(WifiDisplaySettings.class);
addIndex(ZenModeBehaviorSettings.class);
addIndex(ZenModeAutomationSettings.class);
addIndex(NightDisplaySettings.class);
addIndex(SmartBatterySettings.class);
}
@Override
public Collection<Class> getProviderValues() {
return sProviders;
}
}

View File

@@ -175,7 +175,8 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
} }
private List<String> getNonIndexableKeysFromProvider(Context context) { private List<String> getNonIndexableKeysFromProvider(Context context) {
final Collection<Class> values = SearchIndexableResources.providerValues(); final Collection<Class> values = FeatureFactory.getFactory(context)
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
final List<String> nonIndexableKeys = new ArrayList<>(); final List<String> nonIndexableKeys = new ArrayList<>();
for (Class<?> clazz : values) { for (Class<?> clazz : values) {
@@ -209,7 +210,8 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
} }
private List<SearchIndexableResource> getSearchIndexableResourcesFromProvider(Context context) { private List<SearchIndexableResource> getSearchIndexableResourcesFromProvider(Context context) {
Collection<Class> values = SearchIndexableResources.providerValues(); Collection<Class> values = FeatureFactory.getFactory(context)
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
List<SearchIndexableResource> resourceList = new ArrayList<>(); List<SearchIndexableResource> resourceList = new ArrayList<>();
for (Class<?> clazz : values) { for (Class<?> clazz : values) {
@@ -236,7 +238,8 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
} }
private List<SearchIndexableRaw> getSearchIndexableRawFromProvider(Context context) { private List<SearchIndexableRaw> getSearchIndexableRawFromProvider(Context context) {
final Collection<Class> values = SearchIndexableResources.providerValues(); final Collection<Class> values = FeatureFactory.getFactory(context)
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
final List<SearchIndexableRaw> rawList = new ArrayList<>(); final List<SearchIndexableRaw> rawList = new ArrayList<>();
for (Class<?> clazz : values) { for (Class<?> clazz : values) {

View File

@@ -27,9 +27,9 @@ import android.util.Log;
import android.util.Xml; import android.util.Xml;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils; import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.Indexable.SearchIndexProvider; import com.android.settings.search.Indexable.SearchIndexProvider;
import com.android.settings.search.SearchIndexableResources;
import com.android.settings.search.XmlParserUtils; import com.android.settings.search.XmlParserUtils;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
@@ -62,7 +62,8 @@ class SliceDataConverter {
* @return a list of {@link SliceData} to be indexed and later referenced as a Slice. * @return a list of {@link SliceData} to be indexed and later referenced as a Slice.
* *
* The collection works as follows: * The collection works as follows:
* - Collects a list of Fragments from {@link SearchIndexableResources}. * - Collects a list of Fragments from
* {@link FeatureFactory#getSearchFeatureProvider()}.
* - From each fragment, grab a {@link SearchIndexProvider}. * - From each fragment, grab a {@link SearchIndexProvider}.
* - For each provider, collect XML resource layout and a list of * - For each provider, collect XML resource layout and a list of
* {@link com.android.settings.core.BasePreferenceController}. * {@link com.android.settings.core.BasePreferenceController}.
@@ -72,7 +73,8 @@ class SliceDataConverter {
return mSliceData; return mSliceData;
} }
final Collection<Class> indexableClasses = SearchIndexableResources.providerValues(); final Collection<Class> indexableClasses = FeatureFactory.getFactory(mContext)
.getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
for (Class clazz : indexableClasses) { for (Class clazz : indexableClasses) {
final String fragmentName = clazz.getName(); final String fragmentName = clazz.getName();

View File

@@ -2,6 +2,8 @@ package com.android.settings.core;
import static com.google.common.truth.Truth.assertWithMessage; import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.Mockito.mock;
import android.content.Context; import android.content.Context;
import android.content.res.XmlResourceParser; import android.content.res.XmlResourceParser;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
@@ -13,10 +15,12 @@ import com.android.settings.R;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.search.DatabaseIndexingUtils; import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableResources; import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.search.XmlParserUtils; import com.android.settings.search.XmlParserUtils;
import com.android.settings.security.SecuritySettings; import com.android.settings.security.SecuritySettings;
import com.android.settings.security.SecuritySettingsV2; import com.android.settings.security.SecuritySettingsV2;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.After; import org.junit.After;
@@ -82,19 +86,21 @@ public class XmlControllerAttributeTest {
+ "IllegalAccessException. Please fix the following classes:\n"; + "IllegalAccessException. Please fix the following classes:\n";
Context mContext; Context mContext;
SearchFeatureProvider mSearchProvider;
private Set<Class> mProviderClassesCopy; private FakeFeatureFactory mFakeFeatureFactory;
@Before @Before
public void setUp() { public void setUp() {
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
mProviderClassesCopy = new HashSet<>(SearchIndexableResources.providerValues()); mSearchProvider = new SearchFeatureProviderImpl();
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
mFakeFeatureFactory.searchFeatureProvider = mSearchProvider;
} }
@After @After
public void cleanUp() { public void cleanUp() {
SearchIndexableResources.providerValues().clear(); mFakeFeatureFactory.searchFeatureProvider = mock(
SearchIndexableResources.providerValues().addAll(mProviderClassesCopy); SearchFeatureProvider.class);
} }
@Test @Test
@@ -156,7 +162,8 @@ public class XmlControllerAttributeTest {
private Set<Integer> getIndexableXml() { private Set<Integer> getIndexableXml() {
Set<Integer> xmlResSet = new HashSet(); Set<Integer> xmlResSet = new HashSet();
Collection<Class> indexableClasses = SearchIndexableResources.providerValues(); Collection<Class> indexableClasses =
mSearchProvider.getSearchIndexableResources().getProviderValues();
indexableClasses.removeAll(illegalClasses); indexableClasses.removeAll(illegalClasses);
for (Class clazz : indexableClasses) { for (Class clazz : indexableClasses) {

View File

@@ -121,7 +121,8 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
continue; continue;
} }
// Must be in SearchProviderRegistry // Must be in SearchProviderRegistry
if (!SearchIndexableResources.providerValues().contains(clazz)) { SearchFeatureProvider provider = new SearchFeatureProviderImpl();
if (!provider.getSearchIndexableResources().getProviderValues().contains(clazz)) {
if (!notInSearchIndexableRegistryGrandfatherList.remove(className)) { if (!notInSearchIndexableRegistryGrandfatherList.remove(className)) {
notInSearchProviderRegistry.add(className); notInSearchProviderRegistry.add(className);
} }

View File

@@ -21,12 +21,14 @@ import static com.google.common.truth.Truth.assertThat;
import static junit.framework.Assert.fail; import static junit.framework.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import android.database.Cursor; import android.database.Cursor;
import android.text.TextUtils; import android.text.TextUtils;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.wifi.WifiSettings; import com.android.settings.wifi.WifiSettings;
@@ -36,49 +38,56 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import java.util.HashSet;
import java.util.Set;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class SearchIndexableResourcesTest { public class SearchIndexableResourcesTest {
Set<Class> sProviderClassCopy; SearchFeatureProviderImpl mSearchProvider;
private FakeFeatureFactory mFakeFeatureFactory;
@Before @Before
public void setUp() { public void setUp() {
sProviderClassCopy = new HashSet<>(SearchIndexableResources.sProviders); mSearchProvider = new SearchFeatureProviderImpl();
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
mFakeFeatureFactory.searchFeatureProvider = mSearchProvider;
} }
@After @After
public void cleanUp() { public void cleanUp() {
SearchIndexableResources.sProviders.clear(); mFakeFeatureFactory.searchFeatureProvider = mock(
SearchIndexableResources.sProviders.addAll(sProviderClassCopy); SearchFeatureProvider.class);
} }
@Test @Test
public void testAddIndex() { public void testAddIndex() {
final Class stringClass = java.lang.String.class; final Class stringClass = java.lang.String.class;
// Confirms that String.class isn't contained in SearchIndexableResources. // Confirms that String.class isn't contained in SearchIndexableResources.
assertThat(SearchIndexableResources.sProviders).doesNotContain(stringClass); assertThat(mSearchProvider.getSearchIndexableResources().getProviderValues())
final int beforeCount = SearchIndexableResources.providerValues().size(); .doesNotContain(stringClass);
final int beforeCount =
mSearchProvider.getSearchIndexableResources().getProviderValues().size();
SearchIndexableResources.addIndex(java.lang.String.class); ( (SearchIndexableResourcesImpl) mSearchProvider.getSearchIndexableResources())
.addIndex(java.lang.String.class);
assertThat(SearchIndexableResources.sProviders).contains(stringClass); assertThat(mSearchProvider.getSearchIndexableResources().getProviderValues())
final int afterCount = SearchIndexableResources.providerValues().size(); .contains(stringClass);
final int afterCount =
mSearchProvider.getSearchIndexableResources().getProviderValues().size();
assertThat(afterCount).isEqualTo(beforeCount + 1); assertThat(afterCount).isEqualTo(beforeCount + 1);
} }
@Test @Test
public void testIndexHasWifiSettings() { public void testIndexHasWifiSettings() {
assertThat(sProviderClassCopy).contains(WifiSettings.class); assertThat(mSearchProvider.getSearchIndexableResources().getProviderValues())
.contains(WifiSettings.class);
} }
@Test @Test
public void testNonIndexableKeys_GetsKeyFromProvider() { public void testNonIndexableKeys_GetsKeyFromProvider() {
SearchIndexableResources.sProviders.clear(); mSearchProvider.getSearchIndexableResources().getProviderValues().clear();
SearchIndexableResources.addIndex(FakeIndexProvider.class); ( (SearchIndexableResourcesImpl) mSearchProvider.getSearchIndexableResources())
.addIndex(FakeIndexProvider.class);
SettingsSearchIndexablesProvider provider = spy(new SettingsSearchIndexablesProvider()); SettingsSearchIndexablesProvider provider = spy(new SettingsSearchIndexablesProvider());
@@ -97,7 +106,7 @@ public class SearchIndexableResourcesTest {
@Test @Test
public void testAllClassNamesHaveProviders() { public void testAllClassNamesHaveProviders() {
for (Class clazz: sProviderClassCopy) { for (Class clazz: mSearchProvider.getSearchIndexableResources().getProviderValues()) {
if(DatabaseIndexingUtils.getSearchIndexProvider(clazz) == null) { if(DatabaseIndexingUtils.getSearchIndexProvider(clazz) == null) {
fail(clazz.getName() + "is not an index provider"); fail(clazz.getName() + "is not an index provider");
} }

View File

@@ -2,6 +2,7 @@ package com.android.settings.search;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import android.Manifest; import android.Manifest;
@@ -14,6 +15,7 @@ import android.provider.SearchIndexablesContract;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.search.indexing.FakeSettingsFragment; import com.android.settings.search.indexing.FakeSettingsFragment;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.After; import org.junit.After;
@@ -23,9 +25,6 @@ import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import java.util.HashSet;
import java.util.Set;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class SettingsSearchIndexablesProviderTest { public class SettingsSearchIndexablesProviderTest {
@@ -33,8 +32,8 @@ public class SettingsSearchIndexablesProviderTest {
private final String BASE_AUTHORITY = "com.android.settings"; private final String BASE_AUTHORITY = "com.android.settings";
private SettingsSearchIndexablesProvider mProvider; private SettingsSearchIndexablesProvider mProvider;
private SearchFeatureProvider mFeatureProvider;
Set<Class> sProviderClasses; private FakeFeatureFactory mFakeFeatureFactory;
Context mContext; Context mContext;
@Before @Before
@@ -49,15 +48,18 @@ public class SettingsSearchIndexablesProviderTest {
info.readPermission = Manifest.permission.READ_SEARCH_INDEXABLES; info.readPermission = Manifest.permission.READ_SEARCH_INDEXABLES;
mProvider.attachInfo(mContext, info); mProvider.attachInfo(mContext, info);
sProviderClasses = new HashSet<>(SearchIndexableResources.sProviders); mFeatureProvider = new SearchFeatureProviderImpl();
SearchIndexableResources.sProviders.clear(); mFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
SearchIndexableResources.sProviders.add(FakeSettingsFragment.class); mFeatureProvider.getSearchIndexableResources().getProviderValues()
.add(FakeSettingsFragment.class);
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
mFakeFeatureFactory.searchFeatureProvider = mFeatureProvider;
} }
@After @After
public void cleanUp() { public void cleanUp() {
SearchIndexableResources.sProviders.clear(); mFakeFeatureFactory.searchFeatureProvider = mock(
SearchIndexableResources.sProviders.addAll(sProviderClasses); SearchFeatureProvider.class);
} }
@Test @Test

View File

@@ -19,6 +19,8 @@ package com.android.settings.slices;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -26,8 +28,9 @@ import android.database.sqlite.SQLiteDatabase;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.search.FakeIndexProvider; import com.android.settings.search.FakeIndexProvider;
import com.android.settings.search.SearchIndexableResources; import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.After; import org.junit.After;
@@ -37,9 +40,6 @@ import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import java.util.HashSet;
import java.util.Set;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class SliceBroadcastReceiverTest { public class SliceBroadcastReceiverTest {
@@ -54,30 +54,30 @@ public class SliceBroadcastReceiverTest {
private Context mContext; private Context mContext;
private SQLiteDatabase mDb; private SQLiteDatabase mDb;
private SliceBroadcastReceiver mReceiver; private SliceBroadcastReceiver mReceiver;
private SearchFeatureProvider mSearchFeatureProvider;
private Set<Class> mProviderClassesCopy; private FakeFeatureFactory mFakeFeatureFactory;
@Before @Before
public void setUp() { public void setUp() {
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
mDb = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase(); mDb = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase();
mReceiver = new SliceBroadcastReceiver(); mReceiver = new SliceBroadcastReceiver();
mProviderClassesCopy = new HashSet<>(SearchIndexableResources.providerValues());
SlicesDatabaseHelper helper = SlicesDatabaseHelper.getInstance(mContext); SlicesDatabaseHelper helper = SlicesDatabaseHelper.getInstance(mContext);
helper.setIndexedState(); helper.setIndexedState();
mSearchFeatureProvider = new SearchFeatureProviderImpl();
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
mFakeFeatureFactory.searchFeatureProvider = mSearchFeatureProvider;
} }
@After @After
public void cleanUp() { public void cleanUp() {
DatabaseTestUtils.clearDb(mContext); mFakeFeatureFactory.searchFeatureProvider = mock(SearchFeatureProvider.class);
SearchIndexableResources.providerValues().clear();
SearchIndexableResources.providerValues().addAll(mProviderClassesCopy);
} }
@Test @Test
public void testOnReceive_toggleChanged() { public void testOnReceive_toggleChanged() {
String key = "key"; String key = "key";
SearchIndexableResources.providerValues().clear(); mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
insertSpecialCase(key); insertSpecialCase(key);
// Turn on toggle setting // Turn on toggle setting
FakeToggleController fakeToggleController = new FakeToggleController(mContext, key); FakeToggleController fakeToggleController = new FakeToggleController(mContext, key);

View File

@@ -18,11 +18,15 @@ package com.android.settings.slices;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import android.content.Context; import android.content.Context;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.search.FakeIndexProvider; import com.android.settings.search.FakeIndexProvider;
import com.android.settings.search.SearchIndexableResources; import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.After; import org.junit.After;
@@ -32,9 +36,7 @@ import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
@@ -49,28 +51,31 @@ public class SliceDataConverterTest {
Context mContext; Context mContext;
private Set<Class> mProviderClassesCopy;
SliceDataConverter mSliceDataConverter; SliceDataConverter mSliceDataConverter;
SearchFeatureProvider mSearchFeatureProvider;
private FakeFeatureFactory mFakeFeatureFactory;
@Before @Before
public void setUp() { public void setUp() {
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
mProviderClassesCopy = new HashSet<>(SearchIndexableResources.providerValues());
mSliceDataConverter = new SliceDataConverter(mContext); mSliceDataConverter = new SliceDataConverter(mContext);
mSearchFeatureProvider = new SearchFeatureProviderImpl();
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
mFakeFeatureFactory.searchFeatureProvider = mSearchFeatureProvider;
} }
@After @After
public void cleanUp() { public void cleanUp() {
SearchIndexableResources.providerValues().clear(); mFakeFeatureFactory.searchFeatureProvider = mock(
SearchIndexableResources.providerValues().addAll(mProviderClassesCopy); SearchFeatureProvider.class);
} }
@Test @Test
@Config(qualifiers = "mcc999") @Config(qualifiers = "mcc999")
public void testFakeProvider_convertsFakeData() { public void testFakeProvider_convertsFakeData() {
SearchIndexableResources.providerValues().clear(); mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
SearchIndexableResources.providerValues().add(FakeIndexProvider.class); mSearchFeatureProvider.getSearchIndexableResources().getProviderValues()
.add(FakeIndexProvider.class);
List<SliceData> sliceDataList = mSliceDataConverter.getSliceData(); List<SliceData> sliceDataList = mSliceDataConverter.getSliceData();

View File

@@ -55,7 +55,6 @@ public class FakeFeatureFactory extends FeatureFactory {
public final LocaleFeatureProvider localeFeatureProvider; public final LocaleFeatureProvider localeFeatureProvider;
public final ApplicationFeatureProvider applicationFeatureProvider; public final ApplicationFeatureProvider applicationFeatureProvider;
public final EnterprisePrivacyFeatureProvider enterprisePrivacyFeatureProvider; public final EnterprisePrivacyFeatureProvider enterprisePrivacyFeatureProvider;
public final SearchFeatureProvider searchFeatureProvider;
public final SurveyFeatureProvider surveyFeatureProvider; public final SurveyFeatureProvider surveyFeatureProvider;
public final SecurityFeatureProvider securityFeatureProvider; public final SecurityFeatureProvider securityFeatureProvider;
public final SuggestionFeatureProvider suggestionsFeatureProvider; public final SuggestionFeatureProvider suggestionsFeatureProvider;
@@ -65,6 +64,7 @@ public class FakeFeatureFactory extends FeatureFactory {
public final DataPlanFeatureProvider dataPlanFeatureProvider; public final DataPlanFeatureProvider dataPlanFeatureProvider;
public final SmsMirroringFeatureProvider smsMirroringFeatureProvider; public final SmsMirroringFeatureProvider smsMirroringFeatureProvider;
public final SlicesFeatureProvider slicesFeatureProvider; public final SlicesFeatureProvider slicesFeatureProvider;
public SearchFeatureProvider searchFeatureProvider;
/** /**
* Call this in {@code @Before} method of the test class to use fake factory. * Call this in {@code @Before} method of the test class to use fake factory.

View File

@@ -26,6 +26,7 @@ import android.support.test.filters.MediumTest;
import android.support.test.runner.AndroidJUnit4; import android.support.test.runner.AndroidJUnit4;
import android.util.ArraySet; import android.util.ArraySet;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils; import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableResources; import com.android.settings.search.SearchIndexableResources;
@@ -54,7 +55,10 @@ public class PreferenceControllerContractTest {
public void controllersInSearchShouldImplementPreferenceControllerMixin() { public void controllersInSearchShouldImplementPreferenceControllerMixin() {
final Set<String> errorClasses = new ArraySet<>(); final Set<String> errorClasses = new ArraySet<>();
for (Class clazz : SearchIndexableResources.providerValues()) { final SearchIndexableResources resources =
FeatureFactory.getFactory(mContext).getSearchFeatureProvider()
.getSearchIndexableResources();
for (Class<?> clazz : resources.getProviderValues()) {
final Indexable.SearchIndexProvider provider = final Indexable.SearchIndexProvider provider =
DatabaseIndexingUtils.getSearchIndexProvider(clazz); DatabaseIndexingUtils.getSearchIndexProvider(clazz);

View File

@@ -31,6 +31,7 @@ import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.util.Xml; import android.util.Xml;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils; import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw; import com.android.settings.search.SearchIndexableRaw;
@@ -100,7 +101,10 @@ public class UniquePreferenceTest {
final Set<String> uniqueKeys = new HashSet<>(); final Set<String> uniqueKeys = new HashSet<>();
final Set<String> nullKeyClasses = new HashSet<>(); final Set<String> nullKeyClasses = new HashSet<>();
final Set<String> duplicatedKeys = new HashSet<>(); final Set<String> duplicatedKeys = new HashSet<>();
for (Class<?> clazz : SearchIndexableResources.providerValues()) { final SearchIndexableResources resources =
FeatureFactory.getFactory(mContext).getSearchFeatureProvider()
.getSearchIndexableResources();
for (Class<?> clazz : resources.getProviderValues()) {
verifyPreferenceKeys(uniqueKeys, duplicatedKeys, nullKeyClasses, clazz); verifyPreferenceKeys(uniqueKeys, duplicatedKeys, nullKeyClasses, clazz);
} }

View File

@@ -32,6 +32,7 @@ import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.util.Xml; import android.util.Xml;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils; import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableResources; import com.android.settings.search.SearchIndexableResources;
@@ -79,7 +80,10 @@ public class UserRestrictionTest {
@Test @Test
public void userRestrictionAttributeShouldBeValid() public void userRestrictionAttributeShouldBeValid()
throws IOException, XmlPullParserException, Resources.NotFoundException { throws IOException, XmlPullParserException, Resources.NotFoundException {
for (Class<?> clazz : SearchIndexableResources.providerValues()) { final SearchIndexableResources resources =
FeatureFactory.getFactory(mContext).getSearchFeatureProvider()
.getSearchIndexableResources();
for (Class<?> clazz : resources.getProviderValues()) {
verifyUserRestriction(clazz); verifyUserRestriction(clazz);
} }
} }