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

Commit 87d2f6d3 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add config for Wi-Fi Hotspot Settings hidden" into tm-qpr-dev

parents f25d55b3 f9b5e046
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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>

+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;
    }
}
+4 −11
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;
@@ -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));
    }
@@ -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;

@@ -92,7 +85,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;
@@ -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());
    }
+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