diff --git a/res/xml/accessibility_magnification_settings.xml b/res/xml/accessibility_magnification_settings.xml index bb403948105..74156440e4a 100644 --- a/res/xml/accessibility_magnification_settings.xml +++ b/res/xml/accessibility_magnification_settings.xml @@ -17,8 +17,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:key="magnification_preference_screen_title" - android:title="@string/accessibility_screen_magnification_title" - settings:searchable="false"> + android:title="@string/accessibility_screen_magnification_title"> diff --git a/res/xml/accessibility_ring_vibration_settings.xml b/res/xml/accessibility_ring_vibration_settings.xml index 078f76c2ce8..121eb89a712 100644 --- a/res/xml/accessibility_ring_vibration_settings.xml +++ b/res/xml/accessibility_ring_vibration_settings.xml @@ -17,4 +17,5 @@ diff --git a/res/xml/accessibility_shortcut_service_settings.xml b/res/xml/accessibility_shortcut_service_settings.xml index 573939a21b2..b2f13273c27 100644 --- a/res/xml/accessibility_shortcut_service_settings.xml +++ b/res/xml/accessibility_shortcut_service_settings.xml @@ -17,4 +17,5 @@ diff --git a/res/xml/accessibility_shortcut_settings.xml b/res/xml/accessibility_shortcut_settings.xml index f431dec1e5c..9e1d26f58f8 100644 --- a/res/xml/accessibility_shortcut_settings.xml +++ b/res/xml/accessibility_shortcut_settings.xml @@ -15,6 +15,7 @@ --> diff --git a/res/xml/app_and_notification.xml b/res/xml/app_and_notification.xml index f75bd8629ae..9256f50fbb4 100644 --- a/res/xml/app_and_notification.xml +++ b/res/xml/app_and_notification.xml @@ -79,6 +79,7 @@ android:key="app_and_notif_cell_broadcast_settings" android:title="@string/cell_broadcast_settings" android:order="15" + settings:searchable="false" settings:useAdminDisabledSummary="true"> diff --git a/res/xml/bluetooth_pairing_detail.xml b/res/xml/bluetooth_pairing_detail.xml index 86fb9e43d44..cd9c32457e9 100644 --- a/res/xml/bluetooth_pairing_detail.xml +++ b/res/xml/bluetooth_pairing_detail.xml @@ -17,6 +17,7 @@ \ No newline at end of file diff --git a/res/xml/current_dream_settings.xml b/res/xml/current_dream_settings.xml index d95e830f523..b3f3f9fb1a2 100644 --- a/res/xml/current_dream_settings.xml +++ b/res/xml/current_dream_settings.xml @@ -17,4 +17,5 @@ diff --git a/res/xml/default_voice_settings.xml b/res/xml/default_voice_settings.xml index f75b5ed4271..511294c72c5 100644 --- a/res/xml/default_voice_settings.xml +++ b/res/xml/default_voice_settings.xml @@ -17,4 +17,5 @@ diff --git a/res/xml/enterprise_set_default_apps_settings.xml b/res/xml/enterprise_set_default_apps_settings.xml index 474a5c92767..12eca8a10c9 100644 --- a/res/xml/enterprise_set_default_apps_settings.xml +++ b/res/xml/enterprise_set_default_apps_settings.xml @@ -17,7 +17,8 @@ + android:key="enterprise_set_default_apps_settings" + android:title="@string/enterprise_privacy_enterprise_set_default_apps"> diff --git a/res/xml/network_scorer_picker_prefs.xml b/res/xml/network_scorer_picker_prefs.xml index fab69e76f87..7d1fe462c2e 100644 --- a/res/xml/network_scorer_picker_prefs.xml +++ b/res/xml/network_scorer_picker_prefs.xml @@ -17,5 +17,6 @@ \ No newline at end of file diff --git a/res/xml/spellchecker_prefs.xml b/res/xml/spellchecker_prefs.xml index 666b0a9b0c1..26476f46635 100644 --- a/res/xml/spellchecker_prefs.xml +++ b/res/xml/spellchecker_prefs.xml @@ -16,6 +16,7 @@ diff --git a/res/xml/vr_display_settings.xml b/res/xml/vr_display_settings.xml index d04435ac810..9522af5b74b 100644 --- a/res/xml/vr_display_settings.xml +++ b/res/xml/vr_display_settings.xml @@ -17,4 +17,5 @@ diff --git a/res/xml/webview_app_settings.xml b/res/xml/webview_app_settings.xml index c7a611ace8b..51e472dc101 100644 --- a/res/xml/webview_app_settings.xml +++ b/res/xml/webview_app_settings.xml @@ -17,4 +17,5 @@ diff --git a/res/xml/when_to_dream_settings.xml b/res/xml/when_to_dream_settings.xml index 7b91a34b322..13f5ae49f23 100644 --- a/res/xml/when_to_dream_settings.xml +++ b/res/xml/when_to_dream_settings.xml @@ -17,4 +17,5 @@ diff --git a/res/xml/wifi_p2p_settings.xml b/res/xml/wifi_p2p_settings.xml index 405d0810c81..f59479736e8 100644 --- a/res/xml/wifi_p2p_settings.xml +++ b/res/xml/wifi_p2p_settings.xml @@ -16,6 +16,7 @@ + android:title="@string/wifi_hotspot_checkbox_text"> + android:title="@string/zen_mode_settings_title"> getNonIndexableKeys(Context context) { - List keys = super.getNonIndexableKeys(context); - keys.add(KEY_ASSIST); - return keys; - } }; } diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDetail.java b/src/com/android/settings/bluetooth/BluetoothPairingDetail.java index 2e0e9b5c2ff..f220b8b1da0 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingDetail.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingDetail.java @@ -29,14 +29,17 @@ import android.widget.Toast; import androidx.annotation.VisibleForTesting; import com.android.settings.R; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.bluetooth.BluetoothDeviceFilter; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.search.Indexable; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.FooterPreference; /** * BluetoothPairingDetail is a page to scan bluetooth devices and pair them. */ +@SearchIndexable public class BluetoothPairingDetail extends DeviceListPreferenceFragment implements Indexable { private static final String TAG = "BluetoothPairingDetail"; @@ -233,4 +236,7 @@ public class BluetoothPairingDetail extends DeviceListPreferenceFragment impleme Toast.makeText(getContext(), R.string.connected_device_bluetooth_turned_on_toast, Toast.LENGTH_SHORT).show(); } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.bluetooth_pairing_detail); } diff --git a/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java b/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java index 1db2b86bc09..e7adf7f2a49 100644 --- a/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java +++ b/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java @@ -35,7 +35,9 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.applications.defaultapps.DefaultAppPickerFragment; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.applications.DefaultAppInfo; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.FooterPreference; import java.util.ArrayList; @@ -44,6 +46,7 @@ import java.util.List; /** * Picker for BugReportHandler. */ +@SearchIndexable public class BugReportHandlerPicker extends DefaultAppPickerFragment { private static final String TAG = "BugReportHandlerPicker"; @@ -202,4 +205,7 @@ public class BugReportHandlerPicker extends DefaultAppPickerFragment { return super.loadLabel(); } } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.bug_report_handler_settings); } diff --git a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java index 12e978ff349..2d6a098f9b8 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java @@ -30,7 +30,9 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.Utils; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.RadioButtonPickerFragment; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.RadioButtonPreference; @@ -42,6 +44,7 @@ import java.util.List; /** * Provides options for selecting the default USB mode. */ +@SearchIndexable public class UsbDefaultFragment extends RadioButtonPickerFragment { @VisibleForTesting UsbBackend mUsbBackend; @@ -192,4 +195,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { } } } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.usb_default_fragment); } \ No newline at end of file diff --git a/src/com/android/settings/core/PreferenceXmlParserUtils.java b/src/com/android/settings/core/PreferenceXmlParserUtils.java index 240426d69d9..35f7ebbefe5 100644 --- a/src/com/android/settings/core/PreferenceXmlParserUtils.java +++ b/src/com/android/settings/core/PreferenceXmlParserUtils.java @@ -89,6 +89,7 @@ public class PreferenceXmlParserUtils { int FLAG_NEED_PREF_APPEND = 1 << 10; int FLAG_UNAVAILABLE_SLICE_SUBTITLE = 1 << 11; int FLAG_FOR_WORK = 1 << 12; + int FLAG_NEED_FRAGMENT = 1 << 13; } public static final String METADATA_PREF_TYPE = "type"; @@ -102,6 +103,7 @@ public class PreferenceXmlParserUtils { public static final String METADATA_APPEND = "staticPreferenceLocation"; public static final String METADATA_UNAVAILABLE_SLICE_SUBTITLE = "unavailable_slice_subtitle"; public static final String METADATA_FOR_WORK = "for_work"; + public static final String METADATA_FRAGMENT = "fragment"; private static final String ENTRIES_SEPARATOR = "|"; @@ -250,6 +252,10 @@ public class PreferenceXmlParserUtils { preferenceMetadata.putBoolean(METADATA_FOR_WORK, isForWork(preferenceAttributes)); } + if (hasFlag(flags, MetadataFlag.FLAG_NEED_FRAGMENT)) { + preferenceMetadata.putString(METADATA_FRAGMENT, + getFragment(preferenceAttributes)); + } metadata.add(preferenceMetadata); preferenceAttributes.recycle(); @@ -340,4 +346,9 @@ public class PreferenceXmlParserUtils { return styledAttributes.getBoolean( R.styleable.Preference_forWork, false); } + + private static String getFragment(TypedArray styledAttributes) { + return styledAttributes.getString( + com.android.internal.R.styleable.Preference_fragment); + } } \ No newline at end of file diff --git a/src/com/android/settings/datetime/timezone/TimeZoneSettings.java b/src/com/android/settings/datetime/timezone/TimeZoneSettings.java index ab4c176e119..8226a6ca5d8 100644 --- a/src/com/android/settings/datetime/timezone/TimeZoneSettings.java +++ b/src/com/android/settings/datetime/timezone/TimeZoneSettings.java @@ -39,7 +39,9 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.datetime.timezone.model.FilteredCountryTimeZones; import com.android.settings.datetime.timezone.model.TimeZoneData; import com.android.settings.datetime.timezone.model.TimeZoneDataLoader; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Date; @@ -51,6 +53,7 @@ import java.util.Set; /** * The class displays a time zone picker either by regions or fixed offset time zones. */ +@SearchIndexable public class TimeZoneSettings extends DashboardFragment { private static final String TAG = "TimeZoneSettings"; @@ -387,4 +390,7 @@ public class TimeZoneSettings extends DashboardFragment { private String getLocaleRegionId() { return mLocale.getCountry().toUpperCase(Locale.US); } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.time_zone_prefs); } diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java index 0de9f67be36..c04b51c6bd6 100644 --- a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java +++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java @@ -163,7 +163,7 @@ public class AutomaticStorageManagerSettings extends DashboardFragment /** For Search. */ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider() { + new BaseSearchIndexProvider(R.xml.automatic_storage_management_settings) { @Override protected boolean isPageSearchEnabled(Context context) { return false; diff --git a/src/com/android/settings/development/compat/PlatformCompatDashboard.java b/src/com/android/settings/development/compat/PlatformCompatDashboard.java index dab45f2d123..2b0c655416f 100644 --- a/src/com/android/settings/development/compat/PlatformCompatDashboard.java +++ b/src/com/android/settings/development/compat/PlatformCompatDashboard.java @@ -43,6 +43,8 @@ import com.android.internal.compat.IPlatformCompat; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.development.AppPicker; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -53,6 +55,7 @@ import java.util.TreeMap; /** * Dashboard for Platform Compat preferences. */ +@SearchIndexable public class PlatformCompatDashboard extends DashboardFragment { private static final String TAG = "PlatformCompatDashboard"; private static final String COMPAT_APP = "compat_app"; @@ -273,4 +276,7 @@ public class PlatformCompatDashboard extends DashboardFragment { return true; } } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.platform_compat_settings); } diff --git a/src/com/android/settings/deviceinfo/legal/ModuleLicensesDashboard.java b/src/com/android/settings/deviceinfo/legal/ModuleLicensesDashboard.java index f74b68f923e..150dfff4d4d 100644 --- a/src/com/android/settings/deviceinfo/legal/ModuleLicensesDashboard.java +++ b/src/com/android/settings/deviceinfo/legal/ModuleLicensesDashboard.java @@ -20,7 +20,13 @@ import android.app.settings.SettingsEnums; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; +/** + * Settings screen for mainline module licenses + */ +@SearchIndexable public class ModuleLicensesDashboard extends DashboardFragment { private static final String TAG = "ModuleLicensesDashboard"; @@ -43,4 +49,7 @@ public class ModuleLicensesDashboard extends DashboardFragment { public int getHelpResource() { return 0; } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.module_licenses); } diff --git a/src/com/android/settings/display/VrDisplayPreferencePicker.java b/src/com/android/settings/display/VrDisplayPreferencePicker.java index 4612779ba5d..24102b07eb0 100644 --- a/src/com/android/settings/display/VrDisplayPreferencePicker.java +++ b/src/com/android/settings/display/VrDisplayPreferencePicker.java @@ -23,12 +23,18 @@ import android.provider.Settings; import android.text.TextUtils; import com.android.settings.R; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.RadioButtonPickerFragment; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.CandidateInfo; import java.util.ArrayList; import java.util.List; +/** + * Settings picker screen to what display preferences are applied when device is in VR mode + */ +@SearchIndexable public class VrDisplayPreferencePicker extends RadioButtonPickerFragment { static final String PREF_KEY_PREFIX = "vr_display_pref_"; @@ -102,4 +108,7 @@ public class VrDisplayPreferencePicker extends RadioButtonPickerFragment { return PREF_KEY_PREFIX + value; } } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.vr_display_settings); } diff --git a/src/com/android/settings/dream/CurrentDreamPicker.java b/src/com/android/settings/dream/CurrentDreamPicker.java index 3134e79ffdb..0ff7ee9638a 100644 --- a/src/com/android/settings/dream/CurrentDreamPicker.java +++ b/src/com/android/settings/dream/CurrentDreamPicker.java @@ -22,9 +22,11 @@ import android.content.Context; import android.graphics.drawable.Drawable; import com.android.settings.R; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settingslib.dream.DreamBackend; import com.android.settingslib.dream.DreamBackend.DreamInfo; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.CandidateInfo; import java.util.HashMap; @@ -32,6 +34,10 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +/** + * Settings picker screen for current screen saver + */ +@SearchIndexable public final class CurrentDreamPicker extends RadioButtonPickerFragment { private DreamBackend mBackend; @@ -122,4 +128,7 @@ public final class CurrentDreamPicker extends RadioButtonPickerFragment { return key; } } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.current_dream_settings); } diff --git a/src/com/android/settings/dream/WhenToDreamPicker.java b/src/com/android/settings/dream/WhenToDreamPicker.java index 1c5e25ebac2..7208154a44c 100644 --- a/src/com/android/settings/dream/WhenToDreamPicker.java +++ b/src/com/android/settings/dream/WhenToDreamPicker.java @@ -21,13 +21,19 @@ import android.content.Context; import android.graphics.drawable.Drawable; import com.android.settings.R; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settingslib.dream.DreamBackend; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.CandidateInfo; import java.util.ArrayList; import java.util.List; +/** + * Settings screen for decide when to start screen saver + */ +@SearchIndexable public class WhenToDreamPicker extends RadioButtonPickerFragment { private static final String TAG = "WhenToDreamPicker"; @@ -120,4 +126,7 @@ public class WhenToDreamPicker extends RadioButtonPickerFragment { return key; } } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.when_to_dream_settings); } diff --git a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragment.java b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragment.java index 67bf68786a6..9ccbcef3df7 100644 --- a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragment.java +++ b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragment.java @@ -21,7 +21,9 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -29,6 +31,7 @@ import java.util.List; /** * Fragment for displaying a list of default applications set by profile or device admin. */ +@SearchIndexable public class EnterpriseSetDefaultAppsListFragment extends DashboardFragment { static final String TAG = "EnterprisePrivacySettings"; @@ -56,4 +59,7 @@ public class EnterpriseSetDefaultAppsListFragment extends DashboardFragment { controllers.add(controller); return controllers; } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.enterprise_set_default_apps_settings); } diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java index 507c36949d5..cc870c71cf6 100644 --- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java +++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java @@ -34,8 +34,10 @@ import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settingslib.fuelgauge.BatterySaverUtils; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.RadioButtonPreference; @@ -53,6 +55,7 @@ import java.util.List; * {@link BatterySaverScheduleSeekBarController} for the controller that manages user * interactions in this screen. */ +@SearchIndexable public class BatterySaverScheduleSettings extends RadioButtonPickerFragment { public BatterySaverScheduleRadioButtonsController mRadioButtonController; @@ -207,4 +210,7 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment { return mSummary; } } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.battery_saver_schedule_settings); } \ No newline at end of file diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java index 763efaf9f17..412a92a25b0 100644 --- a/src/com/android/settings/gestures/GestureSettings.java +++ b/src/com/android/settings/gestures/GestureSettings.java @@ -75,12 +75,5 @@ public class GestureSettings extends DashboardFragment { sir.xmlResId = R.xml.gestures; return Arrays.asList(sir); } - - @Override - protected boolean isPageSearchEnabled(Context context) { - // All rows in this screen can lead to a different page, so suppress everything - // from this page to remove duplicates. - return false; - } }; } diff --git a/src/com/android/settings/inputmethod/SpellCheckersSettings.java b/src/com/android/settings/inputmethod/SpellCheckersSettings.java index 974f2c41eaa..1f10e4f7f9e 100644 --- a/src/com/android/settings/inputmethod/SpellCheckersSettings.java +++ b/src/com/android/settings/inputmethod/SpellCheckersSettings.java @@ -37,9 +37,15 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.SwitchBar; import com.android.settings.widget.SwitchBar.OnSwitchChangeListener; +import com.android.settingslib.search.SearchIndexable; +/** + * Settings screen for spell checker + */ +@SearchIndexable public class SpellCheckersSettings extends SettingsPreferenceFragment implements OnSwitchChangeListener, OnPreferenceClickListener, OnPreferenceChangeListener { private static final String TAG = SpellCheckersSettings.class.getSimpleName(); @@ -274,4 +280,7 @@ public class SpellCheckersSettings extends SettingsPreferenceFragment } updatePreferenceScreen(); } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.spellchecker_prefs); } diff --git a/src/com/android/settings/network/NetworkScorerPicker.java b/src/com/android/settings/network/NetworkScorerPicker.java index 9ecab3bfb6f..effa38ab96f 100644 --- a/src/com/android/settings/network/NetworkScorerPicker.java +++ b/src/com/android/settings/network/NetworkScorerPicker.java @@ -31,6 +31,8 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.InstrumentedPreferenceFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.RadioButtonPreference; import java.util.List; @@ -38,6 +40,7 @@ import java.util.List; /** * Fragment for choosing default network scorer. */ +@SearchIndexable public class NetworkScorerPicker extends InstrumentedPreferenceFragment implements RadioButtonPreference.OnClickListener { @@ -142,4 +145,7 @@ public class NetworkScorerPicker extends InstrumentedPreferenceFragment implemen NetworkScoreManager createNetworkScorerManager(Context context) { return (NetworkScoreManager) context.getSystemService(Context.NETWORK_SCORE_SERVICE); } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.network_scorer_picker_prefs); } diff --git a/src/com/android/settings/security/LockscreenDashboardFragment.java b/src/com/android/settings/security/LockscreenDashboardFragment.java index 29b114a3183..8098b803f95 100644 --- a/src/com/android/settings/security/LockscreenDashboardFragment.java +++ b/src/com/android/settings/security/LockscreenDashboardFragment.java @@ -57,9 +57,6 @@ public class LockscreenDashboardFragment extends DashboardFragment @VisibleForTesting static final String KEY_LOCK_SCREEN_NOTIFICATON_WORK_PROFILE = "security_setting_lock_screen_notif_work"; - @VisibleForTesting - static final String KEY_ADD_USER_FROM_LOCK_SCREEN = - "security_lockscreen_add_users_when_locked"; private AmbientDisplayConfiguration mConfig; @@ -141,13 +138,6 @@ public class LockscreenDashboardFragment extends DashboardFragment return controllers; } - @Override - public List getNonIndexableKeys(Context context) { - final List niks = super.getNonIndexableKeys(context); - niks.add(KEY_ADD_USER_FROM_LOCK_SCREEN); - return niks; - } - @Override protected boolean isPageSearchEnabled(Context context) { return new LockScreenPreferenceController(context, "anykey") diff --git a/src/com/android/settings/webview/WebViewAppPicker.java b/src/com/android/settings/webview/WebViewAppPicker.java index b1dfd1454f9..e7d7ea3be13 100644 --- a/src/com/android/settings/webview/WebViewAppPicker.java +++ b/src/com/android/settings/webview/WebViewAppPicker.java @@ -33,11 +33,17 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.applications.defaultapps.DefaultAppPickerFragment; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.applications.DefaultAppInfo; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +/** + * Settings picker screen to handle Web implementation + */ +@SearchIndexable public class WebViewAppPicker extends DefaultAppPickerFragment { private WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper; @@ -164,4 +170,7 @@ public class WebViewAppPicker extends DefaultAppPickerFragment { } return null; } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.webview_app_settings); } diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java index 8544a53cdb3..f965e208c7b 100644 --- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java +++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java @@ -56,14 +56,17 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; -/* +/** * Displays Wi-fi p2p settings UI */ +@SearchIndexable public class WifiP2pSettings extends DashboardFragment implements PersistentGroupInfoListener, PeerListListener, DeviceInfoListener { @@ -631,4 +634,7 @@ public class WifiP2pSettings extends DashboardFragment }); } } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.wifi_p2p_settings); } diff --git a/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java index 863e87a268e..ab2aada6392 100644 --- a/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java +++ b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java @@ -27,14 +27,17 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.SubSettingLauncher; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.wifi.WifiSettings; import com.android.settings.wifi.details.WifiNetworkDetailsFragment; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.wifi.AccessPoint; import com.android.settingslib.wifi.AccessPointPreference; /** * UI to manage saved networks/access points. */ +@SearchIndexable public class SavedAccessPointsWifiSettings extends DashboardFragment { private static final String TAG = "SavedAccessPoints"; @@ -130,4 +133,7 @@ public class SavedAccessPointsWifiSettings extends DashboardFragment { outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState); } } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.wifi_display_saved_access_points); } diff --git a/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2.java b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2.java index 0145bb48d32..16bb2ccd23c 100644 --- a/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2.java +++ b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2.java @@ -37,8 +37,10 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.SubSettingLauncher; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.wifi.WifiSettings; import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2; +import com.android.settingslib.search.SearchIndexable; import com.android.wifitrackerlib.SavedNetworkTracker; import java.time.Clock; @@ -47,6 +49,7 @@ import java.time.ZoneOffset; /** * UI to manage saved networks/access points. */ +@SearchIndexable public class SavedAccessPointsWifiSettings2 extends DashboardFragment implements SavedNetworkTracker.SavedNetworkTrackerCallback { @@ -164,4 +167,7 @@ public class SavedAccessPointsWifiSettings2 extends DashboardFragment use(SubscribedAccessPointsPreferenceController2.class) .displayPreference(screen, mSavedNetworkTracker.getSubscriptionWifiEntries()); } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.wifi_display_saved_access_points2); } diff --git a/tests/robotests/assets/grandfather_fragment_not_searchable b/tests/robotests/assets/grandfather_fragment_not_searchable new file mode 100644 index 00000000000..7488d5f152c --- /dev/null +++ b/tests/robotests/assets/grandfather_fragment_not_searchable @@ -0,0 +1,20 @@ +com.android.settings.backup.ToggleBackupSettingFragment +com.android.settings.applications.RunningServices +com.android.settings.applications.ConvertToFbe +com.android.settings.applications.appops.BackgroundCheckSummary +com.android.settings.fuelgauge.InactiveApps +com.android.settings.ResetNetwork +com.android.settings.MasterClear +com.android.settings.applications.manageapplications.ManageApplications +com.android.settings.enterprise.ApplicationListFragment$EnterpriseInstalledPackages +com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionLocation +com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionMicrophone +com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionCamera +com.android.settings.vpn2.VpnSettings +com.android.settings.security.CryptKeeperSettings +com.android.settings.TrustedCredentialsSettings +com.android.settings.UserCredentialsSettings +com.android.settings.applications.defaultapps.DefaultAutofillPicker +com.android.phone.NetworkSelectSetting +com.android.settings.accessibility.ToggleScreenMagnificationPreferenceFragment +com.android.settings.nfc.AndroidBeam \ No newline at end of file diff --git a/tests/robotests/assets/grandfather_not_implementing_index_provider b/tests/robotests/assets/grandfather_not_implementing_index_provider index 80e179a1cc8..8aa12889553 100644 --- a/tests/robotests/assets/grandfather_not_implementing_index_provider +++ b/tests/robotests/assets/grandfather_not_implementing_index_provider @@ -17,7 +17,6 @@ com.android.settings.applications.AppLaunchSettings com.android.settings.applications.AppStorageSettings com.android.settings.applications.ConfirmConvertToFbe com.android.settings.applications.ProcessStatsDetail -com.android.settings.applications.ProcessStatsSummary com.android.settings.applications.ProcessStatsUi com.android.settings.applications.RunningServices com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetails @@ -26,7 +25,6 @@ com.android.settings.applications.UsageAccessDetails com.android.settings.backup.ToggleBackupSettingFragment com.android.settings.biometrics.fingerprint.FingerprintSettings$FingerprintSettingsFragment com.android.settings.bluetooth.BluetoothDeviceDetailsFragment -com.android.settings.bluetooth.BluetoothPairingDetail com.android.settings.bluetooth.DevicePickerFragment com.android.settings.dashboard.profileselector.ProfileSelectAccountFragment com.android.settings.dashboard.profileselector.ProfileSelectManageApplications @@ -34,24 +32,19 @@ com.android.settings.dashboard.profileselector.ProfileSelectLocationFragment com.android.settings.datausage.AppDataUsage com.android.settings.datausage.DataUsageList com.android.settings.datausage.DataUsageSummary -com.android.settings.datetime.timezone.TimeZoneSettings -com.android.settings.development.compat.PlatformCompatDashboard com.android.settings.deviceinfo.PrivateVolumeSettings com.android.settings.deviceinfo.PublicVolumeSettings com.android.settings.deviceinfo.StorageProfileFragment -com.android.settings.deviceinfo.legal.ModuleLicensesDashboard com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionCamera com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionLocation com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionMicrophone com.android.settings.enterprise.ApplicationListFragment$EnterpriseInstalledPackages -com.android.settings.enterprise.EnterpriseSetDefaultAppsListFragment com.android.settings.fuelgauge.AdvancedPowerUsageDetail com.android.settings.fuelgauge.InactiveApps com.android.settings.fuelgauge.RestrictedAppDetails com.android.settings.IccLockSettings com.android.settings.inputmethod.InputMethodAndSubtypeEnabler com.android.settings.inputmethod.KeyboardLayoutPickerFragment -com.android.settings.inputmethod.SpellCheckersSettings com.android.settings.location.LocationPersonalSettings com.android.settings.location.LocationWorkProfileSettings com.android.settings.network.ApnEditor @@ -88,10 +81,7 @@ com.android.settings.wifi.ChangeWifiStateDetails com.android.settings.wifi.calling.WifiCallingSettingsForSub com.android.settings.wifi.details.WifiNetworkDetailsFragment com.android.settings.wifi.dpp.WifiNetworkListFragment -com.android.settings.wifi.p2p.WifiP2pSettings -com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings com.android.settings.wifi.WifiInfo com.android.settings.applications.specialaccess.notificationaccess.NotificationAccessDetails com.android.settings.wifi.details2.WifiNetworkDetailsFragment2 -com.android.settings.wifi.savedaccesspoints2.SavedAccessPointsWifiSettings2 com.android.settings.dashboard.profileselector.ProfileSelectRecentLocationRequestFragment diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java index 778bb79c5b2..4a6816ff393 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java @@ -81,7 +81,7 @@ public class ConnectedDeviceDashboardFragmentTest { final List niks = ConnectedDeviceDashboardFragment.SEARCH_INDEX_DATA_PROVIDER .getNonIndexableKeys(mContext); - assertThat(niks).containsExactly(KEY_CONNECTED_DEVICES, KEY_AVAILABLE_DEVICES, + assertThat(niks).containsAllOf(KEY_CONNECTED_DEVICES, KEY_AVAILABLE_DEVICES, KEY_NEARBY_DEVICES, KEY_DISCOVERABLE_FOOTER); } diff --git a/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java b/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java index 44b0187e47b..bbbeeb800ee 100644 --- a/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java +++ b/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import com.android.settings.core.BasePreferenceControllerSignatureInspector; import com.android.settings.core.instrumentation.InstrumentableFragmentCodeInspector; +import com.android.settings.search.FragmentSearchIndexableCodeInspector; import com.android.settings.search.SearchIndexProviderCodeInspector; import com.android.settings.slices.SliceControllerInXmlCodeInspector; @@ -71,4 +72,9 @@ public class CodeInspectionTest { public void runLifecycleObserverInspection() { new LifecycleObserverCodeInspector(mClasses).run(); } + + @Test + public void runFragmentIndexableInspection() throws Exception { + new FragmentSearchIndexableCodeInspector(mClasses).run(); + } } diff --git a/tests/robotests/src/com/android/settings/search/FragmentSearchIndexableCodeInspector.java b/tests/robotests/src/com/android/settings/search/FragmentSearchIndexableCodeInspector.java new file mode 100644 index 00000000000..a24a64359d3 --- /dev/null +++ b/tests/robotests/src/com/android/settings/search/FragmentSearchIndexableCodeInspector.java @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2019 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 static com.android.settings.core.PreferenceXmlParserUtils.METADATA_FRAGMENT; + +import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth.assertWithMessage; + +import android.content.Context; +import android.os.Bundle; +import android.provider.SearchIndexableResource; +import android.text.TextUtils; + +import com.android.settings.core.InstrumentedPreferenceFragment; +import com.android.settings.core.PreferenceXmlParserUtils; +import com.android.settings.core.codeinspection.CodeInspector; +import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.search.Indexable; +import com.android.settingslib.search.SearchIndexable; +import com.android.settingslib.search.SearchIndexableData; + +import org.robolectric.RuntimeEnvironment; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * {@link CodeInspector} to ensure preferences with fragments implement search components correctly. + */ +public class FragmentSearchIndexableCodeInspector extends CodeInspector { + + private final String mErrorNonIndexFragments = + "The following fragments were used by 'android:fragment=Fragment_Class_Name' in " + + "corresponding caller preference Xml. This preference won't be searchable, " + + "the fragment should implement SearchIndexable for Settings Search. If it " + + "should not be searchable, add the fragment's classname to " + + "grandfather_fragment_not_searchable. Fragments:\n"; + + private final Context mContext; + private final List mXmlDeclaredFragments = new ArrayList<>(); + private final List mGrandfatherNotSearchIndesable = new ArrayList<>(); + + public FragmentSearchIndexableCodeInspector(List> classes) throws Exception { + super(classes); + mContext = RuntimeEnvironment.application; + + initDeclaredFragments(); + initializeGrandfatherList(mGrandfatherNotSearchIndesable, + "grandfather_fragment_not_searchable"); + } + + @Override + public void run() { + for (Class clazz : mClasses) { + if (!isConcreteSettingsClass(clazz)) { + // Only care about non-abstract classes. + continue; + } + if (!InstrumentedPreferenceFragment.class.isAssignableFrom(clazz)) { + // Only care about InstrumentedPreferenceFragment + continue; + } + + try { + clazz.getField("SEARCH_INDEX_DATA_PROVIDER"); + mXmlDeclaredFragments.remove(clazz.getName()); + continue; + } catch (NoSuchFieldException e) { + } + + if (SearchIndexable.class.isAssignableFrom(clazz)) { + mXmlDeclaredFragments.remove(clazz.getName()); + continue; + } + } + + mXmlDeclaredFragments.removeAll(mGrandfatherNotSearchIndesable); + + final String missingFragmentError = + buildErrorMessage(mErrorNonIndexFragments, mXmlDeclaredFragments); + + assertWithMessage(missingFragmentError).that(mXmlDeclaredFragments).isEmpty(); + } + + private String buildErrorMessage(String errorSummary, List errorClasses) { + final StringBuilder error = new StringBuilder(errorSummary); + for (String c : errorClasses) { + error.append(c).append("\n"); + } + return error.toString(); + } + + private void initDeclaredFragments() throws IOException, XmlPullParserException { + final List xmlResources = getIndexableXml(); + for (int xmlResId : xmlResources) { + final List metadata = PreferenceXmlParserUtils.extractMetadata(mContext, + xmlResId, PreferenceXmlParserUtils.MetadataFlag.FLAG_NEED_FRAGMENT); + for (Bundle bundle : metadata) { + final String fragmentClassName = bundle.getString(METADATA_FRAGMENT); + if (TextUtils.isEmpty(fragmentClassName)) { + continue; + } + if (!mXmlDeclaredFragments.contains(fragmentClassName)) { + mXmlDeclaredFragments.add(fragmentClassName); + } + } + } + // We definitely have some fragments in xml, so assert not-empty here as a proxy to + // make sure the parser didn't fail + assertThat(mXmlDeclaredFragments).isNotEmpty(); + } + + private List getIndexableXml() { + final List xmlResSet = new ArrayList<>(); + + final Collection bundles = FeatureFactory.getFactory( + mContext).getSearchFeatureProvider().getSearchIndexableResources() + .getProviderValues(); + + for (SearchIndexableData bundle : bundles) { + Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider(); + + if (provider == null) { + continue; + } + + List resources = provider.getXmlResourcesToIndex(mContext, + true); + + if (resources == null) { + continue; + } + + for (SearchIndexableResource resource : resources) { + // Add '0's anyway. It won't break the test. + xmlResSet.add(resource.xmlResId); + } + } + return xmlResSet; + } +}