From dc4ad092914be5a521bb26c036e05bab879165bb Mon Sep 17 00:00:00 2001 From: Weng Su Date: Tue, 9 Aug 2022 00:59:52 +0800 Subject: [PATCH] Show default data SIM in Wi-Fi details when dual SIMs have the same carrier ID - Because the wifiConfiguration is only save the carrier ID 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 - Show default data SIM in Wi-Fi details settings, when dual SIMs have the same carrier ID Bug: 233765468 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=WifiDetailPreferenceController2Test Change-Id: I350fe637f506134770ccf316e47c0e225661bb6a Merged-In: I350fe637f506134770ccf316e47c0e225661bb6a --- .../WifiDetailPreferenceController2.java | 45 +++++++----- .../WifiDetailPreferenceController2Test.java | 72 +++++++++++++++++++ 2 files changed, 99 insertions(+), 18 deletions(-) diff --git a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java index ba7628e8b97..f7fc07a90b0 100644 --- a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java +++ b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java @@ -19,6 +19,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL; import static android.net.NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY; import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; +import static android.telephony.TelephonyManager.UNKNOWN_CARRIER_ID; import android.app.Activity; import android.app.AlertDialog; @@ -49,7 +50,6 @@ import android.os.Handler; import android.provider.Telephony.CarrierId; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; -import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.FeatureFlagUtils; import android.util.Log; @@ -711,27 +711,17 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle // Checks if the SIM subscription is active. final List activeSubscriptionInfos = mContext .getSystemService(SubscriptionManager.class).getActiveSubscriptionInfoList(); - final int defaultDataSubscriptionId = SubscriptionManager.getDefaultDataSubscriptionId(); if (activeSubscriptionInfos != null) { - for (SubscriptionInfo subscriptionInfo : activeSubscriptionInfos) { - final CharSequence displayName = SubscriptionUtil.getUniqueSubscriptionDisplayName( - subscriptionInfo, mContext); - if (config.carrierId == subscriptionInfo.getCarrierId()) { - mEapSimSubscriptionPref.setSummary(displayName); - return; - } - - // When it's UNKNOWN_CARRIER_ID, devices connects it with the SIM subscription of - // defaultDataSubscriptionId. - if (config.carrierId == TelephonyManager.UNKNOWN_CARRIER_ID - && defaultDataSubscriptionId == subscriptionInfo.getSubscriptionId()) { - mEapSimSubscriptionPref.setSummary(displayName); - return; - } + SubscriptionInfo info = fineSubscriptionInfo(config.carrierId, activeSubscriptionInfos, + SubscriptionManager.getDefaultDataSubscriptionId()); + if (info != null) { + mEapSimSubscriptionPref.setSummary( + SubscriptionUtil.getUniqueSubscriptionDisplayName(info, mContext)); + return; } } - if (config.carrierId == TelephonyManager.UNKNOWN_CARRIER_ID) { + if (config.carrierId == UNKNOWN_CARRIER_ID) { mEapSimSubscriptionPref.setSummary(R.string.wifi_no_related_sim_card); return; } @@ -750,6 +740,25 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle null /* orderBy */); } + @VisibleForTesting + SubscriptionInfo fineSubscriptionInfo(int carrierId, + List activeSubscriptionInfos, int defaultDataSubscriptionId) { + SubscriptionInfo firstMatchedInfo = null; + for (SubscriptionInfo info : activeSubscriptionInfos) { + // When it's UNKNOWN_CARRIER_ID or matched with configured CarrierId, + // devices connects it with the SIM subscription of defaultDataSubscriptionId. + if (defaultDataSubscriptionId == info.getSubscriptionId() + && (carrierId == info.getCarrierId() || carrierId == UNKNOWN_CARRIER_ID)) { + return info; + } + + if (firstMatchedInfo == null && carrierId == info.getCarrierId()) { + firstMatchedInfo = info; + } + } + return firstMatchedInfo; + } + private void refreshMacAddress() { final String macAddress = mWifiEntry.getMacAddress(); if (TextUtils.isEmpty(macAddress)) { diff --git a/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java index 08bcd2a2912..274ac16fbfc 100644 --- a/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java +++ b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java @@ -58,6 +58,7 @@ import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Handler; import android.provider.Settings; +import android.telephony.SubscriptionInfo; import android.telephony.TelephonyManager; import android.view.View; import android.view.View.OnClickListener; @@ -108,6 +109,7 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.util.Arrays; +import java.util.List; import java.util.stream.Collectors; // TODO(b/143326832): Should add test cases for connect button. @@ -1791,4 +1793,74 @@ public class WifiDetailPreferenceController2Test { return pref; } + + @Test + public void fineSubscriptionInfo_noMatchedCarrierId_returnNull() { + setUpSpyController(); + SubscriptionInfo sub1 = mockSubscriptionInfo(1, "sim1", 1111); + SubscriptionInfo sub2 = mockSubscriptionInfo(2, "sim2", 2222); + List activeSubInfos = Arrays.asList(sub1, sub2); + + SubscriptionInfo info = mController.fineSubscriptionInfo(3333, activeSubInfos, 1); + + assertThat(info).isNull(); + + info = mController.fineSubscriptionInfo(3333, activeSubInfos, 2); + + assertThat(info).isNull(); + } + + @Test + public void fineSubscriptionInfo_diffCarrierId_returnMatchedOne() { + setUpSpyController(); + SubscriptionInfo sub1 = mockSubscriptionInfo(1, "sim1", 1111); + SubscriptionInfo sub2 = mockSubscriptionInfo(2, "sim2", 2222); + List activeSubInfos = Arrays.asList(sub1, sub2); + + SubscriptionInfo info = mController.fineSubscriptionInfo(1111, activeSubInfos, 1); + + assertThat(info).isNotNull(); + assertThat(info.getDisplayName().toString()).isEqualTo("sim1"); + + info = mController.fineSubscriptionInfo(1111, activeSubInfos, 2); + + assertThat(info).isNotNull(); + assertThat(info.getDisplayName().toString()).isEqualTo("sim1"); + + info = mController.fineSubscriptionInfo(2222, activeSubInfos, 1); + + assertThat(info).isNotNull(); + assertThat(info.getDisplayName().toString()).isEqualTo("sim2"); + + info = mController.fineSubscriptionInfo(2222, activeSubInfos, 2); + + assertThat(info).isNotNull(); + assertThat(info.getDisplayName().toString()).isEqualTo("sim2"); + } + + @Test + public void fineSubscriptionInfo_sameCarrierId_returnDefaultDataOne() { + setUpSpyController(); + SubscriptionInfo sub1 = mockSubscriptionInfo(1, "sim1", 1111); + SubscriptionInfo sub2 = mockSubscriptionInfo(2, "sim2", 1111); + List activeSubInfos = Arrays.asList(sub1, sub2); + + SubscriptionInfo info = mController.fineSubscriptionInfo(1111, activeSubInfos, 1); + + assertThat(info).isNotNull(); + assertThat(info.getDisplayName().toString()).isEqualTo("sim1"); + + info = mController.fineSubscriptionInfo(1111, activeSubInfos, 2); + + assertThat(info).isNotNull(); + assertThat(info.getDisplayName().toString()).isEqualTo("sim2"); + } + + private SubscriptionInfo mockSubscriptionInfo(int subId, String displayName, int carrierId) { + SubscriptionInfo info = mock(SubscriptionInfo.class); + when(info.getSubscriptionId()).thenReturn(subId); + when(info.getDisplayName()).thenReturn(displayName); + when(info.getCarrierId()).thenReturn(carrierId); + return info; + } }