Merge changes from topic "tc_change_23041807_29" into udc-dev

* changes:
  [automerged blank] Import translations. DO NOT MERGE ANYWHERE 2p: 6c08eb4631
  Import translations. DO NOT MERGE ANYWHERE
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index b84b80e..e35b0d8 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -854,14 +854,6 @@
         }
 
         @Override
-        public void onStop() {
-            super.onStop();
-            if (!getActivity().isChangingConfigurations() && !mWaitingForConfirmation) {
-                getActivity().finish();
-            }
-        }
-
-        @Override
         public void onDestroy() {
             super.onDestroy();
             if (mUserPassword != null) {
diff --git a/src/com/android/settings/wifi/repository/WifiHotspotRepository.java b/src/com/android/settings/wifi/repository/WifiHotspotRepository.java
index 91de482..c96896f 100644
--- a/src/com/android/settings/wifi/repository/WifiHotspotRepository.java
+++ b/src/com/android/settings/wifi/repository/WifiHotspotRepository.java
@@ -32,9 +32,11 @@
 import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 
+import com.android.settings.R;
 import com.android.settings.overlay.FeatureFactory;
 
 import java.util.HashMap;
@@ -96,6 +98,10 @@
     protected String mCurrentCountryCode;
     protected ActiveCountryCodeChangedCallback mActiveCountryCodeChangedCallback;
 
+    @VisibleForTesting
+    Boolean mIsConfigShowSpeed;
+    private Boolean mIsSpeedFeatureAvailable;
+
     public WifiHotspotRepository(@NonNull Context appContext, @NonNull WifiManager wifiManager) {
         mAppContext = appContext;
         mWifiManager = wifiManager;
@@ -314,6 +320,7 @@
 
     /**
      * Return whether Wi-Fi Dual Band is supported or not.
+     *
      * @return {@code true} if Wi-Fi Dual Band is supported
      */
     public boolean isDualBand() {
@@ -326,6 +333,7 @@
 
     /**
      * Return whether Wi-Fi 5 GHz band is supported or not.
+     *
      * @return {@code true} if Wi-Fi 5 GHz Band is supported
      */
     public boolean is5GHzBandSupported() {
@@ -338,6 +346,7 @@
 
     /**
      * Return whether Wi-Fi Hotspot 5 GHz band is available or not.
+     *
      * @return {@code true} if Wi-Fi Hotspot 5 GHz Band is available
      */
     public boolean is5gAvailable() {
@@ -371,6 +380,7 @@
 
     /**
      * Return whether Wi-Fi 6 GHz band is supported or not.
+     *
      * @return {@code true} if Wi-Fi 6 GHz Band is supported
      */
     public boolean is6GHzBandSupported() {
@@ -383,6 +393,7 @@
 
     /**
      * Return whether Wi-Fi Hotspot 6 GHz band is available or not.
+     *
      * @return {@code true} if Wi-Fi Hotspot 6 GHz Band is available
      */
     public boolean is6gAvailable() {
@@ -432,9 +443,63 @@
             // This is expected on some hardware.
             Log.e(TAG, "Querying usable SAP channels is unsupported, band:" + band);
         }
+        // Disable Wi-Fi hotspot speed feature if an error occurs while getting usable channels.
+        mIsSpeedFeatureAvailable = false;
+        Log.w(TAG, "isChannelAvailable(): Wi-Fi hotspot speed feature disabled");
         return defaultValue;
     }
 
+    private boolean isConfigShowSpeed() {
+        if (mIsConfigShowSpeed == null) {
+            mIsConfigShowSpeed = mAppContext.getResources()
+                    .getBoolean(R.bool.config_show_wifi_hotspot_speed);
+            log("isConfigShowSpeed():" + mIsConfigShowSpeed);
+        }
+        return mIsConfigShowSpeed;
+    }
+
+    /**
+     * Return whether Wi-Fi Hotspot Speed Feature is available or not.
+     *
+     * @return {@code true} if Wi-Fi Hotspot Speed Feature is available
+     */
+    public boolean isSpeedFeatureAvailable() {
+        if (mIsSpeedFeatureAvailable != null) {
+            return mIsSpeedFeatureAvailable;
+        }
+
+        // Check config to show Wi-Fi hotspot speed feature
+        if (!isConfigShowSpeed()) {
+            mIsSpeedFeatureAvailable = false;
+            log("isSpeedFeatureAvailable():false, isConfigShowSpeed():false");
+            return false;
+        }
+
+        // Check if 5 GHz band is not supported
+        if (!is5GHzBandSupported()) {
+            mIsSpeedFeatureAvailable = false;
+            log("isSpeedFeatureAvailable():false, 5 GHz band is not supported on this device");
+            return false;
+        }
+        // Check if 5 GHz band SAP channel is not ready
+        isChannelAvailable(WifiScanner.WIFI_BAND_5_GHZ_WITH_DFS, true /* defaultValue */);
+        if (mIsSpeedFeatureAvailable != null && !mIsSpeedFeatureAvailable) {
+            log("isSpeedFeatureAvailable():false, error occurred while getting 5 GHz SAP channel");
+            return false;
+        }
+
+        // Check if 6 GHz band SAP channel is not ready
+        isChannelAvailable(WifiScanner.WIFI_BAND_6_GHZ, false /* defaultValue */);
+        if (mIsSpeedFeatureAvailable != null && !mIsSpeedFeatureAvailable) {
+            log("isSpeedFeatureAvailable():false, error occurred while getting 6 GHz SAP channel");
+            return false;
+        }
+
+        mIsSpeedFeatureAvailable = true;
+        log("isSpeedFeatureAvailable():true");
+        return true;
+    }
+
     protected void purgeRefreshData() {
         mIs5gAvailable = null;
         mIs6gAvailable = null;
diff --git a/src/com/android/settings/wifi/tether/WifiTetherMaximizeCompatibilityPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherMaximizeCompatibilityPreferenceController.java
index a1a10ea..448a2a3 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherMaximizeCompatibilityPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherMaximizeCompatibilityPreferenceController.java
@@ -25,6 +25,7 @@
 import androidx.preference.SwitchPreference;
 
 import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
 
 /**
  * This controller helps to manage the state of maximize compatibility switch preference.
@@ -36,14 +37,31 @@
     public static final String PREF_KEY = "wifi_tether_maximize_compatibility";
 
     private boolean mIsChecked;
+    @VisibleForTesting
+    boolean mShouldHidePreference;
 
     public WifiTetherMaximizeCompatibilityPreferenceController(Context context,
             WifiTetherBasePreferenceController.OnTetherConfigUpdateListener listener) {
         super(context, listener);
+        // If the Wi-Fi Hotspot Speed Feature available, then hide this controller.
+        mShouldHidePreference = FeatureFactory.getFactory(context)
+                .getWifiFeatureProvider().getWifiHotspotRepository().isSpeedFeatureAvailable();
+        Log.d(TAG, "mShouldHidePreference:" + mShouldHidePreference);
+        if (mShouldHidePreference) {
+            return;
+        }
         mIsChecked = isMaximizeCompatibilityEnabled();
     }
 
     @Override
+    public boolean isAvailable() {
+        if (mShouldHidePreference) {
+            return false;
+        }
+        return super.isAvailable();
+    }
+
+    @Override
     public String getPreferenceKey() {
         return PREF_KEY;
     }
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
index 286b023..9a9be98 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
@@ -32,6 +32,7 @@
 
 import com.android.settings.R;
 import com.android.settings.core.FeatureFlags;
+import com.android.settings.overlay.FeatureFactory;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -48,10 +49,19 @@
     private int mSecurityValue;
     @VisibleForTesting
     boolean mIsWpa3Supported = true;
+    @VisibleForTesting
+    boolean mShouldHidePreference;
 
     public WifiTetherSecurityPreferenceController(Context context,
             OnTetherConfigUpdateListener listener) {
         super(context, listener);
+        // If the Wi-Fi Hotspot Speed Feature available, then hide this controller.
+        mShouldHidePreference = FeatureFactory.getFactory(context)
+                .getWifiFeatureProvider().getWifiHotspotRepository().isSpeedFeatureAvailable();
+        Log.d(TAG, "shouldHidePreference():" + mShouldHidePreference);
+        if (mShouldHidePreference) {
+            return;
+        }
         final String[] securityNames = mContext.getResources().getStringArray(
                 R.array.wifi_tether_security);
         final String[] securityValues = mContext.getResources().getStringArray(
@@ -63,6 +73,14 @@
     }
 
     @Override
+    public boolean isAvailable() {
+        if (mShouldHidePreference) {
+            return false;
+        }
+        return super.isAvailable();
+    }
+
+    @Override
     public String getPreferenceKey() {
         return FeatureFlagUtils.isEnabled(mContext, FeatureFlags.TETHER_ALL_IN_ONE)
                 ? PREF_KEY + DEDUP_POSTFIX : PREF_KEY;
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index bdb1a2e..174ccb0 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -136,12 +136,22 @@
 
         mWifiTetherViewModel = FeatureFactory.getFactory(getContext()).getWifiFeatureProvider()
                 .getWifiTetherViewModel(this);
-        mWifiHotspotSecurity = findPreference(KEY_WIFI_HOTSPOT_SECURITY);
-        if (mWifiHotspotSecurity != null && mWifiHotspotSecurity.isVisible()) {
-            mWifiTetherViewModel.getSecuritySummary().observe(this, this::onSecuritySummaryChanged);
+        if (mWifiTetherViewModel != null) {
+            setupSpeedFeature(mWifiTetherViewModel.isSpeedFeatureAvailable());
         }
+    }
+
+    @VisibleForTesting
+    void setupSpeedFeature(boolean isSpeedFeatureAvailable) {
+        mWifiHotspotSecurity = findPreference(KEY_WIFI_HOTSPOT_SECURITY);
         mWifiHotspotSpeed = findPreference(KEY_WIFI_HOTSPOT_SPEED);
-        if (mWifiHotspotSpeed != null && mWifiHotspotSpeed.isVisible()) {
+        if (mWifiHotspotSecurity == null || mWifiHotspotSpeed == null) {
+            return;
+        }
+        mWifiHotspotSecurity.setVisible(isSpeedFeatureAvailable);
+        mWifiHotspotSpeed.setVisible(isSpeedFeatureAvailable);
+        if (isSpeedFeatureAvailable) {
+            mWifiTetherViewModel.getSecuritySummary().observe(this, this::onSecuritySummaryChanged);
             mWifiTetherViewModel.getSpeedSummary().observe(this, this::onSpeedSummaryChanged);
         }
     }
diff --git a/src/com/android/settings/wifi/tether/WifiTetherViewModel.java b/src/com/android/settings/wifi/tether/WifiTetherViewModel.java
index 6bb2cd5..dd4ca28 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherViewModel.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherViewModel.java
@@ -83,8 +83,21 @@
 
     @Override
     protected void onCleared() {
-        mWifiHotspotRepository.getSecurityType().removeObserver(mSecurityTypeObserver);
-        mWifiHotspotRepository.getSpeedType().removeObserver(mSpeedTypeObserver);
+        if (mSecuritySummary != null) {
+            mWifiHotspotRepository.getSecurityType().removeObserver(mSecurityTypeObserver);
+        }
+        if (mSpeedSummary != null) {
+            mWifiHotspotRepository.getSpeedType().removeObserver(mSpeedTypeObserver);
+        }
+    }
+
+    /**
+     * Return whether Wi-Fi Hotspot Speed Feature is available or not.
+     *
+     * @return {@code true} if Wi-Fi Hotspot Speed Feature is available
+     */
+    public boolean isSpeedFeatureAvailable() {
+        return mWifiHotspotRepository.isSpeedFeatureAvailable();
     }
 
     /**
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
index fb64023..e264177 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
@@ -17,6 +17,8 @@
 package com.android.settings.wifi.tether;
 
 import static com.android.settings.wifi.WifiUtils.setCanShowWifiHotspotCached;
+import static com.android.settings.wifi.tether.WifiTetherSettings.KEY_WIFI_HOTSPOT_SECURITY;
+import static com.android.settings.wifi.tether.WifiTetherSettings.KEY_WIFI_HOTSPOT_SPEED;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -26,6 +28,7 @@
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -41,6 +44,7 @@
 import android.widget.TextView;
 
 import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.LiveData;
 import androidx.lifecycle.ViewModelStoreOwner;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
@@ -79,7 +83,7 @@
     @Rule
     public final MockitoRule mMockitoRule = MockitoJUnit.rule();
     @Spy
-    Context mContext = ApplicationProvider.getApplicationContext();
+    private Context mContext = ApplicationProvider.getApplicationContext();
     @Mock
     private WifiManager mWifiManager;
     @Mock
@@ -95,11 +99,19 @@
     @Mock
     private TextView mEmptyTextView;
     @Mock
-    WifiTetherViewModel mWifiTetherViewModel;
+    private WifiTetherViewModel mWifiTetherViewModel;
     @Mock
-    WifiHotspotRepository mWifiHotspotRepository;
+    private WifiHotspotRepository mWifiHotspotRepository;
+    @Mock
+    private Preference mWifiHotspotSecurity;
+    @Mock
+    private LiveData<Integer> mSecuritySummary;
+    @Mock
+    private Preference mWifiHotspotSpeed;
+    @Mock
+    private LiveData<Integer> mSpeedSummary;
 
-    private WifiTetherSettings mWifiTetherSettings;
+    private WifiTetherSettings mSettings;
 
     @Before
     public void setUp() {
@@ -118,19 +130,25 @@
         when(provider.getWifiHotspotRepository()).thenReturn(mWifiHotspotRepository);
         when(provider.getWifiTetherViewModel(mock(ViewModelStoreOwner.class)))
                 .thenReturn(mWifiTetherViewModel);
+        when(mWifiTetherViewModel.isSpeedFeatureAvailable()).thenReturn(false);
+        when(mWifiTetherViewModel.getSecuritySummary()).thenReturn(mSecuritySummary);
+        when(mWifiTetherViewModel.getSpeedSummary()).thenReturn(mSpeedSummary);
 
-        mWifiTetherSettings = new WifiTetherSettings(mWifiRestriction);
+        mSettings = spy(new WifiTetherSettings(mWifiRestriction));
+        mSettings.mWifiTetherViewModel = mWifiTetherViewModel;
+        when(mSettings.findPreference(KEY_WIFI_HOTSPOT_SECURITY)).thenReturn(mWifiHotspotSecurity);
+        when(mSettings.findPreference(KEY_WIFI_HOTSPOT_SPEED)).thenReturn(mWifiHotspotSpeed);
     }
 
     @Test
     @Config(shadows = ShadowRestrictedDashboardFragment.class)
     public void onCreate_canNotShowWifiHotspot_shouldFinish() {
         setCanShowWifiHotspotCached(false);
-        mWifiTetherSettings = spy(new WifiTetherSettings(mWifiRestriction));
+        mSettings = spy(new WifiTetherSettings(mWifiRestriction));
 
-        mWifiTetherSettings.onCreate(null);
+        mSettings.onCreate(null);
 
-        verify(mWifiTetherSettings).finish();
+        verify(mSettings).finish();
     }
 
     @Test
@@ -138,7 +156,7 @@
     public void onStart_uiIsRestricted_removeAllPreferences() {
         spyWifiTetherSettings();
 
-        mWifiTetherSettings.onStart();
+        mSettings.onStart();
 
         verify(mPreferenceScreen).removeAll();
     }
@@ -149,7 +167,7 @@
         spyWifiTetherSettings();
         when(mWifiRestriction.isHotspotAvailable(mContext)).thenReturn(false);
 
-        mWifiTetherSettings.onStart();
+        mSettings.onStart();
 
         verify(mPreferenceScreen).removeAll();
         verify(mEmptyTextView).setText(anyInt());
@@ -158,21 +176,21 @@
     @Test
     public void onSecuritySummaryChanged_canNotShowWifiHotspot_returnFalse() {
         int stringResId = R.string.wifi_security_sae;
-        mWifiTetherSettings.mWifiHotspotSecurity = mock(Preference.class);
+        mSettings.mWifiHotspotSecurity = mock(Preference.class);
 
-        mWifiTetherSettings.onSecuritySummaryChanged(stringResId);
+        mSettings.onSecuritySummaryChanged(stringResId);
 
-        verify(mWifiTetherSettings.mWifiHotspotSecurity).setSummary(stringResId);
+        verify(mSettings.mWifiHotspotSecurity).setSummary(stringResId);
     }
 
     @Test
     public void onSpeedSummaryChanged_canNotShowWifiHotspot_returnFalse() {
         int stringResId = R.string.wifi_hotspot_speed_summary_6g;
-        mWifiTetherSettings.mWifiHotspotSpeed = mock(Preference.class);
+        mSettings.mWifiHotspotSpeed = mock(Preference.class);
 
-        mWifiTetherSettings.onSpeedSummaryChanged(stringResId);
+        mSettings.onSpeedSummaryChanged(stringResId);
 
-        verify(mWifiTetherSettings.mWifiHotspotSpeed).setSummary(stringResId);
+        verify(mSettings.mWifiHotspotSpeed).setSummary(stringResId);
     }
 
     @Test
@@ -183,7 +201,7 @@
 
     @Test
     public void createPreferenceControllers_hasAutoOffPreference() {
-        assertThat(mWifiTetherSettings.createPreferenceControllers(mContext)
+        assertThat(mSettings.createPreferenceControllers(mContext)
                 .stream()
                 .filter(controller -> controller instanceof WifiTetherAutoOffPreferenceController)
                 .count())
@@ -270,23 +288,42 @@
                 .isFalse();
     }
 
+    @Test
+    public void setupSpeedFeature_speedFeatureIsAvailable_setVisibleToTrue() {
+        mSettings.setupSpeedFeature(true);
+
+        verify(mWifiHotspotSecurity).setVisible(true);
+        verify(mWifiHotspotSpeed).setVisible(true);
+        verify(mSecuritySummary).observe(any(), any());
+        verify(mSpeedSummary).observe(any(), any());
+    }
+
+    @Test
+    public void setupSpeedFeature_speedFeatureIsNotAvailable_setVisibleToFalse() {
+        mSettings.setupSpeedFeature(false);
+
+        verify(mWifiHotspotSecurity).setVisible(false);
+        verify(mWifiHotspotSpeed).setVisible(false);
+        verify(mSecuritySummary, never()).observe(any(), any());
+        verify(mSpeedSummary, never()).observe(any(), any());
+    }
+
     private void spyWifiTetherSettings() {
-        mWifiTetherSettings = spy(new WifiTetherSettings(mWifiRestriction));
+        mSettings = spy(new WifiTetherSettings(mWifiRestriction));
         final FragmentActivity activity = mock(FragmentActivity.class);
-        when(mWifiTetherSettings.getActivity()).thenReturn(activity);
-        when(mWifiTetherSettings.getContext()).thenReturn(mContext);
+        when(mSettings.getActivity()).thenReturn(activity);
+        when(mSettings.getContext()).thenReturn(mContext);
         final Resources.Theme theme = mContext.getTheme();
         when(activity.getTheme()).thenReturn(theme);
         when(activity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
-        doNothing().when(mWifiTetherSettings)
-                .onCreatePreferences(any(Bundle.class), nullable(String.class));
+        doNothing().when(mSettings).onCreatePreferences(any(Bundle.class), nullable(String.class));
         final FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest();
-        ReflectionHelpers.setField(mWifiTetherSettings, "mDashboardFeatureProvider",
+        ReflectionHelpers.setField(mSettings, "mDashboardFeatureProvider",
                 fakeFeatureFactory.dashboardFeatureProvider);
-        ReflectionHelpers.setField(mWifiTetherSettings, "mEmptyTextView", mEmptyTextView);
-        doReturn(mPreferenceScreen).when(mWifiTetherSettings).getPreferenceScreen();
+        ReflectionHelpers.setField(mSettings, "mEmptyTextView", mEmptyTextView);
+        doReturn(mPreferenceScreen).when(mSettings).getPreferenceScreen();
 
-        mWifiTetherSettings.onCreate(Bundle.EMPTY);
+        mSettings.onCreate(Bundle.EMPTY);
     }
 
     @Implements(RestrictedDashboardFragment.class)
diff --git a/tests/unit/src/com/android/settings/wifi/repository/WifiHotspotRepositoryTest.java b/tests/unit/src/com/android/settings/wifi/repository/WifiHotspotRepositoryTest.java
index dbbdfec..6559c12 100644
--- a/tests/unit/src/com/android/settings/wifi/repository/WifiHotspotRepositoryTest.java
+++ b/tests/unit/src/com/android/settings/wifi/repository/WifiHotspotRepositoryTest.java
@@ -36,6 +36,7 @@
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -592,6 +593,65 @@
         assertThat(mWifiHotspotRepository.get6gAvailable()).isNotNull();
     }
 
+    @Test
+    public void isSpeedFeatureAvailable_configNotShow_returnFalse() {
+        mWifiHotspotRepository.mIsConfigShowSpeed = false;
+
+        assertThat(mWifiHotspotRepository.isSpeedFeatureAvailable()).isFalse();
+    }
+
+    @Test
+    public void isSpeedFeatureAvailable_5gBandNotSupported_returnFalse() {
+        mWifiHotspotRepository.mIsConfigShowSpeed = true;
+        mWifiHotspotRepository.mIs5gBandSupported = false;
+
+        assertThat(mWifiHotspotRepository.isSpeedFeatureAvailable()).isFalse();
+    }
+
+    @Test
+    public void isSpeedFeatureAvailable_throwExceptionWhenGet5gSapChannel_returnFalse() {
+        mWifiHotspotRepository.mIsConfigShowSpeed = true;
+        mWifiHotspotRepository.mIs5gBandSupported = true;
+        doThrow(IllegalArgumentException.class).when(mWifiManager)
+                .getUsableChannels(WifiScanner.WIFI_BAND_5_GHZ_WITH_DFS, OP_MODE_SAP);
+
+        assertThat(mWifiHotspotRepository.isSpeedFeatureAvailable()).isFalse();
+
+        doThrow(UnsupportedOperationException.class).when(mWifiManager)
+                .getUsableChannels(WifiScanner.WIFI_BAND_5_GHZ_WITH_DFS, OP_MODE_SAP);
+
+        assertThat(mWifiHotspotRepository.isSpeedFeatureAvailable()).isFalse();
+    }
+
+    @Test
+    public void isSpeedFeatureAvailable_throwExceptionWhenGet6gSapChannel_returnFalse() {
+        mWifiHotspotRepository.mIsConfigShowSpeed = true;
+        mWifiHotspotRepository.mIs5gBandSupported = true;
+        doReturn(Arrays.asList(new WifiAvailableChannel(FREQ_5GHZ, OP_MODE_SAP))).when(mWifiManager)
+                .getUsableChannels(WifiScanner.WIFI_BAND_5_GHZ_WITH_DFS, OP_MODE_SAP);
+        doThrow(IllegalArgumentException.class).when(mWifiManager)
+                .getUsableChannels(WifiScanner.WIFI_BAND_6_GHZ, OP_MODE_SAP);
+
+        assertThat(mWifiHotspotRepository.isSpeedFeatureAvailable()).isFalse();
+
+        doThrow(UnsupportedOperationException.class).when(mWifiManager)
+                .getUsableChannels(WifiScanner.WIFI_BAND_6_GHZ, OP_MODE_SAP);
+
+        assertThat(mWifiHotspotRepository.isSpeedFeatureAvailable()).isFalse();
+    }
+
+    @Test
+    public void isSpeedFeatureAvailable_conditionsAreReady_returnTrue() {
+        mWifiHotspotRepository.mIsConfigShowSpeed = true;
+        mWifiHotspotRepository.mIs5gBandSupported = true;
+        doReturn(Arrays.asList(new WifiAvailableChannel(FREQ_5GHZ, OP_MODE_SAP))).when(mWifiManager)
+                .getUsableChannels(WifiScanner.WIFI_BAND_5_GHZ_WITH_DFS, OP_MODE_SAP);
+        doReturn(Arrays.asList(new WifiAvailableChannel(FREQ_6GHZ, OP_MODE_SAP))).when(mWifiManager)
+                .getUsableChannels(WifiScanner.WIFI_BAND_6_GHZ, OP_MODE_SAP);
+
+        assertThat(mWifiHotspotRepository.isSpeedFeatureAvailable()).isTrue();
+    }
+
     private void mockConfigSecurityType(int securityType) {
         mockConfig(securityType, SPEED_2GHZ);
     }
diff --git a/tests/unit/src/com/android/settings/wifi/tether/WifiTetherMaximizeCompatibilityPreferenceControllerTest.java b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherMaximizeCompatibilityPreferenceControllerTest.java
index 3d8b24c..529acea 100644
--- a/tests/unit/src/com/android/settings/wifi/tether/WifiTetherMaximizeCompatibilityPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherMaximizeCompatibilityPreferenceControllerTest.java
@@ -237,4 +237,11 @@
 
         assertThat(builder.build().getBand()).isEqualTo(SoftApConfiguration.BAND_2GHZ);
     }
+
+    @Test
+    public void isAvailable_shouldHidePreference_returnFalse() {
+        mController.mShouldHidePreference = true;
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
 }
diff --git a/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceControllerTest.java b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceControllerTest.java
index c86e3e5..1ce05f8 100644
--- a/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceControllerTest.java
@@ -203,4 +203,11 @@
                 .isEqualTo(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
         assertThat(mPreference.getSummary().toString()).isEqualTo("WPA2-Personal");
     }
+
+    @Test
+    public void isAvailable_shouldHidePreference_returnFalse() {
+        mController.mShouldHidePreference = true;
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
 }
diff --git a/tests/unit/src/com/android/settings/wifi/tether/WifiTetherViewModelTest.java b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherViewModelTest.java
index 4c8ce5b..36da390 100644
--- a/tests/unit/src/com/android/settings/wifi/tether/WifiTetherViewModelTest.java
+++ b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherViewModelTest.java
@@ -72,7 +72,10 @@
     }
 
     @Test
-    public void onCleared_setAutoRefreshFalse() {
+    public void onCleared_removeObservers() {
+        mViewModel.getSecuritySummary();
+        mViewModel.getSpeedSummary();
+
         mViewModel.onCleared();
 
         verify(mSecurityType).removeObserver(mViewModel.mSecurityTypeObserver);
@@ -116,4 +119,11 @@
         assertThat(mViewModel.mSpeedSummary).isNotNull();
         verify(mSpeedType).observeForever(mViewModel.mSpeedTypeObserver);
     }
+
+    @Test
+    public void isSpeedFeatureAvailable_verifyRepositoryIsCalled() {
+        mViewModel.isSpeedFeatureAvailable();
+
+        verify(mWifiHotspotRepository).isSpeedFeatureAvailable();
+    }
 }