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;
diff --git a/src/com/android/settings/network/TetherPreferenceController.java b/src/com/android/settings/network/TetherPreferenceController.java
index 636fe0c..3ab83cd 100644
--- a/src/com/android/settings/network/TetherPreferenceController.java
+++ b/src/com/android/settings/network/TetherPreferenceController.java
@@ -17,7 +17,6 @@
 
 import static android.os.UserManager.DISALLOW_CONFIG_TETHERING;
 import static com.android.settingslib.RestrictedLockUtils.checkIfRestrictionEnforced;
-import static com.android.settingslib.RestrictedLockUtils.hasBaseUserRestriction;
 
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothPan;
@@ -40,6 +39,7 @@
 import com.android.settings.R;
 import com.android.settings.TetherSettings;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.TetherUtil;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -112,11 +112,7 @@
 
     @Override
     public boolean isAvailable() {
-        final boolean isBlocked =
-                (!mConnectivityManager.isTetheringSupported() && !mAdminDisallowedTetherConfig)
-                        || hasBaseUserRestriction(mContext, DISALLOW_CONFIG_TETHERING,
-                        UserHandle.myUserId());
-        return !isBlocked;
+        return TetherUtil.isTetherAvailable(mContext);
     }
 
     @Override
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index 7c50f0c..5e202d6 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -27,28 +27,42 @@
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.UserManager;
-import androidx.annotation.VisibleForTesting;
+import android.provider.SearchIndexableResource;
 import android.text.TextUtils;
 import android.util.Log;
+import androidx.annotation.VisibleForTesting;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.dashboard.RestrictedDashboardFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.widget.SwitchBar;
 import com.android.settings.widget.SwitchBarController;
+import com.android.settingslib.TetherUtil;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.search.SearchIndexable;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
 
+@SearchIndexable
 public class WifiTetherSettings extends RestrictedDashboardFragment
         implements WifiTetherBasePreferenceController.OnTetherConfigUpdateListener {
 
     private static final String TAG = "WifiTetherSettings";
     private static final IntentFilter TETHER_STATE_CHANGE_FILTER;
-    private static final String KEY_WIFI_TETHER_AUTO_OFF = "wifi_tether_auto_turn_off";
+    private static final String KEY_WIFI_TETHER_SCREEN = "wifi_tether_settings_screen";
+    @VisibleForTesting
+    static final String KEY_WIFI_TETHER_NETWORK_NAME = "wifi_tether_network_name";
+    @VisibleForTesting
+    static final String KEY_WIFI_TETHER_NETWORK_PASSWORD = "wifi_tether_network_password";
+    @VisibleForTesting
+    static final String KEY_WIFI_TETHER_AUTO_OFF = "wifi_tether_auto_turn_off";
+    @VisibleForTesting
+    static final String KEY_WIFI_TETHER_NETWORK_AP_BAND = "wifi_tether_network_ap_band";
 
     private WifiTetherSwitchBarController mSwitchBarController;
     private WifiTetherSSIDPreferenceController mSSIDPreferenceController;
@@ -182,6 +196,33 @@
                 .updateDisplay();
     }
 
+    public static final 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.wifi_tether_settings;
+                    return Arrays.asList(sir);
+                }
+
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    final List<String> keys = super.getNonIndexableKeys(context);
+
+                    if (!TetherUtil.isTetherAvailable(context)) {
+                        keys.add(KEY_WIFI_TETHER_NETWORK_NAME);
+                        keys.add(KEY_WIFI_TETHER_NETWORK_PASSWORD);
+                        keys.add(KEY_WIFI_TETHER_AUTO_OFF);
+                        keys.add(KEY_WIFI_TETHER_NETWORK_AP_BAND);
+                    }
+
+                    // Remove duplicate
+                    keys.add(KEY_WIFI_TETHER_SCREEN);
+                    return keys;
+                }
+            };
+
     @VisibleForTesting
     class TetherChangeReceiver extends BroadcastReceiver {
         @Override