Fix indexing in cast and zen mode settings
- Fragment should either not implement serach provider or return a valid xml. Search provider with 0 resource is invalid. Change-Id: Ie87c739bf72c926cecf48d271c6c2d72459787c4 Fixes: 69864274 Test: robotests
This commit is contained in:
		@@ -14,7 +14,9 @@
 | 
			
		||||
     limitations under the License.
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<PreferenceScreen
 | 
			
		||||
    xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:key="wifi_display_settings_screen"
 | 
			
		||||
    android:title="@string/wifi_display_settings_title">
 | 
			
		||||
 | 
			
		||||
</PreferenceScreen>
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ package com.android.settings.notification;
 | 
			
		||||
 | 
			
		||||
import android.app.Fragment;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.provider.SearchIndexableResource;
 | 
			
		||||
import android.service.notification.ConditionProviderService;
 | 
			
		||||
 | 
			
		||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 | 
			
		||||
@@ -78,17 +79,30 @@ public class ZenModeAutomationSettings extends ZenModeSettingsBase {
 | 
			
		||||
     */
 | 
			
		||||
    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
 | 
			
		||||
            new BaseSearchIndexProvider() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public List<String> getNonIndexableKeys(Context context) {
 | 
			
		||||
            final List<String> keys = super.getNonIndexableKeys(context);
 | 
			
		||||
            keys.add(KEY_ADD_RULE);
 | 
			
		||||
            keys.add(KEY_AUTOMATIC_RULES);
 | 
			
		||||
            return keys;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
 | 
			
		||||
            return buildPreferenceControllers(context, null, null);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
                @Override
 | 
			
		||||
                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
 | 
			
		||||
                        boolean enabled) {
 | 
			
		||||
                    final ArrayList<SearchIndexableResource> result = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
                    final SearchIndexableResource sir = new SearchIndexableResource(context);
 | 
			
		||||
                    sir.xmlResId = R.xml.zen_mode_automation_settings;
 | 
			
		||||
                    result.add(sir);
 | 
			
		||||
                    return result;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public List<String> getNonIndexableKeys(Context context) {
 | 
			
		||||
                    final List<String> keys = super.getNonIndexableKeys(context);
 | 
			
		||||
                    keys.add(KEY_ADD_RULE);
 | 
			
		||||
                    keys.add(KEY_AUTOMATIC_RULES);
 | 
			
		||||
                    return keys;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public List<AbstractPreferenceController> getPreferenceControllers(
 | 
			
		||||
                        Context context) {
 | 
			
		||||
                    return buildPreferenceControllers(context, null, null);
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@
 | 
			
		||||
package com.android.settings.notification;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.provider.SearchIndexableResource;
 | 
			
		||||
 | 
			
		||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 | 
			
		||||
import com.android.settings.R;
 | 
			
		||||
@@ -65,6 +66,18 @@ public class ZenModeBehaviorSettings extends ZenModeSettingsBase implements Inde
 | 
			
		||||
     */
 | 
			
		||||
    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
 | 
			
		||||
            new BaseSearchIndexProvider() {
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
 | 
			
		||||
                        boolean enabled) {
 | 
			
		||||
                    final ArrayList<SearchIndexableResource> result = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
                    final SearchIndexableResource sir = new SearchIndexableResource(context);
 | 
			
		||||
                    sir.xmlResId = R.xml.zen_mode_behavior_settings;
 | 
			
		||||
                    result.add(sir);
 | 
			
		||||
                    return result;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public List<String> getNonIndexableKeys(Context context) {
 | 
			
		||||
                    final List<String> keys = super.getNonIndexableKeys(context);
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,6 @@ import android.content.DialogInterface.OnClickListener;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.provider.SearchIndexableResource;
 | 
			
		||||
import android.service.notification.ConditionProviderService;
 | 
			
		||||
import android.support.v7.preference.DropDownPreference;
 | 
			
		||||
import android.support.v7.preference.Preference;
 | 
			
		||||
@@ -44,15 +43,9 @@ import android.widget.Toast;
 | 
			
		||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 | 
			
		||||
import com.android.settings.R;
 | 
			
		||||
import com.android.settings.SettingsActivity;
 | 
			
		||||
import com.android.settings.search.BaseSearchIndexProvider;
 | 
			
		||||
import com.android.settings.search.Indexable;
 | 
			
		||||
import com.android.settings.widget.SwitchBar;
 | 
			
		||||
import com.android.settingslib.core.AbstractPreferenceController;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public abstract class ZenModeRuleSettingsBase extends ZenModeSettingsBase
 | 
			
		||||
@@ -62,8 +55,6 @@ public abstract class ZenModeRuleSettingsBase extends ZenModeSettingsBase
 | 
			
		||||
 | 
			
		||||
    private static final String KEY_RULE_NAME = "rule_name";
 | 
			
		||||
    private static final String KEY_ZEN_MODE = "zen_mode";
 | 
			
		||||
    private static final String KEY_EVENT_RULE_SETTINGS = "zen_mode_event_rule_settings";
 | 
			
		||||
    private static final String KEY_SCHEDULE_RULE_SETTINGS = "zen_mode_schedule_rule_settings";
 | 
			
		||||
 | 
			
		||||
    protected Context mContext;
 | 
			
		||||
    protected boolean mDisableListeners;
 | 
			
		||||
@@ -306,26 +297,4 @@ public abstract class ZenModeRuleSettingsBase extends ZenModeSettingsBase
 | 
			
		||||
        }
 | 
			
		||||
        mDisableListeners = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * For Search.
 | 
			
		||||
     */
 | 
			
		||||
    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
 | 
			
		||||
            new BaseSearchIndexProvider() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public List<SearchIndexableResource> getXmlResourcesToIndex(
 | 
			
		||||
                        Context context, boolean enabled) {
 | 
			
		||||
                    final SearchIndexableResource sir = new SearchIndexableResource(context);
 | 
			
		||||
                    // not indexable
 | 
			
		||||
                    return Arrays.asList(sir);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public List<String> getNonIndexableKeys(Context context) {
 | 
			
		||||
                    final List<String> keys = super.getNonIndexableKeys(context);
 | 
			
		||||
                    keys.add(KEY_SCHEDULE_RULE_SETTINGS);
 | 
			
		||||
                    keys.add(KEY_EVENT_RULE_SETTINGS);
 | 
			
		||||
                    return keys;
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,6 @@ import com.android.settings.datausage.DataUsageMeteredSettings;
 | 
			
		||||
import com.android.settings.datausage.DataUsageSummary;
 | 
			
		||||
import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
 | 
			
		||||
import com.android.settings.development.DevelopmentSettingsDashboardFragment;
 | 
			
		||||
import com.android.settings.deviceinfo.Status;
 | 
			
		||||
import com.android.settings.deviceinfo.StorageDashboardFragment;
 | 
			
		||||
import com.android.settings.deviceinfo.StorageSettings;
 | 
			
		||||
import com.android.settings.display.AmbientDisplaySettings;
 | 
			
		||||
@@ -69,8 +68,6 @@ 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.ZenModeEventRuleSettings;
 | 
			
		||||
import com.android.settings.notification.ZenModeScheduleRuleSettings;
 | 
			
		||||
import com.android.settings.notification.ZenModeSettings;
 | 
			
		||||
import com.android.settings.print.PrintSettingsFragment;
 | 
			
		||||
import com.android.settings.security.EncryptionAndCredential;
 | 
			
		||||
@@ -86,6 +83,7 @@ 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;
 | 
			
		||||
 | 
			
		||||
@@ -169,10 +167,9 @@ public final class SearchIndexableResources {
 | 
			
		||||
        addIndex(PowerUsageSummary.class);
 | 
			
		||||
        addIndex(BatterySaverSettings.class);
 | 
			
		||||
        addIndex(LockscreenDashboardFragment.class);
 | 
			
		||||
        addIndex(WifiDisplaySettings.class);
 | 
			
		||||
        addIndex(ZenModeBehaviorSettings.class);
 | 
			
		||||
        addIndex(ZenModeAutomationSettings.class);
 | 
			
		||||
        addIndex(ZenModeEventRuleSettings.class);
 | 
			
		||||
        addIndex(ZenModeScheduleRuleSettings.class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private SearchIndexableResources() {
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ import android.net.wifi.p2p.WifiP2pManager.Channel;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.os.Handler;
 | 
			
		||||
import android.os.Looper;
 | 
			
		||||
import android.os.ServiceManager;
 | 
			
		||||
import android.provider.SearchIndexableResource;
 | 
			
		||||
import android.provider.Settings;
 | 
			
		||||
import android.support.v14.preference.SwitchPreference;
 | 
			
		||||
import android.support.v7.preference.ListPreference;
 | 
			
		||||
@@ -63,6 +63,11 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 | 
			
		||||
import com.android.settings.R;
 | 
			
		||||
import com.android.settings.SettingsPreferenceFragment;
 | 
			
		||||
import com.android.settings.dashboard.SummaryLoader;
 | 
			
		||||
import com.android.settings.search.BaseSearchIndexProvider;
 | 
			
		||||
import com.android.settings.search.Indexable;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The Settings screen for WifiDisplay configuration and connection management.
 | 
			
		||||
@@ -72,7 +77,7 @@ import com.android.settings.dashboard.SummaryLoader;
 | 
			
		||||
 * on the system.  In that case, the enable option will not be shown but other
 | 
			
		||||
 * remote display routes will continue to be made available.
 | 
			
		||||
 */
 | 
			
		||||
public final class WifiDisplaySettings extends SettingsPreferenceFragment {
 | 
			
		||||
public final class WifiDisplaySettings extends SettingsPreferenceFragment implements Indexable {
 | 
			
		||||
    private static final String TAG = "WifiDisplaySettings";
 | 
			
		||||
    private static final boolean DEBUG = false;
 | 
			
		||||
 | 
			
		||||
@@ -823,4 +828,18 @@ public final class WifiDisplaySettings extends SettingsPreferenceFragment {
 | 
			
		||||
 | 
			
		||||
    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
 | 
			
		||||
            = (activity, summaryLoader) -> new SummaryProvider(activity, summaryLoader);
 | 
			
		||||
 | 
			
		||||
    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
 | 
			
		||||
            new BaseSearchIndexProvider() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
 | 
			
		||||
                        boolean enabled) {
 | 
			
		||||
                    final ArrayList<SearchIndexableResource> result = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
                    final SearchIndexableResource sir = new SearchIndexableResource(context);
 | 
			
		||||
                    sir.xmlResId = R.xml.wifi_display_settings;
 | 
			
		||||
                    result.add(sir);
 | 
			
		||||
                    return result;
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -19,4 +19,6 @@ com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionMi
 | 
			
		||||
com.android.settings.enterprise.ApplicationListFragment$EnterpriseInstalledPackages
 | 
			
		||||
com.android.settings.enterprise.EnterpriseSetDefaultAppsListFragment
 | 
			
		||||
com.android.settings.wifi.tether.WifiTetherSettings
 | 
			
		||||
com.android.settings.wifi.SavedAccessPointsWifiSettings
 | 
			
		||||
com.android.settings.wifi.SavedAccessPointsWifiSettings
 | 
			
		||||
com.android.settings.notification.ZenModeEventRuleSettings
 | 
			
		||||
com.android.settings.notification.ZenModeScheduleRuleSettings
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,6 @@ com.android.settings.applications.InstalledAppDetails
 | 
			
		||||
com.android.settings.applications.AppInfoDashboardFragment
 | 
			
		||||
com.android.settings.accessibility.ToggleAccessibilityServicePreferenceFragment
 | 
			
		||||
com.android.settings.print.PrintServiceSettingsFragment
 | 
			
		||||
com.android.settings.wfd.WifiDisplaySettings
 | 
			
		||||
com.android.settings.deviceinfo.PrivateVolumeSettings
 | 
			
		||||
com.android.settings.users.AppRestrictionsFragment
 | 
			
		||||
com.android.settings.deviceinfo.PrivateVolumeUnmount
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,9 @@
 | 
			
		||||
 | 
			
		||||
package com.android.settings.search;
 | 
			
		||||
 | 
			
		||||
import static com.google.common.truth.Truth.assertWithMessage;
 | 
			
		||||
 | 
			
		||||
import android.provider.SearchIndexableResource;
 | 
			
		||||
import android.util.ArraySet;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
 | 
			
		||||
@@ -23,13 +26,13 @@ import com.android.settings.SettingsPreferenceFragment;
 | 
			
		||||
import com.android.settings.core.codeinspection.CodeInspector;
 | 
			
		||||
import com.android.settings.dashboard.DashboardFragmentSearchIndexProviderInspector;
 | 
			
		||||
 | 
			
		||||
import org.robolectric.RuntimeEnvironment;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import static com.google.common.truth.Truth.assertWithMessage;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * {@link CodeInspector} to ensure fragments implement search components correctly.
 | 
			
		||||
 */
 | 
			
		||||
@@ -49,6 +52,9 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
 | 
			
		||||
            "Class containing " + DatabaseIndexingManager.FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER
 | 
			
		||||
                    + " must be added to " + SearchIndexableResources.class.getName()
 | 
			
		||||
                    + " 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";
 | 
			
		||||
 | 
			
		||||
    private final List<String> notImplementingIndexableGrandfatherList;
 | 
			
		||||
    private final List<String> notImplementingIndexProviderGrandfatherList;
 | 
			
		||||
@@ -77,6 +83,7 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
 | 
			
		||||
        final Set<String> notImplementingIndexProvider = new ArraySet<>();
 | 
			
		||||
        final Set<String> notInSearchProviderRegistry = new ArraySet<>();
 | 
			
		||||
        final Set<String> notSharingPreferenceControllers = new ArraySet<>();
 | 
			
		||||
        final Set<String> notProvidingValidResource = new ArraySet<>();
 | 
			
		||||
 | 
			
		||||
        for (Class clazz : mClasses) {
 | 
			
		||||
            if (!isConcreteSettingsClass(clazz)) {
 | 
			
		||||
@@ -119,6 +126,10 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
 | 
			
		||||
                    notInSearchProviderRegistry.add(className);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            // Search provider must either don't provider resource xml, or provide valid ones.
 | 
			
		||||
            if (!hasValidResourceFromProvider(clazz)) {
 | 
			
		||||
                notProvidingValidResource.add(className);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Build error messages
 | 
			
		||||
@@ -131,6 +142,8 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
 | 
			
		||||
                notSharingPreferenceControllers);
 | 
			
		||||
        final String notInProviderRegistryError =
 | 
			
		||||
                buildErrorMessage(NOT_IN_INDEXABLE_PROVIDER_REGISTRY, notInSearchProviderRegistry);
 | 
			
		||||
        final String notProvidingValidResourceError = buildErrorMessage(
 | 
			
		||||
                NOT_PROVIDING_VALID_RESOURCE_ERROR, notProvidingValidResource);
 | 
			
		||||
        assertWithMessage(indexableError)
 | 
			
		||||
                .that(notImplementingIndexable)
 | 
			
		||||
                .isEmpty();
 | 
			
		||||
@@ -143,6 +156,9 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
 | 
			
		||||
        assertWithMessage(notInProviderRegistryError)
 | 
			
		||||
                .that(notInSearchProviderRegistry)
 | 
			
		||||
                .isEmpty();
 | 
			
		||||
        assertWithMessage(notProvidingValidResourceError)
 | 
			
		||||
                .that(notProvidingValidResource)
 | 
			
		||||
                .isEmpty();
 | 
			
		||||
        assertNoObsoleteInGrandfatherList("grandfather_not_implementing_indexable",
 | 
			
		||||
                notImplementingIndexableGrandfatherList);
 | 
			
		||||
        assertNoObsoleteInGrandfatherList("grandfather_not_implementing_index_provider",
 | 
			
		||||
@@ -168,6 +184,28 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean hasValidResourceFromProvider(Class clazz) {
 | 
			
		||||
        try {
 | 
			
		||||
            final Indexable.SearchIndexProvider provider =
 | 
			
		||||
                    DatabaseIndexingUtils.getSearchIndexProvider(clazz);
 | 
			
		||||
            final List<SearchIndexableResource> resources = provider.getXmlResourcesToIndex(
 | 
			
		||||
                    RuntimeEnvironment.application, true /* enabled */);
 | 
			
		||||
            if (resources == null) {
 | 
			
		||||
                // No resource, that's fine.
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
            for (SearchIndexableResource res : resources) {
 | 
			
		||||
                if (res.xmlResId == 0) {
 | 
			
		||||
                    // Invalid resource
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            // Ignore.
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String buildErrorMessage(String errorSummary, Set<String> errorClasses) {
 | 
			
		||||
        final StringBuilder error = new StringBuilder(errorSummary);
 | 
			
		||||
        for (String c : errorClasses) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user