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:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto" xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="magnification_preference_screen_title" android:key="magnification_preference_screen_title"
android:title="@string/accessibility_screen_magnification_title" android:title="@string/accessibility_screen_magnification_title">
settings:searchable="false">
<Preference <Preference
android:fragment="com.android.settings.accessibility.ToggleScreenMagnificationPreferenceFragment" android:fragment="com.android.settings.accessibility.ToggleScreenMagnificationPreferenceFragment"
android:key="screen_magnification_gestures_preference_screen" android:key="screen_magnification_gestures_preference_screen"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -79,6 +79,7 @@
android:key="app_and_notif_cell_broadcast_settings" android:key="app_and_notif_cell_broadcast_settings"
android:title="@string/cell_broadcast_settings" android:title="@string/cell_broadcast_settings"
android:order="15" android:order="15"
settings:searchable="false"
settings:useAdminDisabledSummary="true"> settings:useAdminDisabledSummary="true">
<intent <intent
android:action="android.intent.action.MAIN" android:action="android.intent.action.MAIN"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -17,7 +17,8 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto" 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 <PreferenceCategory
android:key="dashboard_tile_placeholder"/> android:key="dashboard_tile_placeholder"/>
</PreferenceScreen> </PreferenceScreen>

View File

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

View File

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

View File

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

View File

@@ -16,6 +16,6 @@
--> -->
<PreferenceScreen <PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android" 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"> android:key="usb_default_fragment">
</PreferenceScreen> </PreferenceScreen>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -19,8 +19,7 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto" xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="zen_mode_settings" android:key="zen_mode_settings"
android:title="@string/zen_mode_settings_title" android:title="@string/zen_mode_settings_title">
settings:searchable="false">
<PreferenceCategory <PreferenceCategory
android:key="zen_mode_settings_category_behavior" 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.internal.accessibility.AccessibilityShortcutController;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.widget.SwitchBar;
import com.android.settings.search.BaseSearchIndexProvider; 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.accessibility.AccessibilityUtils;
import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.search.SearchIndexable;
/** /**
@@ -201,11 +201,5 @@ public class AccessibilityShortcutPreferenceFragment extends ToggleFeaturePrefer
} }
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() { new BaseSearchIndexProvider(R.xml.accessibility_shortcut_settings);
// This fragment is for details of the shortcut. Only the shortcut itself needs
// to be indexed.
protected boolean isPageSearchEnabled(Context context) {
return false;
}
};
} }

View File

@@ -21,10 +21,13 @@ import android.os.Vibrator;
import android.provider.Settings; import android.provider.Settings;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
/** /**
* Fragment for picking accessibility shortcut service * Fragment for picking accessibility shortcut service
*/ */
@SearchIndexable
public class NotificationVibrationPreferenceFragment extends VibrationPreferenceFragment { public class NotificationVibrationPreferenceFragment extends VibrationPreferenceFragment {
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
@@ -59,4 +62,7 @@ public class NotificationVibrationPreferenceFragment extends VibrationPreference
Vibrator vibrator = getContext().getSystemService(Vibrator.class); Vibrator vibrator = getContext().getSystemService(Vibrator.class);
return vibrator.getDefaultNotificationVibrationIntensity(); 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 android.provider.Settings;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
/** /**
* Fragment for picking accessibility shortcut service * Fragment for picking accessibility shortcut service
*/ */
@SearchIndexable
public class RingVibrationPreferenceFragment extends VibrationPreferenceFragment { public class RingVibrationPreferenceFragment extends VibrationPreferenceFragment {
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
@@ -63,4 +66,7 @@ public class RingVibrationPreferenceFragment extends VibrationPreferenceFragment
Vibrator vibrator = getContext().getSystemService(Vibrator.class); Vibrator vibrator = getContext().getSystemService(Vibrator.class);
return vibrator.getDefaultRingVibrationIntensity(); 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.internal.accessibility.AccessibilityShortcutController.ToggleableFrameworkFeatureInfo;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.accessibility.AccessibilityUtils; import com.android.settingslib.accessibility.AccessibilityUtils;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.CandidateInfo;
import com.android.settingslib.widget.RadioButtonPreference; import com.android.settingslib.widget.RadioButtonPreference;
@@ -55,6 +57,7 @@ import java.util.Map;
/** /**
* Fragment for picking accessibility shortcut service * Fragment for picking accessibility shortcut service
*/ */
@SearchIndexable
public class ShortcutServicePickerFragment extends RadioButtonPickerFragment { public class ShortcutServicePickerFragment extends RadioButtonPickerFragment {
@Override @Override
@@ -264,4 +267,7 @@ public class ShortcutServicePickerFragment extends RadioButtonPickerFragment {
return mServiceInfo.getComponentName().flattenToString(); 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 android.provider.Settings;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
/** /**
* Fragment for picking accessibility shortcut service * Fragment for picking accessibility shortcut service
*/ */
@SearchIndexable
public class TouchVibrationPreferenceFragment extends VibrationPreferenceFragment { public class TouchVibrationPreferenceFragment extends VibrationPreferenceFragment {
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
@@ -59,4 +62,7 @@ public class TouchVibrationPreferenceFragment extends VibrationPreferenceFragmen
protected int getPreviewVibrationAudioAttributesUsage() { protected int getPreviewVibrationAudioAttributesUsage() {
return AudioAttributes.USAGE_ASSISTANCE_SONIFICATION; 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.Utils;
import com.android.settings.applications.ProcStatsData.MemInfo; import com.android.settings.applications.ProcStatsData.MemInfo;
import com.android.settings.core.SubSettingLauncher; 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 { public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenceClickListener {
private static final String KEY_STATUS_HEADER = "status_header"; private static final String KEY_STATUS_HEADER = "status_header";
@@ -125,4 +131,7 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
} }
return false; 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.internal.app.AssistUtils;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment; import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.applications.DefaultAppInfo; import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* Fragment for picking assistant voice input
*/
@SearchIndexable
public class DefaultVoiceInputPicker extends DefaultAppPickerFragment { public class DefaultVoiceInputPicker extends DefaultAppPickerFragment {
private VoiceInputHelper mHelper; private VoiceInputHelper mHelper;
@@ -166,4 +172,7 @@ public class DefaultVoiceInputPicker extends DefaultAppPickerFragment {
return new Intent(Intent.ACTION_MAIN).setComponent(mInfo.settings); 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 { public class ManageAssist extends DashboardFragment {
private static final String TAG = "ManageAssist"; private static final String TAG = "ManageAssist";
private static final String KEY_ASSIST = "gesture_assist_application";
@Override @Override
protected String getLogTag() { protected String getLogTag() {
@@ -85,12 +84,5 @@ public class ManageAssist extends DashboardFragment {
Context context) { Context context) {
return buildPreferenceControllers(context, null /* lifecycle */); 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 androidx.annotation.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.bluetooth.BluetoothDeviceFilter; import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.search.Indexable; import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.FooterPreference;
/** /**
* BluetoothPairingDetail is a page to scan bluetooth devices and pair them. * BluetoothPairingDetail is a page to scan bluetooth devices and pair them.
*/ */
@SearchIndexable
public class BluetoothPairingDetail extends DeviceListPreferenceFragment implements public class BluetoothPairingDetail extends DeviceListPreferenceFragment implements
Indexable { Indexable {
private static final String TAG = "BluetoothPairingDetail"; 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.makeText(getContext(), R.string.connected_device_bluetooth_turned_on_toast,
Toast.LENGTH_SHORT).show(); 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.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment; import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.applications.DefaultAppInfo; import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.FooterPreference;
import java.util.ArrayList; import java.util.ArrayList;
@@ -44,6 +46,7 @@ import java.util.List;
/** /**
* Picker for BugReportHandler. * Picker for BugReportHandler.
*/ */
@SearchIndexable
public class BugReportHandlerPicker extends DefaultAppPickerFragment { public class BugReportHandlerPicker extends DefaultAppPickerFragment {
private static final String TAG = "BugReportHandlerPicker"; private static final String TAG = "BugReportHandlerPicker";
@@ -202,4 +205,7 @@ public class BugReportHandlerPicker extends DefaultAppPickerFragment {
return super.loadLabel(); 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.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.CandidateInfo;
import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.FooterPreference;
import com.android.settingslib.widget.RadioButtonPreference; import com.android.settingslib.widget.RadioButtonPreference;
@@ -42,6 +44,7 @@ import java.util.List;
/** /**
* Provides options for selecting the default USB mode. * Provides options for selecting the default USB mode.
*/ */
@SearchIndexable
public class UsbDefaultFragment extends RadioButtonPickerFragment { public class UsbDefaultFragment extends RadioButtonPickerFragment {
@VisibleForTesting @VisibleForTesting
UsbBackend mUsbBackend; 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_NEED_PREF_APPEND = 1 << 10;
int FLAG_UNAVAILABLE_SLICE_SUBTITLE = 1 << 11; int FLAG_UNAVAILABLE_SLICE_SUBTITLE = 1 << 11;
int FLAG_FOR_WORK = 1 << 12; int FLAG_FOR_WORK = 1 << 12;
int FLAG_NEED_FRAGMENT = 1 << 13;
} }
public static final String METADATA_PREF_TYPE = "type"; 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_APPEND = "staticPreferenceLocation";
public static final String METADATA_UNAVAILABLE_SLICE_SUBTITLE = "unavailable_slice_subtitle"; 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_FOR_WORK = "for_work";
public static final String METADATA_FRAGMENT = "fragment";
private static final String ENTRIES_SEPARATOR = "|"; private static final String ENTRIES_SEPARATOR = "|";
@@ -250,6 +252,10 @@ public class PreferenceXmlParserUtils {
preferenceMetadata.putBoolean(METADATA_FOR_WORK, preferenceMetadata.putBoolean(METADATA_FOR_WORK,
isForWork(preferenceAttributes)); isForWork(preferenceAttributes));
} }
if (hasFlag(flags, MetadataFlag.FLAG_NEED_FRAGMENT)) {
preferenceMetadata.putString(METADATA_FRAGMENT,
getFragment(preferenceAttributes));
}
metadata.add(preferenceMetadata); metadata.add(preferenceMetadata);
preferenceAttributes.recycle(); preferenceAttributes.recycle();
@@ -340,4 +346,9 @@ public class PreferenceXmlParserUtils {
return styledAttributes.getBoolean( return styledAttributes.getBoolean(
R.styleable.Preference_forWork, false); 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.FilteredCountryTimeZones;
import com.android.settings.datetime.timezone.model.TimeZoneData; import com.android.settings.datetime.timezone.model.TimeZoneData;
import com.android.settings.datetime.timezone.model.TimeZoneDataLoader; import com.android.settings.datetime.timezone.model.TimeZoneDataLoader;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; 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. * The class displays a time zone picker either by regions or fixed offset time zones.
*/ */
@SearchIndexable
public class TimeZoneSettings extends DashboardFragment { public class TimeZoneSettings extends DashboardFragment {
private static final String TAG = "TimeZoneSettings"; private static final String TAG = "TimeZoneSettings";
@@ -387,4 +390,7 @@ public class TimeZoneSettings extends DashboardFragment {
private String getLocaleRegionId() { private String getLocaleRegionId() {
return mLocale.getCountry().toUpperCase(Locale.US); 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. */ /** For Search. */
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() { new BaseSearchIndexProvider(R.xml.automatic_storage_management_settings) {
@Override @Override
protected boolean isPageSearchEnabled(Context context) { protected boolean isPageSearchEnabled(Context context) {
return false; return false;

View File

@@ -43,6 +43,8 @@ import com.android.internal.compat.IPlatformCompat;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.development.AppPicker; 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.ArrayList;
import java.util.List; import java.util.List;
@@ -53,6 +55,7 @@ import java.util.TreeMap;
/** /**
* Dashboard for Platform Compat preferences. * Dashboard for Platform Compat preferences.
*/ */
@SearchIndexable
public class PlatformCompatDashboard extends DashboardFragment { public class PlatformCompatDashboard extends DashboardFragment {
private static final String TAG = "PlatformCompatDashboard"; private static final String TAG = "PlatformCompatDashboard";
private static final String COMPAT_APP = "compat_app"; private static final String COMPAT_APP = "compat_app";
@@ -273,4 +276,7 @@ public class PlatformCompatDashboard extends DashboardFragment {
return true; 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.R;
import com.android.settings.dashboard.DashboardFragment; 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 { public class ModuleLicensesDashboard extends DashboardFragment {
private static final String TAG = "ModuleLicensesDashboard"; private static final String TAG = "ModuleLicensesDashboard";
@@ -43,4 +49,7 @@ public class ModuleLicensesDashboard extends DashboardFragment {
public int getHelpResource() { public int getHelpResource() {
return 0; 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 android.text.TextUtils;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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 { public class VrDisplayPreferencePicker extends RadioButtonPickerFragment {
static final String PREF_KEY_PREFIX = "vr_display_pref_"; static final String PREF_KEY_PREFIX = "vr_display_pref_";
@@ -102,4 +108,7 @@ public class VrDisplayPreferencePicker extends RadioButtonPickerFragment {
return PREF_KEY_PREFIX + value; 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 android.graphics.drawable.Drawable;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.dream.DreamBackend; import com.android.settingslib.dream.DreamBackend;
import com.android.settingslib.dream.DreamBackend.DreamInfo; import com.android.settingslib.dream.DreamBackend.DreamInfo;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.CandidateInfo;
import java.util.HashMap; import java.util.HashMap;
@@ -32,6 +34,10 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* Settings picker screen for current screen saver
*/
@SearchIndexable
public final class CurrentDreamPicker extends RadioButtonPickerFragment { public final class CurrentDreamPicker extends RadioButtonPickerFragment {
private DreamBackend mBackend; private DreamBackend mBackend;
@@ -122,4 +128,7 @@ public final class CurrentDreamPicker extends RadioButtonPickerFragment {
return key; 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 android.graphics.drawable.Drawable;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.dream.DreamBackend; import com.android.settingslib.dream.DreamBackend;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* Settings screen for decide when to start screen saver
*/
@SearchIndexable
public class WhenToDreamPicker extends RadioButtonPickerFragment { public class WhenToDreamPicker extends RadioButtonPickerFragment {
private static final String TAG = "WhenToDreamPicker"; private static final String TAG = "WhenToDreamPicker";
@@ -120,4 +126,7 @@ public class WhenToDreamPicker extends RadioButtonPickerFragment {
return key; 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.R;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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. * Fragment for displaying a list of default applications set by profile or device admin.
*/ */
@SearchIndexable
public class EnterpriseSetDefaultAppsListFragment extends DashboardFragment { public class EnterpriseSetDefaultAppsListFragment extends DashboardFragment {
static final String TAG = "EnterprisePrivacySettings"; static final String TAG = "EnterprisePrivacySettings";
@@ -56,4 +59,7 @@ public class EnterpriseSetDefaultAppsListFragment extends DashboardFragment {
controllers.add(controller); controllers.add(controller);
return controllers; 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 androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.fuelgauge.BatterySaverUtils; import com.android.settingslib.fuelgauge.BatterySaverUtils;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.CandidateInfo;
import com.android.settingslib.widget.RadioButtonPreference; import com.android.settingslib.widget.RadioButtonPreference;
@@ -53,6 +55,7 @@ import java.util.List;
* {@link BatterySaverScheduleSeekBarController} for the controller that manages user * {@link BatterySaverScheduleSeekBarController} for the controller that manages user
* interactions in this screen. * interactions in this screen.
*/ */
@SearchIndexable
public class BatterySaverScheduleSettings extends RadioButtonPickerFragment { public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
public BatterySaverScheduleRadioButtonsController mRadioButtonController; public BatterySaverScheduleRadioButtonsController mRadioButtonController;
@@ -207,4 +210,7 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
return mSummary; 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; sir.xmlResId = R.xml.gestures;
return Arrays.asList(sir); 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.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.widget.SwitchBar; import com.android.settings.widget.SwitchBar;
import com.android.settings.widget.SwitchBar.OnSwitchChangeListener; import com.android.settings.widget.SwitchBar.OnSwitchChangeListener;
import com.android.settingslib.search.SearchIndexable;
/**
* Settings screen for spell checker
*/
@SearchIndexable
public class SpellCheckersSettings extends SettingsPreferenceFragment public class SpellCheckersSettings extends SettingsPreferenceFragment
implements OnSwitchChangeListener, OnPreferenceClickListener, OnPreferenceChangeListener { implements OnSwitchChangeListener, OnPreferenceClickListener, OnPreferenceChangeListener {
private static final String TAG = SpellCheckersSettings.class.getSimpleName(); private static final String TAG = SpellCheckersSettings.class.getSimpleName();
@@ -274,4 +280,7 @@ public class SpellCheckersSettings extends SettingsPreferenceFragment
} }
updatePreferenceScreen(); 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.R;
import com.android.settings.core.InstrumentedPreferenceFragment; 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 com.android.settingslib.widget.RadioButtonPreference;
import java.util.List; import java.util.List;
@@ -38,6 +40,7 @@ import java.util.List;
/** /**
* Fragment for choosing default network scorer. * Fragment for choosing default network scorer.
*/ */
@SearchIndexable
public class NetworkScorerPicker extends InstrumentedPreferenceFragment implements public class NetworkScorerPicker extends InstrumentedPreferenceFragment implements
RadioButtonPreference.OnClickListener { RadioButtonPreference.OnClickListener {
@@ -142,4 +145,7 @@ public class NetworkScorerPicker extends InstrumentedPreferenceFragment implemen
NetworkScoreManager createNetworkScorerManager(Context context) { NetworkScoreManager createNetworkScorerManager(Context context) {
return (NetworkScoreManager) context.getSystemService(Context.NETWORK_SCORE_SERVICE); 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 @VisibleForTesting
static final String KEY_LOCK_SCREEN_NOTIFICATON_WORK_PROFILE = static final String KEY_LOCK_SCREEN_NOTIFICATON_WORK_PROFILE =
"security_setting_lock_screen_notif_work"; "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; private AmbientDisplayConfiguration mConfig;
@@ -141,13 +138,6 @@ public class LockscreenDashboardFragment extends DashboardFragment
return controllers; 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 @Override
protected boolean isPageSearchEnabled(Context context) { protected boolean isPageSearchEnabled(Context context) {
return new LockScreenPreferenceController(context, "anykey") return new LockScreenPreferenceController(context, "anykey")

View File

@@ -33,11 +33,17 @@ import androidx.annotation.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment; import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.applications.DefaultAppInfo; import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* Settings picker screen to handle Web implementation
*/
@SearchIndexable
public class WebViewAppPicker extends DefaultAppPickerFragment { public class WebViewAppPicker extends DefaultAppPickerFragment {
private WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper; private WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper;
@@ -164,4 +170,7 @@ public class WebViewAppPicker extends DefaultAppPickerFragment {
} }
return null; 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.R;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/* /**
* Displays Wi-fi p2p settings UI * Displays Wi-fi p2p settings UI
*/ */
@SearchIndexable
public class WifiP2pSettings extends DashboardFragment public class WifiP2pSettings extends DashboardFragment
implements PersistentGroupInfoListener, PeerListListener, DeviceInfoListener { 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.R;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.wifi.WifiSettings; import com.android.settings.wifi.WifiSettings;
import com.android.settings.wifi.details.WifiNetworkDetailsFragment; import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.wifi.AccessPoint; import com.android.settingslib.wifi.AccessPoint;
import com.android.settingslib.wifi.AccessPointPreference; import com.android.settingslib.wifi.AccessPointPreference;
/** /**
* UI to manage saved networks/access points. * UI to manage saved networks/access points.
*/ */
@SearchIndexable
public class SavedAccessPointsWifiSettings extends DashboardFragment { public class SavedAccessPointsWifiSettings extends DashboardFragment {
private static final String TAG = "SavedAccessPoints"; private static final String TAG = "SavedAccessPoints";
@@ -130,4 +133,7 @@ public class SavedAccessPointsWifiSettings extends DashboardFragment {
outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState); 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.R;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.wifi.WifiSettings; import com.android.settings.wifi.WifiSettings;
import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2; import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2;
import com.android.settingslib.search.SearchIndexable;
import com.android.wifitrackerlib.SavedNetworkTracker; import com.android.wifitrackerlib.SavedNetworkTracker;
import java.time.Clock; import java.time.Clock;
@@ -47,6 +49,7 @@ import java.time.ZoneOffset;
/** /**
* UI to manage saved networks/access points. * UI to manage saved networks/access points.
*/ */
@SearchIndexable
public class SavedAccessPointsWifiSettings2 extends DashboardFragment public class SavedAccessPointsWifiSettings2 extends DashboardFragment
implements SavedNetworkTracker.SavedNetworkTrackerCallback { implements SavedNetworkTracker.SavedNetworkTrackerCallback {
@@ -164,4 +167,7 @@ public class SavedAccessPointsWifiSettings2 extends DashboardFragment
use(SubscribedAccessPointsPreferenceController2.class) use(SubscribedAccessPointsPreferenceController2.class)
.displayPreference(screen, mSavedNetworkTracker.getSubscriptionWifiEntries()); .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.AppStorageSettings
com.android.settings.applications.ConfirmConvertToFbe com.android.settings.applications.ConfirmConvertToFbe
com.android.settings.applications.ProcessStatsDetail com.android.settings.applications.ProcessStatsDetail
com.android.settings.applications.ProcessStatsSummary
com.android.settings.applications.ProcessStatsUi com.android.settings.applications.ProcessStatsUi
com.android.settings.applications.RunningServices com.android.settings.applications.RunningServices
com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetails com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetails
@@ -26,7 +25,6 @@ com.android.settings.applications.UsageAccessDetails
com.android.settings.backup.ToggleBackupSettingFragment com.android.settings.backup.ToggleBackupSettingFragment
com.android.settings.biometrics.fingerprint.FingerprintSettings$FingerprintSettingsFragment com.android.settings.biometrics.fingerprint.FingerprintSettings$FingerprintSettingsFragment
com.android.settings.bluetooth.BluetoothDeviceDetailsFragment com.android.settings.bluetooth.BluetoothDeviceDetailsFragment
com.android.settings.bluetooth.BluetoothPairingDetail
com.android.settings.bluetooth.DevicePickerFragment com.android.settings.bluetooth.DevicePickerFragment
com.android.settings.dashboard.profileselector.ProfileSelectAccountFragment com.android.settings.dashboard.profileselector.ProfileSelectAccountFragment
com.android.settings.dashboard.profileselector.ProfileSelectManageApplications 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.AppDataUsage
com.android.settings.datausage.DataUsageList com.android.settings.datausage.DataUsageList
com.android.settings.datausage.DataUsageSummary 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.PrivateVolumeSettings
com.android.settings.deviceinfo.PublicVolumeSettings com.android.settings.deviceinfo.PublicVolumeSettings
com.android.settings.deviceinfo.StorageProfileFragment com.android.settings.deviceinfo.StorageProfileFragment
com.android.settings.deviceinfo.legal.ModuleLicensesDashboard
com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionCamera com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionCamera
com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionLocation com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionLocation
com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionMicrophone com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionMicrophone
com.android.settings.enterprise.ApplicationListFragment$EnterpriseInstalledPackages com.android.settings.enterprise.ApplicationListFragment$EnterpriseInstalledPackages
com.android.settings.enterprise.EnterpriseSetDefaultAppsListFragment
com.android.settings.fuelgauge.AdvancedPowerUsageDetail com.android.settings.fuelgauge.AdvancedPowerUsageDetail
com.android.settings.fuelgauge.InactiveApps com.android.settings.fuelgauge.InactiveApps
com.android.settings.fuelgauge.RestrictedAppDetails com.android.settings.fuelgauge.RestrictedAppDetails
com.android.settings.IccLockSettings com.android.settings.IccLockSettings
com.android.settings.inputmethod.InputMethodAndSubtypeEnabler com.android.settings.inputmethod.InputMethodAndSubtypeEnabler
com.android.settings.inputmethod.KeyboardLayoutPickerFragment com.android.settings.inputmethod.KeyboardLayoutPickerFragment
com.android.settings.inputmethod.SpellCheckersSettings
com.android.settings.location.LocationPersonalSettings com.android.settings.location.LocationPersonalSettings
com.android.settings.location.LocationWorkProfileSettings com.android.settings.location.LocationWorkProfileSettings
com.android.settings.network.ApnEditor com.android.settings.network.ApnEditor
@@ -88,10 +81,7 @@ com.android.settings.wifi.ChangeWifiStateDetails
com.android.settings.wifi.calling.WifiCallingSettingsForSub com.android.settings.wifi.calling.WifiCallingSettingsForSub
com.android.settings.wifi.details.WifiNetworkDetailsFragment com.android.settings.wifi.details.WifiNetworkDetailsFragment
com.android.settings.wifi.dpp.WifiNetworkListFragment 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.wifi.WifiInfo
com.android.settings.applications.specialaccess.notificationaccess.NotificationAccessDetails com.android.settings.applications.specialaccess.notificationaccess.NotificationAccessDetails
com.android.settings.wifi.details2.WifiNetworkDetailsFragment2 com.android.settings.wifi.details2.WifiNetworkDetailsFragment2
com.android.settings.wifi.savedaccesspoints2.SavedAccessPointsWifiSettings2
com.android.settings.dashboard.profileselector.ProfileSelectRecentLocationRequestFragment com.android.settings.dashboard.profileselector.ProfileSelectRecentLocationRequestFragment

View File

@@ -81,7 +81,7 @@ public class ConnectedDeviceDashboardFragmentTest {
final List<String> niks = ConnectedDeviceDashboardFragment.SEARCH_INDEX_DATA_PROVIDER final List<String> niks = ConnectedDeviceDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
.getNonIndexableKeys(mContext); .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); 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.BasePreferenceControllerSignatureInspector;
import com.android.settings.core.instrumentation.InstrumentableFragmentCodeInspector; import com.android.settings.core.instrumentation.InstrumentableFragmentCodeInspector;
import com.android.settings.search.FragmentSearchIndexableCodeInspector;
import com.android.settings.search.SearchIndexProviderCodeInspector; import com.android.settings.search.SearchIndexProviderCodeInspector;
import com.android.settings.slices.SliceControllerInXmlCodeInspector; import com.android.settings.slices.SliceControllerInXmlCodeInspector;
@@ -71,4 +72,9 @@ public class CodeInspectionTest {
public void runLifecycleObserverInspection() { public void runLifecycleObserverInspection() {
new LifecycleObserverCodeInspector(mClasses).run(); 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;
}
}