Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 160b5078 authored by Weng Su's avatar Weng Su
Browse files

Add config for Wi-Fi Hotspot Settings hidden

- Add config_show_wifi_hotspot_settings for Settings customization

- Hide Wi-Fi Hotspot preference in Hotspot & tethering Settings

- Don't launch Wi-Fi Hotspot Settings (e.g long press on Hotspot in QS-tile)

Bug: 213426762
Test: manual test
atest -c com.android.settings.wifi.WifiUtilsTest
make RunSettingsRoboTests ROBOTEST_FILTER=WifiTetherPreferenceControllerTest
make RunSettingsRoboTests ROBOTEST_FILTER=WifiTetherSettingsTest

Change-Id: I11f88d0d15d6d5c2766b64b5847ac31ed0f34c25
parent f8eb2960
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -318,6 +318,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>

+68 −0
Original line number Diff line number Diff line
@@ -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;

@@ -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;
@@ -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;
    }
}
+3 −10
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -59,7 +59,6 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController
        // TODO(b/246537032):Use fragment context to WifiManager service will caused memory leak
        this(context, lifecycle,
                context.getApplicationContext().getSystemService(WifiManager.class),
                context.getSystemService(TetheringManager.class),
                true /* initSoftApManager */,
                WifiEnterpriseRestrictionUtils.isWifiTetheringAllowed(context));
    }
@@ -69,15 +68,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;

@@ -93,7 +86,7 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController

    @Override
    public boolean isAvailable() {
        return mIsWifiTetherable && !Utils.isMonkeyRunning();
        return canShowWifiHotspot(mContext) && !Utils.isMonkeyRunning();
    }

    @Override
+9 −0
Original line number Diff line number Diff line
@@ -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;
@@ -108,6 +110,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());
    }
+11 −13
Original line number Diff line number Diff line
@@ -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;

@@ -62,8 +63,6 @@ public class WifiTetherPreferenceControllerTest {
    @Mock
    private Lifecycle mLifecycle;
    @Mock
    private TetheringManager mTetheringManager;
    @Mock
    private WifiManager mWifiManager;
    @Mock
    private PreferenceScreen mScreen;
@@ -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);

@@ -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