Add index for Hotspot settings page into search

Added index provider into TetherSettings and WifiTetherSettings pages.
Added robotests to check the keys returned by getNonIndexableKeys.
Move repeated code into utility class.

Bug: 74777873
Test: make -j RunSettingsRoboTests
Test: atest UniquePreferenceTest
Change-Id: I6cb09d735afa4867d25a79de733ce8c59634e49b
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index 8cb8efc..848e176 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -34,27 +34,41 @@
 import android.os.Environment;
 import android.os.Handler;
 import android.os.UserManager;
-import androidx.preference.SwitchPreference;
+import android.provider.SearchIndexableResource;
+import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
+import androidx.preference.SwitchPreference;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.datausage.DataSaverBackend;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
 import com.android.settings.wifi.tether.WifiTetherPreferenceController;
 import com.android.settingslib.TetherUtil;
+import com.android.settingslib.search.SearchIndexable;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 
 /*
  * Displays preferences for Tethering.
  */
+@SearchIndexable
 public class TetherSettings extends RestrictedSettingsFragment
         implements DataSaverBackend.Listener {
 
-    private static final String USB_TETHER_SETTINGS = "usb_tether_settings";
-    private static final String ENABLE_BLUETOOTH_TETHERING = "enable_bluetooth_tethering";
-    private static final String DATA_SAVER_FOOTER = "disabled_on_data_saver";
+    @VisibleForTesting
+    static final String KEY_TETHER_PREFS_SCREEN = "tether_prefs_screen";
+    @VisibleForTesting
+    static final String KEY_WIFI_TETHER = "wifi_tether";
+    @VisibleForTesting
+    static final String KEY_USB_TETHER_SETTINGS = "usb_tether_settings";
+    @VisibleForTesting
+    static final String KEY_ENABLE_BLUETOOTH_TETHERING = "enable_bluetooth_tethering";
+    private static final String KEY_DATA_SAVER_FOOTER = "disabled_on_data_saver";
 
     private static final String TAG = "TetheringSettings";
 
@@ -110,7 +124,7 @@
 
         mDataSaverBackend = new DataSaverBackend(getContext());
         mDataSaverEnabled = mDataSaverBackend.isDataSaverEnabled();
-        mDataSaverFooter = findPreference(DATA_SAVER_FOOTER);
+        mDataSaverFooter = findPreference(KEY_DATA_SAVER_FOOTER);
 
         setIfOnlyAvailableForAdmins(true);
         if (isUiRestricted()) {
@@ -126,8 +140,8 @@
                     BluetoothProfile.PAN);
         }
 
-        mUsbTether = (SwitchPreference) findPreference(USB_TETHER_SETTINGS);
-        mBluetoothTether = (SwitchPreference) findPreference(ENABLE_BLUETOOTH_TETHERING);
+        mUsbTether = (SwitchPreference) findPreference(KEY_USB_TETHER_SETTINGS);
+        mBluetoothTether = (SwitchPreference) findPreference(KEY_ENABLE_BLUETOOTH_TETHERING);
 
         mDataSaverBackend.addListener(this);
 
@@ -433,6 +447,42 @@
         }
     };
 
+    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider() {
+                @Override
+                public List<SearchIndexableResource> getXmlResourcesToIndex(
+                        Context context, boolean enabled) {
+                    final SearchIndexableResource sir = new SearchIndexableResource(context);
+                    sir.xmlResId = R.xml.tether_prefs;
+                    return Arrays.asList(sir);
+                }
+
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    final List<String> keys = super.getNonIndexableKeys(context);
+                    final ConnectivityManager cm =
+                            context.getSystemService(ConnectivityManager.class);
+
+                    if (!TetherUtil.isTetherAvailable(context)) {
+                        keys.add(KEY_TETHER_PREFS_SCREEN);
+                        keys.add(KEY_WIFI_TETHER);
+                    }
+
+                    final boolean usbAvailable =
+                            cm.getTetherableUsbRegexs().length != 0;
+                    if (!usbAvailable || Utils.isMonkeyRunning()) {
+                        keys.add(KEY_USB_TETHER_SETTINGS);
+                    }
+
+                    final boolean bluetoothAvailable =
+                            cm.getTetherableBluetoothRegexs().length != 0;
+                    if (!bluetoothAvailable) {
+                        keys.add(KEY_ENABLE_BLUETOOTH_TETHERING);
+                    }
+                    return keys;
+                }
+    };
+
     private static final class OnStartTetheringCallback extends
             ConnectivityManager.OnStartTetheringCallback {
         final WeakReference<TetherSettings> mTetherSettings;