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

Commit b9c865b7 authored by Weng Su's avatar Weng Su
Browse files

Add Hotspot WPA3 Settings

- Add WPA3 SAE security types
  - "WPA3-Personal"
  - "WPA2/WPA3-Personal"

- Verify valid WPA3 password

- Enable QR code scanner for Hotspot WPA3

- Avoid null point exception when settings keyword searching

- Screenshot
  https://screenshot.googleplex.com/B6u54wh8w35Xnyf
  https://screenshot.googleplex.com/8hWHHUTb6UaS9vB

Bug: 167968488
Test: manual test
- atest WifiTetherSecurityPreferenceControllerTest
- atest WifiUtilsTest

Change-Id: I2992040498f8add107a4cce70a92c1c6ee6ab805
parent 6ac579fe
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -222,6 +222,10 @@

    <!-- Security types for wireless tether -->
    <string-array name="wifi_tether_security">
        <!-- Do not translate. -->
        <item>@string/wifi_security_sae</item>
        <!-- Do not translate. -->
        <item>@string/wifi_security_psk_sae</item>
        <!-- Do not translate. -->
        <item>@string/wifi_security_wpa2</item>
        <!-- Do not translate. -->
@@ -230,6 +234,10 @@

    <!-- Values for security type for wireless tether -->
    <string-array name="wifi_tether_security_values" translatable="false">
        <!-- Do not translate. -->
        <item>3</item>
        <!-- Do not translate. -->
        <item>2</item>
        <!-- Do not translate. -->
        <item>1</item>
        <!-- Do not translate. -->
+1 −1
Original line number Diff line number Diff line
@@ -355,7 +355,7 @@ public class AllInOneTetherSettings extends RestrictedDashboardFragment
    @Override
    public void onTetherConfigUpdated(AbstractPreferenceController controller) {
        final SoftApConfiguration config = buildNewConfig();
        mPasswordPreferenceController.updateVisibility(config.getSecurityType());
        mPasswordPreferenceController.setSecurityType(config.getSecurityType());
        mWifiManager.setSoftApConfiguration(config);

        if (mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_ENABLED) {
+3 −3
Original line number Diff line number Diff line
@@ -56,12 +56,12 @@ public class WifiUtils {
    }

    /**
     * Check if the WPA2-PSK hotspot password is valid.
     * Check if the hotspot password is valid.
     */
    public static boolean isHotspotWpa2PasswordValid(String password) {
    public static boolean isHotspotPasswordValid(String password, int securityType) {
        final SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();
        try {
            configBuilder.setPassphrase(password, SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
            configBuilder.setPassphrase(password, securityType);
        } catch (IllegalArgumentException e) {
            return false;
        }
+10 −6
Original line number Diff line number Diff line
@@ -301,7 +301,11 @@ public class WifiDppUtils {

        final String ssid = removeFirstAndLastDoubleQuotes(softApConfiguration.getSsid());
        String security;
        if (softApConfiguration.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK) {
        final int securityType = softApConfiguration.getSecurityType();
        if (securityType == SoftApConfiguration.SECURITY_TYPE_WPA3_SAE) {
            security = WifiQrCode.SECURITY_SAE;
        } else if (securityType == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
                || securityType == SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION) {
            security = WifiQrCode.SECURITY_WPA_PSK;
        } else {
            security = WifiQrCode.SECURITY_NO_PASSWORD;
@@ -431,11 +435,11 @@ public class WifiDppUtils {

    private static boolean isSupportHotspotConfiguratorQrCodeGenerator(
            SoftApConfiguration softApConfiguration) {
        // QR code generator produces QR code with ZXing's Wi-Fi network config format,
        // it supports PSK and WEP and non security
        // KeyMgmt.NONE is for WEP or non security
        return softApConfiguration.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
                || softApConfiguration.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_OPEN;
        final int securityType = softApConfiguration.getSecurityType();
        return securityType == SoftApConfiguration.SECURITY_TYPE_WPA3_SAE
                || securityType == SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION
                || securityType == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
                || securityType == SoftApConfiguration.SECURITY_TYPE_OPEN;
    }

    private static boolean isSupportWifiDpp(Context context, int wifiEntrySecurity) {
+17 −6
Original line number Diff line number Diff line
@@ -37,12 +37,16 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;

import java.util.UUID;

/**
 * Controller for logic pertaining to the password of Wi-Fi tethering.
 */
public class WifiTetherPasswordPreferenceController extends WifiTetherBasePreferenceController
        implements ValidatedEditTextPreference.Validator {

    private static final String PREF_KEY = "wifi_tether_network_password";

    private String mPassword;
    private int mSecurityType;

    private final MetricsFeatureProvider mMetricsFeatureProvider;

@@ -68,13 +72,13 @@ public class WifiTetherPasswordPreferenceController extends WifiTetherBasePrefer
    @Override
    public void updateDisplay() {
        final SoftApConfiguration config = mWifiManager.getSoftApConfiguration();
        if (config == null
                || (config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
                && TextUtils.isEmpty(config.getPassphrase()))) {
        if (config.getSecurityType() != SoftApConfiguration.SECURITY_TYPE_OPEN
                && TextUtils.isEmpty(config.getPassphrase())) {
            mPassword = generateRandomPassword();
        } else {
            mPassword = config.getPassphrase();
        }
        mSecurityType = config.getSecurityType();
        ((ValidatedEditTextPreference) mPreference).setValidator(this);
        ((ValidatedEditTextPreference) mPreference).setIsPassword(true);
        ((ValidatedEditTextPreference) mPreference).setIsSummaryPassword(true);
@@ -105,20 +109,27 @@ public class WifiTetherPasswordPreferenceController extends WifiTetherBasePrefer
        // don't actually overwrite unless we get a new config in case it was accidentally toggled.
        if (securityType == SoftApConfiguration.SECURITY_TYPE_OPEN) {
            return "";
        } else if (!isTextValid(mPassword)) {
        } else if (!WifiUtils.isHotspotPasswordValid(mPassword, securityType)) {
            mPassword = generateRandomPassword();
            updatePasswordDisplay((EditTextPreference) mPreference);
        }
        return mPassword;
    }

    public void updateVisibility(int securityType) {
    /**
     * This method set the security type of user selection. Then the controller will based on the
     * security type changed to update the password changed on the preference.
     *
     * @param securityType The security type of SoftApConfiguration.
     */
    public void setSecurityType(int securityType) {
        mSecurityType = securityType;
        mPreference.setVisible(securityType != SoftApConfiguration.SECURITY_TYPE_OPEN);
    }

    @Override
    public boolean isTextValid(String value) {
        return WifiUtils.isHotspotWpa2PasswordValid(value);
        return WifiUtils.isHotspotPasswordValid(value, mSecurityType);
    }

    private static String generateRandomPassword() {
Loading