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

Commit 6cb2744f authored by Weng Su's avatar Weng Su Committed by Automerger Merge Worker
Browse files

Merge "Fix the bug of losing Wi-Fi certificate when editing" into rvc-qpr-dev am: 3b4744a6

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/13053207

Change-Id: Ie039198adf4f4693df68f7d37fc4579ea209a1ce
parents 8535314e 3b4744a6
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -164,6 +164,7 @@ public class WifiConfigController2 implements TextWatcher,
    private ScrollView mDialogContainer;
    private Spinner mSecuritySpinner;
    @VisibleForTesting Spinner mEapMethodSpinner;
    private int mLastShownEapMethod;
    @VisibleForTesting Spinner mEapSimSpinner;    // For EAP-SIM, EAP-AKA and EAP-AKA-PRIME.
    private Spinner mEapCaCertSpinner;
    private Spinner mEapOcspSpinner;
@@ -1057,6 +1058,7 @@ public class WifiConfigController2 implements TextWatcher,
            final int eapMethod = enterpriseConfig.getEapMethod();
            final int phase2Method = enterpriseConfig.getPhase2Method();
            mEapMethodSpinner.setSelection(eapMethod);
            mLastShownEapMethod = eapMethod;
            showEapFieldsByMethod(eapMethod);
            switch (eapMethod) {
                case Eap.PEAP:
@@ -1627,7 +1629,11 @@ public class WifiConfigController2 implements TextWatcher,
                mSsidScanButton.setVisibility(View.GONE);
            }
        } else if (parent == mEapMethodSpinner) {
            final int selectedItemPosition = mEapMethodSpinner.getSelectedItemPosition();
            if (mLastShownEapMethod != selectedItemPosition) {
                mLastShownEapMethod = selectedItemPosition;
                showSecurityFields(/* refreshEapMethods */ false, /* refreshCertificates */ true);
            }
        } else if (parent == mEapCaCertSpinner) {
            showSecurityFields(/* refreshEapMethods */ false, /* refreshCertificates */ false);
        } else if (parent == mPhase2Spinner
+86 −0
Original line number Diff line number Diff line
@@ -18,7 +18,9 @@ package com.android.settings.wifi;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
@@ -32,6 +34,7 @@ import android.net.wifi.WifiEnterpriseConfig.Eap;
import android.net.wifi.WifiEnterpriseConfig.Phase2;
import android.net.wifi.WifiManager;
import android.os.ServiceSpecificException;
import android.security.Credentials;
import android.security.KeyStore;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -78,6 +81,10 @@ public class WifiConfigController2Test {
    private KeyStore mKeyStore;
    private View mView;
    private Spinner mHiddenSettingsSpinner;
    private Spinner mEapCaCertSpinner;
    private Spinner mEapUserCertSpinner;
    private String mUseSystemCertsString;
    private String mDoNotProvideEapUserCertString;
    private ShadowSubscriptionManager mShadowSubscriptionManager;

    public WifiConfigController2 mController;
@@ -98,6 +105,9 @@ public class WifiConfigController2Test {
    private static final String NUMBER_AND_CHARACTER_KEY = "123456abcd";
    private static final String PARTIAL_NUMBER_AND_CHARACTER_KEY = "123456abc?";
    private static final int DHCP = 0;
    // Saved certificates
    private static final String SAVED_CA_CERT = "saved CA cert";
    private static final String SAVED_USER_CERT = "saved user cert";

    @Before
    public void setUp() {
@@ -108,6 +118,11 @@ public class WifiConfigController2Test {
        mView = LayoutInflater.from(mContext).inflate(R.layout.wifi_dialog, null);
        final Spinner ipSettingsSpinner = mView.findViewById(R.id.ip_settings);
        mHiddenSettingsSpinner = mView.findViewById(R.id.hidden_settings);
        mEapCaCertSpinner = mView.findViewById(R.id.ca_cert);
        mEapUserCertSpinner = mView.findViewById(R.id.user_cert);
        mUseSystemCertsString = mContext.getString(R.string.wifi_use_system_certs);
        mDoNotProvideEapUserCertString =
                mContext.getString(R.string.wifi_do_not_provide_eap_user_cert);
        ipSettingsSpinner.setSelection(DHCP);
        mShadowSubscriptionManager = shadowOf(mContext.getSystemService(SubscriptionManager.class));

@@ -835,4 +850,75 @@ public class WifiConfigController2Test {
        final WifiConfiguration wifiConfiguration = mController.getConfig();
        assertThat(wifiConfiguration.carrierId).isEqualTo(carrierId);
    }

    @Test
    public void loadCaCertificateValue_shouldPersistentAsDefault() {
        setUpModifyingSavedCertificateConfigController(null, null);

        assertThat(mEapCaCertSpinner.getSelectedItem()).isEqualTo(mUseSystemCertsString);
    }

    @Test
    public void loadSavedCaCertificateValue_shouldBeCorrectValue() {
        setUpModifyingSavedCertificateConfigController(SAVED_CA_CERT, null);

        assertThat(mEapCaCertSpinner.getSelectedItem()).isEqualTo(SAVED_CA_CERT);
    }

    @Test
    public void loadUserCertificateValue_shouldPersistentAsDefault() {
        setUpModifyingSavedCertificateConfigController(null, null);

        assertThat(mEapUserCertSpinner.getSelectedItem()).isEqualTo(mDoNotProvideEapUserCertString);
    }

    @Test
    public void loadSavedUserCertificateValue_shouldBeCorrectValue() {
        setUpModifyingSavedCertificateConfigController(null, SAVED_USER_CERT);

        assertThat(mEapUserCertSpinner.getSelectedItem()).isEqualTo(SAVED_USER_CERT);
    }

    private void setUpModifyingSavedCertificateConfigController(String savedCaCertificate,
            String savedUserCertificate) {
        final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
        final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class);
        mockWifiConfig.enterpriseConfig = mockWifiEnterpriseConfig;
        when(mWifiEntry.isSaved()).thenReturn(true);
        when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
        when(mWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfig);
        when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
        when(mockWifiEnterpriseConfig.getEapMethod()).thenReturn(Eap.TLS);
        if (savedCaCertificate != null) {
            String[] savedCaCertificates = new String[]{savedCaCertificate};
            when(mockWifiEnterpriseConfig.getCaCertificateAliases())
                    .thenReturn(savedCaCertificates);
            when(mKeyStore.list(eq(Credentials.CA_CERTIFICATE), anyInt()))
                    .thenReturn(savedCaCertificates);
        }
        if (savedUserCertificate != null) {
            String[] savedUserCertificates = new String[]{savedUserCertificate};
            when(mockWifiEnterpriseConfig.getClientCertificateAlias())
                    .thenReturn(savedUserCertificate);
            when(mKeyStore.list(eq(Credentials.USER_PRIVATE_KEY), anyInt()))
                    .thenReturn(savedUserCertificates);
        }

        mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
                WifiConfigUiBase2.MODE_MODIFY);

        //  Because Robolectric has a different behavior from normal flow.
        //
        //  Normal flow:
        //    showSecurityFields start -> mEapMethodSpinner.setSelection
        //        -> showSecurityFields end -> mController.onItemSelected
        //
        //  Robolectric flow:
        //    showSecurityFields start -> mEapMethodSpinner.setSelection
        //        -> mController.onItemSelected -> showSecurityFields end
        //
        //  We need to add a redundant mEapMethodSpinner.setSelection here to verify whether the
        //  certificates are covered by mController.onItemSelected after showSecurityFields end.
        mController.mEapMethodSpinner.setSelection(Eap.TLS);
    }
}