Loading res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -331,6 +331,9 @@ surface in search results or not.--> <bool name="config_show_wifi_settings">true</bool> <!-- Whether Wi-Fi hotspot settings should be shown or not. --> <bool name="config_show_wifi_hotspot_settings">true</bool> <!-- Whether toggle_airplane is available or not. --> <bool name="config_show_toggle_airplane">true</bool> Loading src/com/android/settings/wifi/WifiUtils.java +68 −0 Original line number Diff line number Diff line Loading @@ -22,14 +22,20 @@ import android.content.ContentResolver; import android.content.Context; import android.content.pm.PackageManager; import android.net.NetworkCapabilities; import android.net.TetheringManager; import android.net.wifi.ScanResult; import android.net.wifi.SoftApConfiguration; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.Utils; import com.android.wifitrackerlib.WifiEntry; Loading @@ -38,12 +44,16 @@ import java.nio.charset.StandardCharsets; /** A utility class for Wi-Fi functions. */ public class WifiUtils extends com.android.settingslib.wifi.WifiUtils { static final String TAG = "WifiUtils"; private static final int SSID_ASCII_MIN_LENGTH = 1; private static final int SSID_ASCII_MAX_LENGTH = 32; private static final int PSK_PASSPHRASE_ASCII_MIN_LENGTH = 8; private static final int PSK_PASSPHRASE_ASCII_MAX_LENGTH = 63; private static Boolean sCanShowWifiHotspotCached; public static boolean isSSIDTooLong(String ssid) { if (TextUtils.isEmpty(ssid)) { return false; Loading Loading @@ -240,4 +250,62 @@ public class WifiUtils extends com.android.settingslib.wifi.WifiUtils { return WifiEntry.SECURITY_NONE; } /** * Check if Wi-Fi hotspot settings can be displayed. * * @param context Context of caller * @return true if Wi-Fi hotspot settings can be displayed */ public static boolean checkShowWifiHotspot(Context context) { if (context == null) return false; boolean showWifiHotspotSettings = context.getResources().getBoolean(R.bool.config_show_wifi_hotspot_settings); if (!showWifiHotspotSettings) { Log.w(TAG, "config_show_wifi_hotspot_settings:false"); return false; } WifiManager wifiManager = context.getSystemService(WifiManager.class); if (wifiManager == null) { Log.e(TAG, "WifiManager is null"); return false; } TetheringManager tetheringManager = context.getSystemService(TetheringManager.class); if (tetheringManager == null) { Log.e(TAG, "TetheringManager is null"); return false; } String[] wifiRegexs = tetheringManager.getTetherableWifiRegexs(); if (wifiRegexs == null || wifiRegexs.length == 0) { Log.w(TAG, "TetherableWifiRegexs is empty"); return false; } return true; } /** * Return the cached result to see if Wi-Fi hotspot settings can be displayed. * * @param context Context of caller * @return true if Wi-Fi hotspot settings can be displayed */ public static boolean canShowWifiHotspot(Context context) { if (sCanShowWifiHotspotCached == null) { sCanShowWifiHotspotCached = checkShowWifiHotspot(context); } return sCanShowWifiHotspotCached; } /** * Sets the sCanShowWifiHotspotCached for testing purposes. * * @param cached Cached value for #canShowWifiHotspot() */ @VisibleForTesting public static void setCanShowWifiHotspotCached(Boolean cached) { sCanShowWifiHotspotCached = cached; } } src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java +4 −11 Original line number Diff line number Diff line Loading @@ -16,9 +16,10 @@ package com.android.settings.wifi.tether; import static com.android.settings.wifi.WifiUtils.canShowWifiHotspot; import android.annotation.NonNull; import android.content.Context; import android.net.TetheringManager; import android.net.wifi.SoftApConfiguration; import android.net.wifi.WifiClient; import android.net.wifi.WifiManager; Loading Loading @@ -46,7 +47,6 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController private static final String WIFI_TETHER_SETTINGS = "wifi_tether"; private boolean mIsWifiTetherable; private WifiManager mWifiManager; private boolean mIsWifiTetheringAllow; private int mSoftApState; Loading @@ -57,8 +57,7 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController public WifiTetherPreferenceController(Context context, Lifecycle lifecycle) { this(context, lifecycle, context.getSystemService(WifiManager.class), context.getSystemService(TetheringManager.class), context.getApplicationContext().getSystemService(WifiManager.class), true /* initSoftApManager */, WifiEnterpriseRestrictionUtils.isWifiTetheringAllowed(context)); } Loading @@ -68,15 +67,9 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController Context context, Lifecycle lifecycle, WifiManager wifiManager, TetheringManager tetheringManager, boolean initSoftApManager, boolean isWifiTetheringAllow) { super(context); final String[] wifiRegexs = tetheringManager.getTetherableWifiRegexs(); if (wifiRegexs != null && wifiRegexs.length != 0) { mIsWifiTetherable = true; } mIsWifiTetheringAllow = isWifiTetheringAllow; if (!isWifiTetheringAllow) return; Loading @@ -92,7 +85,7 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController @Override public boolean isAvailable() { return mIsWifiTetherable && !Utils.isMonkeyRunning(); return canShowWifiHotspot(mContext) && !Utils.isMonkeyRunning(); } @Override Loading src/com/android/settings/wifi/tether/WifiTetherSettings.java +9 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.settings.wifi.tether; import static android.net.wifi.WifiManager.WIFI_AP_STATE_CHANGED_ACTION; import static com.android.settings.wifi.WifiUtils.canShowWifiHotspot; import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; import android.content.Context; Loading Loading @@ -107,6 +109,13 @@ public class WifiTetherSettings extends RestrictedDashboardFragment @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); if (!canShowWifiHotspot(getContext())) { Log.e(TAG, "can not launch Wi-Fi hotspot settings" + " because the config is not set to show."); finish(); return; } setIfOnlyAvailableForAdmins(true); mUnavailable = isUiRestricted() || !mWifiRestriction.isHotspotAvailable(getContext()); } Loading tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java +11 −13 Original line number Diff line number Diff line Loading @@ -16,13 +16,14 @@ package com.android.settings.wifi.tether; import static com.android.settings.wifi.WifiUtils.setCanShowWifiHotspotCached; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; import android.content.Context; import android.net.TetheringManager; import android.net.wifi.SoftApConfiguration; import android.net.wifi.WifiManager; Loading Loading @@ -62,8 +63,6 @@ public class WifiTetherPreferenceControllerTest { @Mock private Lifecycle mLifecycle; @Mock private TetheringManager mTetheringManager; @Mock private WifiManager mWifiManager; @Mock private PreferenceScreen mScreen; Loading @@ -74,38 +73,37 @@ public class WifiTetherPreferenceControllerTest { @Before public void setUp() { setCanShowWifiHotspotCached(true); FakeFeatureFactory.setupForTest(); mPreference = new PrimarySwitchPreference(mContext); when(mContext.getSystemService(Context.TETHERING_SERVICE)).thenReturn(mTetheringManager); when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager); when(mScreen.findPreference(anyString())).thenReturn(mPreference); mSoftApConfiguration = new SoftApConfiguration.Builder().setSsid(SSID).build(); when(mWifiManager.getSoftApConfiguration()).thenReturn(mSoftApConfiguration); when(mTetheringManager.getTetherableWifiRegexs()).thenReturn(new String[]{"1", "2"}); mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, mTetheringManager, false /* initSoftApManager */, true /* isWifiTetheringAllow */); false /* initSoftApManager */, true /* isWifiTetheringAllow */); mController.displayPreference(mScreen); } @Test public void isAvailable_noTetherRegex_shouldReturnFalse() { when(mTetheringManager.getTetherableWifiRegexs()).thenReturn(new String[]{}); mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, mTetheringManager, false /* initSoftApManager */, true /* isWifiTetheringAllow */); public void isAvailable_canNotShowWifiHotspot_shouldReturnFalse() { setCanShowWifiHotspotCached(false); assertThat(mController.isAvailable()).isFalse(); } @Test public void isAvailable_hasTetherRegex_shouldReturnTrue() { public void isAvailable_canShowWifiHostspot_shouldReturnTrue() { setCanShowWifiHotspotCached(true); assertThat(mController.isAvailable()).isTrue(); } @Test public void displayPreference_wifiTetheringNotAllowed_shouldDisable() { mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, mTetheringManager, false /* initSoftApManager */, false /* isWifiTetheringAllow */); false /* initSoftApManager */, false /* isWifiTetheringAllow */); mController.displayPreference(mScreen); Loading @@ -116,7 +114,7 @@ public class WifiTetherPreferenceControllerTest { @Test public void displayPreference_wifiTetheringAllowed_shouldEnable() { mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, mTetheringManager, false /* initSoftApManager */, true /* isWifiTetheringAllow */); false /* initSoftApManager */, true /* isWifiTetheringAllow */); mController.displayPreference(mScreen); Loading Loading
res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -331,6 +331,9 @@ surface in search results or not.--> <bool name="config_show_wifi_settings">true</bool> <!-- Whether Wi-Fi hotspot settings should be shown or not. --> <bool name="config_show_wifi_hotspot_settings">true</bool> <!-- Whether toggle_airplane is available or not. --> <bool name="config_show_toggle_airplane">true</bool> Loading
src/com/android/settings/wifi/WifiUtils.java +68 −0 Original line number Diff line number Diff line Loading @@ -22,14 +22,20 @@ import android.content.ContentResolver; import android.content.Context; import android.content.pm.PackageManager; import android.net.NetworkCapabilities; import android.net.TetheringManager; import android.net.wifi.ScanResult; import android.net.wifi.SoftApConfiguration; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.Utils; import com.android.wifitrackerlib.WifiEntry; Loading @@ -38,12 +44,16 @@ import java.nio.charset.StandardCharsets; /** A utility class for Wi-Fi functions. */ public class WifiUtils extends com.android.settingslib.wifi.WifiUtils { static final String TAG = "WifiUtils"; private static final int SSID_ASCII_MIN_LENGTH = 1; private static final int SSID_ASCII_MAX_LENGTH = 32; private static final int PSK_PASSPHRASE_ASCII_MIN_LENGTH = 8; private static final int PSK_PASSPHRASE_ASCII_MAX_LENGTH = 63; private static Boolean sCanShowWifiHotspotCached; public static boolean isSSIDTooLong(String ssid) { if (TextUtils.isEmpty(ssid)) { return false; Loading Loading @@ -240,4 +250,62 @@ public class WifiUtils extends com.android.settingslib.wifi.WifiUtils { return WifiEntry.SECURITY_NONE; } /** * Check if Wi-Fi hotspot settings can be displayed. * * @param context Context of caller * @return true if Wi-Fi hotspot settings can be displayed */ public static boolean checkShowWifiHotspot(Context context) { if (context == null) return false; boolean showWifiHotspotSettings = context.getResources().getBoolean(R.bool.config_show_wifi_hotspot_settings); if (!showWifiHotspotSettings) { Log.w(TAG, "config_show_wifi_hotspot_settings:false"); return false; } WifiManager wifiManager = context.getSystemService(WifiManager.class); if (wifiManager == null) { Log.e(TAG, "WifiManager is null"); return false; } TetheringManager tetheringManager = context.getSystemService(TetheringManager.class); if (tetheringManager == null) { Log.e(TAG, "TetheringManager is null"); return false; } String[] wifiRegexs = tetheringManager.getTetherableWifiRegexs(); if (wifiRegexs == null || wifiRegexs.length == 0) { Log.w(TAG, "TetherableWifiRegexs is empty"); return false; } return true; } /** * Return the cached result to see if Wi-Fi hotspot settings can be displayed. * * @param context Context of caller * @return true if Wi-Fi hotspot settings can be displayed */ public static boolean canShowWifiHotspot(Context context) { if (sCanShowWifiHotspotCached == null) { sCanShowWifiHotspotCached = checkShowWifiHotspot(context); } return sCanShowWifiHotspotCached; } /** * Sets the sCanShowWifiHotspotCached for testing purposes. * * @param cached Cached value for #canShowWifiHotspot() */ @VisibleForTesting public static void setCanShowWifiHotspotCached(Boolean cached) { sCanShowWifiHotspotCached = cached; } }
src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java +4 −11 Original line number Diff line number Diff line Loading @@ -16,9 +16,10 @@ package com.android.settings.wifi.tether; import static com.android.settings.wifi.WifiUtils.canShowWifiHotspot; import android.annotation.NonNull; import android.content.Context; import android.net.TetheringManager; import android.net.wifi.SoftApConfiguration; import android.net.wifi.WifiClient; import android.net.wifi.WifiManager; Loading Loading @@ -46,7 +47,6 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController private static final String WIFI_TETHER_SETTINGS = "wifi_tether"; private boolean mIsWifiTetherable; private WifiManager mWifiManager; private boolean mIsWifiTetheringAllow; private int mSoftApState; Loading @@ -57,8 +57,7 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController public WifiTetherPreferenceController(Context context, Lifecycle lifecycle) { this(context, lifecycle, context.getSystemService(WifiManager.class), context.getSystemService(TetheringManager.class), context.getApplicationContext().getSystemService(WifiManager.class), true /* initSoftApManager */, WifiEnterpriseRestrictionUtils.isWifiTetheringAllowed(context)); } Loading @@ -68,15 +67,9 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController Context context, Lifecycle lifecycle, WifiManager wifiManager, TetheringManager tetheringManager, boolean initSoftApManager, boolean isWifiTetheringAllow) { super(context); final String[] wifiRegexs = tetheringManager.getTetherableWifiRegexs(); if (wifiRegexs != null && wifiRegexs.length != 0) { mIsWifiTetherable = true; } mIsWifiTetheringAllow = isWifiTetheringAllow; if (!isWifiTetheringAllow) return; Loading @@ -92,7 +85,7 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController @Override public boolean isAvailable() { return mIsWifiTetherable && !Utils.isMonkeyRunning(); return canShowWifiHotspot(mContext) && !Utils.isMonkeyRunning(); } @Override Loading
src/com/android/settings/wifi/tether/WifiTetherSettings.java +9 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.settings.wifi.tether; import static android.net.wifi.WifiManager.WIFI_AP_STATE_CHANGED_ACTION; import static com.android.settings.wifi.WifiUtils.canShowWifiHotspot; import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; import android.content.Context; Loading Loading @@ -107,6 +109,13 @@ public class WifiTetherSettings extends RestrictedDashboardFragment @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); if (!canShowWifiHotspot(getContext())) { Log.e(TAG, "can not launch Wi-Fi hotspot settings" + " because the config is not set to show."); finish(); return; } setIfOnlyAvailableForAdmins(true); mUnavailable = isUiRestricted() || !mWifiRestriction.isHotspotAvailable(getContext()); } Loading
tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java +11 −13 Original line number Diff line number Diff line Loading @@ -16,13 +16,14 @@ package com.android.settings.wifi.tether; import static com.android.settings.wifi.WifiUtils.setCanShowWifiHotspotCached; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; import android.content.Context; import android.net.TetheringManager; import android.net.wifi.SoftApConfiguration; import android.net.wifi.WifiManager; Loading Loading @@ -62,8 +63,6 @@ public class WifiTetherPreferenceControllerTest { @Mock private Lifecycle mLifecycle; @Mock private TetheringManager mTetheringManager; @Mock private WifiManager mWifiManager; @Mock private PreferenceScreen mScreen; Loading @@ -74,38 +73,37 @@ public class WifiTetherPreferenceControllerTest { @Before public void setUp() { setCanShowWifiHotspotCached(true); FakeFeatureFactory.setupForTest(); mPreference = new PrimarySwitchPreference(mContext); when(mContext.getSystemService(Context.TETHERING_SERVICE)).thenReturn(mTetheringManager); when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager); when(mScreen.findPreference(anyString())).thenReturn(mPreference); mSoftApConfiguration = new SoftApConfiguration.Builder().setSsid(SSID).build(); when(mWifiManager.getSoftApConfiguration()).thenReturn(mSoftApConfiguration); when(mTetheringManager.getTetherableWifiRegexs()).thenReturn(new String[]{"1", "2"}); mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, mTetheringManager, false /* initSoftApManager */, true /* isWifiTetheringAllow */); false /* initSoftApManager */, true /* isWifiTetheringAllow */); mController.displayPreference(mScreen); } @Test public void isAvailable_noTetherRegex_shouldReturnFalse() { when(mTetheringManager.getTetherableWifiRegexs()).thenReturn(new String[]{}); mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, mTetheringManager, false /* initSoftApManager */, true /* isWifiTetheringAllow */); public void isAvailable_canNotShowWifiHotspot_shouldReturnFalse() { setCanShowWifiHotspotCached(false); assertThat(mController.isAvailable()).isFalse(); } @Test public void isAvailable_hasTetherRegex_shouldReturnTrue() { public void isAvailable_canShowWifiHostspot_shouldReturnTrue() { setCanShowWifiHotspotCached(true); assertThat(mController.isAvailable()).isTrue(); } @Test public void displayPreference_wifiTetheringNotAllowed_shouldDisable() { mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, mTetheringManager, false /* initSoftApManager */, false /* isWifiTetheringAllow */); false /* initSoftApManager */, false /* isWifiTetheringAllow */); mController.displayPreference(mScreen); Loading @@ -116,7 +114,7 @@ public class WifiTetherPreferenceControllerTest { @Test public void displayPreference_wifiTetheringAllowed_shouldEnable() { mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, mTetheringManager, false /* initSoftApManager */, true /* isWifiTetheringAllow */); false /* initSoftApManager */, true /* isWifiTetheringAllow */); mController.displayPreference(mScreen); Loading