From 028c8f3dbcfd4b2153903175958f71f8093a44d1 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Wed, 3 Aug 2022 02:29:08 +0800 Subject: [PATCH] Show one SIM only for EAP-SIM when dual SIMs have the same carrier ID - Because the wifiConfiguration save the carrier ID only for EAP-SIM authentication - If multiple SIMs have the same carrier ID, the Wi-Fi framework will use the default data SIM for EAP-SIM authentication - To avoid user confusion, show one SIM only when dual SIMs have the same carrier ID Bug: 233765468 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=WifiConfigController2Test Change-Id: I56f956d20053d314f082ba185d661d8e0a0ef3cb Merged-In: I56f956d20053d314f082ba185d661d8e0a0ef3cb --- .../settings/wifi/WifiConfigController2.java | 14 +++- .../wifi/WifiConfigController2Test.java | 65 ++++++++++++++++--- 2 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/wifi/WifiConfigController2.java b/src/com/android/settings/wifi/WifiConfigController2.java index 9e96be99690..e55ea16c15c 100644 --- a/src/com/android/settings/wifi/WifiConfigController2.java +++ b/src/com/android/settings/wifi/WifiConfigController2.java @@ -42,6 +42,7 @@ import android.text.InputType; import android.text.SpannableString; import android.text.TextUtils; import android.text.TextWatcher; +import android.util.ArrayMap; import android.util.Log; import android.view.KeyEvent; import android.view.View; @@ -1495,13 +1496,20 @@ public class WifiConfigController2 implements TextWatcher, } // Shows display name of each active subscription. - final ArrayList displayNames = new ArrayList<>(); + ArrayMap displayNames = new ArrayMap<>(); + int defaultDataSubscriptionId = SubscriptionManager.getDefaultDataSubscriptionId(); for (SubscriptionInfo activeSubInfo : mActiveSubscriptionInfos) { - displayNames.add( + // If multiple SIMs have the same carrier id, only the first or default data SIM is + // displayed. + if (displayNames.containsKey(activeSubInfo.getCarrierId()) + && defaultDataSubscriptionId != activeSubInfo.getSubscriptionId()) { + continue; + } + displayNames.put(activeSubInfo.getCarrierId(), SubscriptionUtil.getUniqueSubscriptionDisplayName(activeSubInfo, mContext)); } mEapSimSpinner.setAdapter( - getSpinnerAdapter(displayNames.toArray(new String[displayNames.size()]))); + getSpinnerAdapter(displayNames.values().toArray(new String[displayNames.size()]))); mEapSimSpinner.setSelection(0 /* position */); if (displayNames.size() == 1) { mEapSimSpinner.setEnabled(false); diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java index 5d568fea395..9139a285e14 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java @@ -16,6 +16,8 @@ package com.android.settings.wifi; +import static com.android.settings.wifi.WifiConfigController2.WIFI_EAP_METHOD_SIM; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; @@ -86,6 +88,8 @@ public class WifiConfigController2Test { private AndroidKeystoreAliasLoader mAndroidKeystoreAliasLoader; @Mock private WifiManager mWifiManager; + @Mock + Spinner mEapMethodSimSpinner; private View mView; private Spinner mHiddenSettingsSpinner; private Spinner mEapCaCertSpinner; @@ -141,6 +145,7 @@ public class WifiConfigController2Test { mContext.getString(R.string.wifi_do_not_provide_eap_user_cert); ipSettingsSpinner.setSelection(DHCP); mShadowSubscriptionManager = shadowOf(mContext.getSystemService(SubscriptionManager.class)); + when(mEapMethodSimSpinner.getSelectedItemPosition()).thenReturn(WIFI_EAP_METHOD_SIM); mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry, WifiConfigUiBase2.MODE_CONNECT); @@ -813,10 +818,7 @@ public class WifiConfigController2Test { when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP); mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry, WifiConfigUiBase2.MODE_CONNECT); - final Spinner eapMethodSpinner = mock(Spinner.class); - when(eapMethodSpinner.getSelectedItemPosition()).thenReturn( - WifiConfigController2.WIFI_EAP_METHOD_SIM); - mController.mEapMethodSpinner = eapMethodSpinner; + mController.mEapMethodSpinner = mEapMethodSimSpinner; mController.loadSims(); @@ -837,10 +839,7 @@ public class WifiConfigController2Test { mShadowSubscriptionManager.setActiveSubscriptionInfoList(Arrays.asList(subscriptionInfo)); mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry, WifiConfigUiBase2.MODE_CONNECT); - final Spinner eapMethodSpinner = mock(Spinner.class); - when(eapMethodSpinner.getSelectedItemPosition()).thenReturn( - WifiConfigController2.WIFI_EAP_METHOD_SIM); - mController.mEapMethodSpinner = eapMethodSpinner; + mController.mEapMethodSpinner = mEapMethodSimSpinner; mController.loadSims(); @@ -848,6 +847,48 @@ public class WifiConfigController2Test { assertThat(wifiConfiguration.carrierId).isEqualTo(carrierId); } + @Test + public void loadSims_twoSimsWithDifferentCarrierId_showTwoSims() { + SubscriptionInfo sub1 = createMockSubscription(1, "sub1", 8888); + SubscriptionInfo sub2 = createMockSubscription(2, "sub2", 9999); + SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2)); + mShadowSubscriptionManager.setActiveSubscriptionInfoList(Arrays.asList(sub1, sub2)); + when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP); + mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry, + WifiConfigUiBase2.MODE_CONNECT); + mController.mEapMethodSpinner = mEapMethodSimSpinner; + ShadowSubscriptionManager.setDefaultDataSubscriptionId(1); + + mController.loadSims(); + + assertThat(mController.mEapSimSpinner.getAdapter().getCount()).isEqualTo(2); + } + + @Test + public void loadSims_twoSimsWithSameCarrierId_showOneDefaultDataSim() { + SubscriptionInfo sub1 = createMockSubscription(1, "sub1", 9999); + SubscriptionInfo sub2 = createMockSubscription(2, "sub2", 9999); + SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2)); + mShadowSubscriptionManager.setActiveSubscriptionInfoList(Arrays.asList(sub1, sub2)); + when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP); + mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry, + WifiConfigUiBase2.MODE_CONNECT); + mController.mEapMethodSpinner = mEapMethodSimSpinner; + ShadowSubscriptionManager.setDefaultDataSubscriptionId(1); + + mController.loadSims(); + + assertThat(mController.mEapSimSpinner.getAdapter().getCount()).isEqualTo(1); + assertThat(mController.mEapSimSpinner.getSelectedItem().toString()).isEqualTo("sub1"); + + ShadowSubscriptionManager.setDefaultDataSubscriptionId(2); + + mController.loadSims(); + + assertThat(mController.mEapSimSpinner.getAdapter().getCount()).isEqualTo(1); + assertThat(mController.mEapSimSpinner.getSelectedItem().toString()).isEqualTo("sub2"); + } + @Test public void loadCaCertificateValue_shouldPersistentAsDefault() { setUpModifyingSavedCertificateConfigController(null, null); @@ -940,4 +981,12 @@ public class WifiConfigController2Test { // certificates are covered by mController.onItemSelected after showSecurityFields end. mController.mEapMethodSpinner.setSelection(Eap.TLS); } + + private SubscriptionInfo createMockSubscription(int subId, String displayName, int carrierId) { + SubscriptionInfo sub = mock(SubscriptionInfo.class); + when(sub.getSubscriptionId()).thenReturn(subId); + when(sub.getDisplayName()).thenReturn(displayName); + when(sub.getCarrierId()).thenReturn(carrierId); + return sub; + } }