diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java index ae030f47951..de4d127a84e 100644 --- a/src/com/android/settings/network/NetworkProviderSettings.java +++ b/src/com/android/settings/network/NetworkProviderSettings.java @@ -49,6 +49,7 @@ import android.view.MenuItem; import android.view.View; import android.widget.Toast; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; @@ -87,6 +88,7 @@ import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.LayoutPreference; +import com.android.settingslib.wifi.WifiEnterpriseRestrictionUtils; import com.android.settingslib.wifi.WifiSavedConfigUtils; import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiEntry.ConnectCallback; @@ -127,6 +129,8 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment private static final String PREF_KEY_AIRPLANE_MODE_MSG = "airplane_mode_message"; private static final String PREF_KEY_EMPTY_WIFI_LIST = "wifi_empty_list"; + @VisibleForTesting + static final String PREF_KEY_WIFI_TOGGLE = "main_toggle_wifi"; // TODO(b/70983952): Rename these to use WifiEntry instead of AccessPoint. @VisibleForTesting static final String PREF_KEY_CONNECTED_ACCESS_POINTS = "connected_access_point"; @@ -1236,26 +1240,54 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment } }; - public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider(R.xml.network_provider_settings) { + public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new SearchIndexProvider(R.xml.network_provider_settings); - @Override - public List getNonIndexableKeys(Context context) { - final List keys = super.getNonIndexableKeys(context); + @VisibleForTesting + static class SearchIndexProvider extends BaseSearchIndexProvider { - final WifiManager wifiManager = context.getSystemService(WifiManager.class); - if (wifiManager == null) return keys; + private final WifiRestriction mWifiRestriction; - if (WifiSavedConfigUtils.getAllConfigsCount(context, wifiManager) == 0) { - keys.add(PREF_KEY_SAVED_NETWORKS); - } + SearchIndexProvider(int xmlRes) { + super(xmlRes); + mWifiRestriction = new WifiRestriction(); + } - if (!DataUsageUtils.hasWifiRadio(context)) { - keys.add(PREF_KEY_DATA_USAGE); - } - return keys; - } - }; + @VisibleForTesting + SearchIndexProvider(int xmlRes, WifiRestriction wifiRestriction) { + super(xmlRes); + mWifiRestriction = wifiRestriction; + } + + @Override + public List getNonIndexableKeys(Context context) { + final List keys = super.getNonIndexableKeys(context); + + if (!mWifiRestriction.isChangeWifiStateAllowed(context)) { + keys.add(PREF_KEY_WIFI_TOGGLE); + } + + final WifiManager wifiManager = context.getSystemService(WifiManager.class); + if (wifiManager == null) return keys; + + if (WifiSavedConfigUtils.getAllConfigsCount(context, wifiManager) == 0) { + keys.add(PREF_KEY_SAVED_NETWORKS); + } + + if (!DataUsageUtils.hasWifiRadio(context)) { + keys.add(PREF_KEY_DATA_USAGE); + } + return keys; + } + } + + @VisibleForTesting + static class WifiRestriction { + public boolean isChangeWifiStateAllowed(@Nullable Context context) { + if (context == null) return true; + return WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(context); + } + } private class WifiEntryConnectCallback implements ConnectCallback { final WifiEntry mConnectWifiEntry; diff --git a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java index 5ee96769696..1424d0eced1 100644 --- a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java +++ b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java @@ -60,6 +60,7 @@ import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import androidx.recyclerview.widget.RecyclerView; +import androidx.test.core.app.ApplicationProvider; import com.android.settings.AirplaneModeEnabler; import com.android.settings.R; @@ -77,24 +78,33 @@ import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiPickerTracker; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.shadows.ShadowToast; +import java.util.List; + @RunWith(RobolectricTestRunner.class) public class NetworkProviderSettingsTest { + private static final int XML_RES = R.xml.wifi_tether_settings; private static final int NUM_NETWORKS = 4; private static final String FAKE_URI_STRING = "fakeuri"; + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Spy + Context mContext = ApplicationProvider.getApplicationContext(); @Mock private PowerManager mPowerManager; @Mock @@ -107,7 +117,6 @@ public class NetworkProviderSettingsTest { private AirplaneModeEnabler mAirplaneModeEnabler; @Mock private DataUsagePreference mDataUsagePreference; - private Context mContext; private NetworkProviderSettings mNetworkProviderSettings; @Mock private WifiPickerTracker mMockWifiPickerTracker; @@ -131,12 +140,11 @@ public class NetworkProviderSettingsTest { PreferenceCategory mConnectedWifiEntryPreferenceCategory; @Mock PreferenceCategory mFirstWifiEntryPreferenceCategory; + @Mock + NetworkProviderSettings.WifiRestriction mWifiRestriction; @Before public void setUp() { - MockitoAnnotations.initMocks(this); - mContext = spy(RuntimeEnvironment.application); - mNetworkProviderSettings = spy(new NetworkProviderSettings()); doReturn(mContext).when(mNetworkProviderSettings).getContext(); doReturn(mPreferenceManager).when(mNetworkProviderSettings).getPreferenceManager(); @@ -721,6 +729,28 @@ public class NetworkProviderSettingsTest { verify(mContextMenu, never()).add(anyInt(), eq(MENU_ID_FORGET), anyInt(), anyInt()); } + @Test + public void getNonIndexableKeys_allowedChangeWifiState_keyNotReturned() { + when(mWifiRestriction.isChangeWifiStateAllowed(mContext)).thenReturn(true); + NetworkProviderSettings.SearchIndexProvider searchIndexProvider = + new NetworkProviderSettings.SearchIndexProvider(XML_RES, mWifiRestriction); + + final List keys = searchIndexProvider.getNonIndexableKeys(mContext); + + assertThat(keys).doesNotContain(NetworkProviderSettings.PREF_KEY_WIFI_TOGGLE); + } + + @Test + public void getNonIndexableKeys_disallowedChangeWifiState_keyReturned() { + when(mWifiRestriction.isChangeWifiStateAllowed(mContext)).thenReturn(false); + NetworkProviderSettings.SearchIndexProvider searchIndexProvider = + new NetworkProviderSettings.SearchIndexProvider(XML_RES, mWifiRestriction); + + final List keys = searchIndexProvider.getNonIndexableKeys(mContext); + + assertThat(keys).contains(NetworkProviderSettings.PREF_KEY_WIFI_TOGGLE); + } + @Implements(PreferenceFragmentCompat.class) public static class ShadowPreferenceFragmentCompat {