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

Commit 040e2a86 authored by Weng Su's avatar Weng Su
Browse files

Fixed accessibility issues in Wi-Fi password view in Settings

- Keep the Save button enabled at all times

- Show "*required" or "The password is invalid" to remind the user
  - Show "Password (optional)" to indicate that it can remain unchanged, when modifying Wi-Fi configuration

Bug: 386897596
Bug: 402694144
Flag: EXEMPT bugfix
Test: Manual testing
  atest SettingsUnitTests:AddNetworkFragmentTest
  atest WifiConfigControllerTest \
        WifiConfigController2Test \
        WifiDialogActivityTest
Change-Id: I09b7684674ff376139565fcc196cde8d8d20a864
parent cec2696f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -2448,6 +2448,8 @@
    <string name="wifi_eap_anonymous">Anonymous identity</string>
    <!-- Label for the password of the secured network -->
    <string name="wifi_password">Password*</string>
    <!-- Label for the optional password of the secured network -->
    <string name="wifi_password_optional">Password (optional)</string>
    <!-- Label for the password of the secured network -->
    <string name="wifi_password_invalid">The password is invalid</string>
    <!-- Label for the check box to show password -->
+1 −1
Original line number Diff line number Diff line
@@ -206,7 +206,7 @@ public class AddNetworkFragment extends InstrumentedFragment implements WifiConf

    @VisibleForTesting
    void handleSubmitAction() {
        if (!mUIController.canFinish()) {
        if (!mUIController.getValidator().validate()) {
            return;
        }
        successfullyFinish(mUIController.getConfig());
+3 −0
Original line number Diff line number Diff line
@@ -203,6 +203,9 @@ public class ConfigureWifiEntryFragment extends InstrumentedFragment implements

    @VisibleForTesting
    void handleSubmitAction() {
        if (!mUiController.getValidator().validate()) {
            return;
        }
        final Intent intent = new Intent();
        final Activity activity = getActivity();
        intent.putExtra(NETWORK_CONFIG_KEY, mUiController.getConfig());
+1 −1
Original line number Diff line number Diff line
@@ -296,7 +296,7 @@ public class WifiConfigController implements TextWatcher,

        mSsidInput = new TextInputGroup(mView, R.id.ssid_layout, R.id.ssid,
                R.string.wifi_ssid_hint);
        mPasswordInput = new WifiPasswordInput(mView);
        mPasswordInput = new WifiPasswordInput(mView, mAccessPointSecurity);
        mValidator.addTextInput(mSsidInput);
        mValidator.addTextInput(mPasswordInput);

+21 −47
Original line number Diff line number Diff line
@@ -78,6 +78,8 @@ import com.android.settings.wifi.details2.WifiPrivacyPreferenceController;
import com.android.settings.wifi.details2.WifiPrivacyPreferenceController2;
import com.android.settings.wifi.dpp.WifiDppUtils;
import com.android.settings.wifi.utils.TextInputGroup;
import com.android.settings.wifi.utils.TextInputValidator;
import com.android.settings.wifi.utils.WifiPasswordInput;
import com.android.settingslib.Utils;
import com.android.settingslib.utils.ThreadUtils;
import com.android.wifi.flags.Flags;
@@ -229,7 +231,10 @@ public class WifiConfigController2 implements TextWatcher,
    private final boolean mHideMeteredAndPrivacy;
    private final WifiManager mWifiManager;
    private final AndroidKeystoreAliasLoader mAndroidKeystoreAliasLoader;

    private TextInputValidator mValidator = new TextInputValidator();
    private TextInputGroup mSsidInputGroup;
    private WifiPasswordInput mPasswordInput;

    private final Context mContext;

@@ -301,6 +306,10 @@ public class WifiConfigController2 implements TextWatcher,

        mSsidInputGroup = new TextInputGroup(mView, R.id.ssid_layout, R.id.ssid,
                R.string.wifi_ssid_hint);
        mPasswordInput = new WifiPasswordInput(mView, mWifiEntrySecurity);
        mValidator.addTextInput(mSsidInputGroup);
        mValidator.addTextInput(mPasswordInput);

        mSsidScanButton = (ImageButton) mView.findViewById(R.id.ssid_scanner_button);
        mIpSettingsSpinner = (Spinner) mView.findViewById(R.id.ip_settings);
        mIpSettingsSpinner.setOnItemSelectedListener(this);
@@ -519,45 +528,8 @@ public class WifiConfigController2 implements TextWatcher,
        submit.setEnabled(isSubmittable());
    }

    boolean isValidPsk(String password) {
        if (password.length() == 64 && password.matches("[0-9A-Fa-f]{64}")) {
            return true;
        } else if (password.length() >= 8 && password.length() <= 63) {
            return true;
        }
        return false;
    }

    boolean isValidSaePassword(String password) {
        if (password.length() >= 1 && password.length() <= 128) {
            return true;
        }
        return false;
    }

    boolean isSubmittable() {
        boolean enabled = false;
        boolean passwordInvalid = false;
        if (mPasswordView != null
                && ((mWifiEntrySecurity == WifiEntry.SECURITY_WEP
                        && mPasswordView.length() == 0)
                    || (mWifiEntrySecurity == WifiEntry.SECURITY_PSK
                           && !isValidPsk(mPasswordView.getText().toString()))
                    || (mWifiEntrySecurity == WifiEntry.SECURITY_SAE
                        && !isValidSaePassword(mPasswordView.getText().toString())))) {
            passwordInvalid = true;
        }
        if ((mWifiEntry == null || !mWifiEntry.isSaved()) && passwordInvalid) {
            // If WifiEntry is not saved, apply passwordInvalid check
            enabled = false;
        } else if (mWifiEntry != null && mWifiEntry.isSaved() && passwordInvalid
                && mPasswordView.length() > 0) {
            // If WifiEntry is saved (modifying network) and password is changed, apply
            // Invalid password check
            enabled = false;
        } else {
            enabled = ipAndProxyFieldsAreValid();
        }
        boolean enabled = ipAndProxyFieldsAreValid();
        if ((mWifiEntrySecurity == WifiEntry.SECURITY_EAP
                || mWifiEntrySecurity == WifiEntry.SECURITY_EAP_WPA3_ENTERPRISE
                || mWifiEntrySecurity == WifiEntry.SECURITY_EAP_SUITE_B)
@@ -589,14 +561,6 @@ public class WifiConfigController2 implements TextWatcher,
        return enabled;
    }

    boolean canFinish() {
        if (!mSsidInputGroup.validate()) {
            Log.w(TAG, "Can't finish because SSID is invalid!");
            return false;
        }
        return true;
    }

    void showWarningMessagesIfAppropriate() {
        mView.findViewById(R.id.no_user_cert_warning).setVisibility(View.GONE);
        mView.findViewById(R.id.no_domain_warning).setVisibility(View.GONE);
@@ -1050,7 +1014,9 @@ public class WifiConfigController2 implements TextWatcher,
                .setOnCheckedChangeListener(this);

            if (mWifiEntry != null && mWifiEntry.isSaved()) {
                mPasswordView.setHint(R.string.wifi_unchanged);
                mPasswordInput.setCanBeEmpty(true);
                mPasswordInput.getLayout().setHint(R.string.wifi_password_optional);
                mPasswordInput.setHelperText(mContext.getString(R.string.wifi_unchanged));
            }
        }

@@ -1763,6 +1729,7 @@ public class WifiConfigController2 implements TextWatcher,
            // Convert menu position to actual Wi-Fi security type
            mWifiEntrySecurity = mSecurityInPosition[position];
            showSecurityFields(/* refreshEapMethods */ true, /* refreshCertificates */ true);
            mPasswordInput.setSecurity(mWifiEntrySecurity);

            if (WifiDppUtils.isSupportEnrolleeQrCodeScanner(mContext, mWifiEntrySecurity)) {
                mSsidScanButton.setVisibility(View.VISIBLE);
@@ -2013,4 +1980,11 @@ public class WifiConfigController2 implements TextWatcher,
        spinner.setAdapter(getSpinnerAdapter(stringArray));
        return spinner;
    }

    /**
     * Provides a validator to verify that the Wi-Fi configuration is ready.
     */
    public TextInputValidator getValidator() {
        return mValidator;
    }
}
Loading