Settings search - Navigate user to exact page

- remove duplicate index preference
- default set searchable = false when the preference has fragment
- make some fragments indexable

Bug: 143057584
Test: robotest & manual

Change-Id: I4d64f6106d2f92f0a45e8c7e26388677f593f412
This commit is contained in:
Edgar Wang
2019-11-08 17:16:58 +08:00
parent b4f09e85f1
commit 08f2a58459
58 changed files with 389 additions and 55 deletions

View File

@@ -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">
<Preference
android:fragment="com.android.settings.accessibility.ToggleScreenMagnificationPreferenceFragment"
android:key="screen_magnification_gestures_preference_screen"

View File

@@ -17,4 +17,5 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="accessibility_notification_vibration_screen"
android:title="@string/accessibility_notification_vibration_title" />

View File

@@ -17,4 +17,5 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="accessibility_ring_vibration_screen"
android:title="@string/accessibility_ring_vibration_title" />

View File

@@ -17,4 +17,5 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="accessibility_shortcut_service_screen"
android:title="@string/accessibility_shortcut_service_title" />

View File

@@ -15,6 +15,7 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="accessibility_shortcut_settings_screen"
android:title="@string/accessibility_global_gesture_preference_title" >
<Preference

View File

@@ -17,4 +17,5 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="accessibility_touch_vibration_screen"
android:title="@string/accessibility_touch_vibration_title" />

View File

@@ -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">
<intent
android:action="android.intent.action.MAIN"

View File

@@ -16,6 +16,7 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="automatic_storage_manager_screen"
android:title="@string/automatic_storage_manager_settings" >
<DropDownPreference

View File

@@ -18,6 +18,7 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="battery_saver_schedule_screen"
android:title="@string/battery_saver_schedule_settings_title"
settings:staticPreferenceLocation="append">
</PreferenceScreen >

View File

@@ -17,6 +17,7 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="bluetooth_pairing_detail_screen"
android:title="@string/bluetooth_pairing_pref_title">
<Preference

View File

@@ -18,6 +18,7 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="bug_report_handler_screen"
android:title="@string/bug_report_handler_title"
settings:staticPreferenceLocation="append" >
</PreferenceScreen>

View File

@@ -17,4 +17,5 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="current_screensaver_screen"
android:title="@string/screensaver_settings_current" />

View File

@@ -17,4 +17,5 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="voice_input_settings_screen"
android:title="@string/voice_input_settings_title" />

View File

@@ -17,7 +17,8 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="enterprise_set_default_apps_settings">
android:key="enterprise_set_default_apps_settings"
android:title="@string/enterprise_privacy_enterprise_set_default_apps">
<PreferenceCategory
android:key="dashboard_tile_placeholder"/>
</PreferenceScreen>

View File

@@ -17,5 +17,6 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="network_scorer_picker_screen"
android:title="@string/network_scorer_picker_title">
</PreferenceScreen>

View File

@@ -16,6 +16,7 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="spellcheckers_screen"
android:title="@string/spellcheckers_settings_title">
<Preference
android:key="spellchecker_language"

View File

@@ -18,6 +18,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="tether_prefs_screen"
settings:keywords="@string/keywords_hotspot_tethering"
android:title="@string/tether_settings_title_all">
<com.android.settings.widget.FixedLineSummaryPreference

View File

@@ -16,6 +16,6 @@
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/usb_pref"
android:title="@string/usb_default_label"
android:key="usb_default_fragment">
</PreferenceScreen>

View File

@@ -17,4 +17,5 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="display_vr_pref_screen"
android:title="@string/display_vr_pref_title" />

View File

@@ -17,4 +17,5 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="select_webview_provider_screen"
android:title="@string/select_webview_provider_title" />

View File

@@ -17,4 +17,5 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="screensaver_when_to_dream_screen"
android:title="@string/screensaver_settings_when_to_dream" />

View File

@@ -16,6 +16,7 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="wifi_p2p_settings_screen"
android:title="@string/wifi_p2p_settings_title">
<Preference
android:key="p2p_this_device"

View File

@@ -19,8 +19,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="wifi_tether_settings_screen"
android:title="@string/wifi_hotspot_checkbox_text"
settings:searchable="false">
android:title="@string/wifi_hotspot_checkbox_text">
<com.android.settings.wifi.tether.WifiTetherSsidPreference
android:key="wifi_tether_network_name"

View File

@@ -19,8 +19,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="zen_mode_settings"
android:title="@string/zen_mode_settings_title"
settings:searchable="false">
android:title="@string/zen_mode_settings_title">
<PreferenceCategory
android:key="zen_mode_settings_category_behavior"

View File

@@ -34,10 +34,10 @@ import androidx.preference.SwitchPreference;
import com.android.internal.accessibility.AccessibilityShortcutController;
import com.android.settings.R;
import com.android.settings.widget.SwitchBar;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.Indexable;
import com.android.settings.widget.SwitchBar;
import com.android.settingslib.accessibility.AccessibilityUtils;
import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexable;
/**
@@ -201,11 +201,5 @@ public class AccessibilityShortcutPreferenceFragment extends ToggleFeaturePrefer
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
// This fragment is for details of the shortcut. Only the shortcut itself needs
// to be indexed.
protected boolean isPageSearchEnabled(Context context) {
return false;
}
};
new BaseSearchIndexProvider(R.xml.accessibility_shortcut_settings);
}

View File

@@ -21,10 +21,13 @@ import android.os.Vibrator;
import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
/**
* Fragment for picking accessibility shortcut service
*/
@SearchIndexable
public class NotificationVibrationPreferenceFragment extends VibrationPreferenceFragment {
@Override
public int getMetricsCategory() {
@@ -59,4 +62,7 @@ public class NotificationVibrationPreferenceFragment extends VibrationPreference
Vibrator vibrator = getContext().getSystemService(Vibrator.class);
return vibrator.getDefaultNotificationVibrationIntensity();
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.accessibility_notification_vibration_settings);
}

View File

@@ -21,10 +21,13 @@ import android.os.Vibrator;
import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
/**
* Fragment for picking accessibility shortcut service
*/
@SearchIndexable
public class RingVibrationPreferenceFragment extends VibrationPreferenceFragment {
@Override
public int getMetricsCategory() {
@@ -63,4 +66,7 @@ public class RingVibrationPreferenceFragment extends VibrationPreferenceFragment
Vibrator vibrator = getContext().getSystemService(Vibrator.class);
return vibrator.getDefaultRingVibrationIntensity();
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.accessibility_ring_vibration_settings);
}

View File

@@ -43,8 +43,10 @@ import com.android.internal.accessibility.AccessibilityShortcutController;
import com.android.internal.accessibility.AccessibilityShortcutController.ToggleableFrameworkFeatureInfo;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.accessibility.AccessibilityUtils;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.CandidateInfo;
import com.android.settingslib.widget.RadioButtonPreference;
@@ -55,6 +57,7 @@ import java.util.Map;
/**
* Fragment for picking accessibility shortcut service
*/
@SearchIndexable
public class ShortcutServicePickerFragment extends RadioButtonPickerFragment {
@Override
@@ -264,4 +267,7 @@ public class ShortcutServicePickerFragment extends RadioButtonPickerFragment {
return mServiceInfo.getComponentName().flattenToString();
}
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.accessibility_shortcut_service_settings);
}

View File

@@ -21,10 +21,13 @@ import android.os.Vibrator;
import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
/**
* Fragment for picking accessibility shortcut service
*/
@SearchIndexable
public class TouchVibrationPreferenceFragment extends VibrationPreferenceFragment {
@Override
public int getMetricsCategory() {
@@ -59,4 +62,7 @@ public class TouchVibrationPreferenceFragment extends VibrationPreferenceFragmen
protected int getPreviewVibrationAudioAttributesUsage() {
return AudioAttributes.USAGE_ASSISTANCE_SONIFICATION;
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.accessibility_touch_vibration_settings);
}

View File

@@ -29,7 +29,13 @@ import com.android.settings.SummaryPreference;
import com.android.settings.Utils;
import com.android.settings.applications.ProcStatsData.MemInfo;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
/**
* Settings screen to provide memory stats summary
*/
@SearchIndexable
public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenceClickListener {
private static final String KEY_STATUS_HEADER = "status_header";
@@ -125,4 +131,7 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
}
return false;
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.process_stats_summary);
}

View File

@@ -27,11 +27,17 @@ import android.text.TextUtils;
import com.android.internal.app.AssistUtils;
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;
/**
* Fragment for picking assistant voice input
*/
@SearchIndexable
public class DefaultVoiceInputPicker extends DefaultAppPickerFragment {
private VoiceInputHelper mHelper;
@@ -166,4 +172,7 @@ public class DefaultVoiceInputPicker extends DefaultAppPickerFragment {
return new Intent(Intent.ACTION_MAIN).setComponent(mInfo.settings);
}
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.default_voice_settings);
}

View File

@@ -37,7 +37,6 @@ import java.util.List;
public class ManageAssist extends DashboardFragment {
private static final String TAG = "ManageAssist";
private static final String KEY_ASSIST = "gesture_assist_application";
@Override
protected String getLogTag() {
@@ -85,12 +84,5 @@ public class ManageAssist extends DashboardFragment {
Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
@Override
public List<String> getNonIndexableKeys(Context context) {
List<String> keys = super.getNonIndexableKeys(context);
keys.add(KEY_ASSIST);
return keys;
}
};
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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;
}
};
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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<String> getNonIndexableKeys(Context context) {
final List<String> 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")

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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

View File

@@ -81,7 +81,7 @@ public class ConnectedDeviceDashboardFragmentTest {
final List<String> 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);
}

View File

@@ -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();
}
}

View File

@@ -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<String> mXmlDeclaredFragments = new ArrayList<>();
private final List<String> mGrandfatherNotSearchIndesable = new ArrayList<>();
public FragmentSearchIndexableCodeInspector(List<Class<?>> 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<String> 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<Integer> xmlResources = getIndexableXml();
for (int xmlResId : xmlResources) {
final List<Bundle> 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<Integer> getIndexableXml() {
final List<Integer> xmlResSet = new ArrayList<>();
final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(
mContext).getSearchFeatureProvider().getSearchIndexableResources()
.getProviderValues();
for (SearchIndexableData bundle : bundles) {
Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
if (provider == null) {
continue;
}
List<SearchIndexableResource> 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;
}
}