diff --git a/src/com/android/settings/network/MobileNetworkListController.java b/src/com/android/settings/network/MobileNetworkListController.java index a2e4116fd8b..d0e14ce2168 100644 --- a/src/com/android/settings/network/MobileNetworkListController.java +++ b/src/com/android/settings/network/MobileNetworkListController.java @@ -98,7 +98,7 @@ public class MobileNetworkListController extends AbstractPreferenceController im mPreferences = new ArrayMap<>(); final List subscriptions = SubscriptionUtil.getAvailableSubscriptions( - mSubscriptionManager); + mContext); for (SubscriptionInfo info : subscriptions) { final int subId = info.getSubscriptionId(); Preference pref = existingPreferences.remove(subId); diff --git a/src/com/android/settings/network/MobileNetworkSummaryController.java b/src/com/android/settings/network/MobileNetworkSummaryController.java index ae115ebb727..9498c4e61e0 100644 --- a/src/com/android/settings/network/MobileNetworkSummaryController.java +++ b/src/com/android/settings/network/MobileNetworkSummaryController.java @@ -22,6 +22,7 @@ import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; import android.content.Context; import android.content.Intent; import android.os.UserManager; +import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.euicc.EuiccManager; @@ -99,7 +100,7 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController @Override public CharSequence getSummary() { final List subs = SubscriptionUtil.getAvailableSubscriptions( - mSubscriptionManager); + mContext); if (subs.isEmpty()) { if (MobileNetworkUtils.showEuiccSettings(mContext)) { return mContext.getResources().getString( @@ -132,7 +133,7 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController mPreference.setEnabled(!mChangeListener.isAirplaneModeOn()); final List subs = SubscriptionUtil.getAvailableSubscriptions( - mSubscriptionManager); + mContext); if (subs.isEmpty()) { if (MobileNetworkUtils.showEuiccSettings(mContext)) { @@ -154,6 +155,7 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController if (subs.size() == 1) { mPreference.setOnPreferenceClickListener((Preference pref) -> { final Intent intent = new Intent(mContext, MobileNetworkActivity.class); + intent.putExtra(Settings.EXTRA_SUB_ID, subs.get(0).getSubscriptionId()); mContext.startActivity(intent); return true; }); diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java index 5f1becaf54d..86655d4ff38 100644 --- a/src/com/android/settings/network/SubscriptionUtil.java +++ b/src/com/android/settings/network/SubscriptionUtil.java @@ -16,8 +16,15 @@ package com.android.settings.network; +import static android.telephony.UiccSlotInfo.CARD_STATE_INFO_PRESENT; + +import static com.android.internal.util.CollectionUtils.emptyIfNull; + +import android.content.Context; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.telephony.UiccSlotInfo; import android.text.TextUtils; import androidx.annotation.VisibleForTesting; @@ -27,6 +34,7 @@ import java.util.Iterator; import java.util.List; public class SubscriptionUtil { + private static final String TAG = "SubscriptionUtil"; private static List sAvailableResultsForTesting; private static List sActiveResultsForTesting; @@ -44,21 +52,56 @@ public class SubscriptionUtil { if (sActiveResultsForTesting != null) { return sActiveResultsForTesting; } - List subscriptions = manager.getActiveSubscriptionInfoList(true); + final List subscriptions = manager.getActiveSubscriptionInfoList(true); if (subscriptions == null) { return new ArrayList<>(); } return subscriptions; } - public static List getAvailableSubscriptions(SubscriptionManager manager) { + private static boolean isInactiveInsertedPSim(UiccSlotInfo slotInfo) { + return !slotInfo.getIsEuicc() && !slotInfo.getIsActive() && + slotInfo.getCardStateInfo() == CARD_STATE_INFO_PRESENT; + } + + public static List getAvailableSubscriptions(Context context) { if (sAvailableResultsForTesting != null) { return sAvailableResultsForTesting; } - List subscriptions = manager.getSelectableSubscriptionInfoList(); - if (subscriptions == null) { - subscriptions = new ArrayList<>(); + final SubscriptionManager subMgr = context.getSystemService(SubscriptionManager.class); + final TelephonyManager telMgr = context.getSystemService(TelephonyManager.class); + + List subscriptions = + new ArrayList<>(emptyIfNull(subMgr.getSelectableSubscriptionInfoList())); + + // Look for inactive but present physical SIMs that are missing from the selectable list. + final List missing = new ArrayList<>(); + UiccSlotInfo[] slotsInfo = telMgr.getUiccSlotsInfo(); + for (int i = 0; slotsInfo != null && i < slotsInfo.length; i++) { + final UiccSlotInfo slotInfo = slotsInfo[i]; + if (isInactiveInsertedPSim(slotInfo)) { + final int index = slotInfo.getLogicalSlotIdx(); + final String cardId = slotInfo.getCardId(); + + final boolean found = subscriptions.stream().anyMatch(info -> + index == info.getSimSlotIndex() && cardId.equals(info.getCardString())); + if (!found) { + missing.add(slotInfo); + } + } } + if (!missing.isEmpty()) { + for (SubscriptionInfo info : subMgr.getAllSubscriptionInfoList()) { + for (UiccSlotInfo slotInfo : missing) { + if (info.getSimSlotIndex() == slotInfo.getLogicalSlotIdx() && + info.getCardString().equals(slotInfo.getCardId())) { + subscriptions.add(info); + break; + } + } + } + } + // With some carriers such as Google Fi which provide a sort of virtual service that spans // across multiple underlying networks, we end up with subscription entries for the // underlying networks that need to be hidden from the user in the UI. diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java index 47eb66be400..b8ed31f94b8 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java +++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java @@ -40,6 +40,7 @@ import com.android.settings.R; import com.android.settings.core.FeatureFlags; import com.android.settings.core.SettingsBaseActivity; import com.android.settings.development.featureflags.FeatureFlagPersistent; +import com.android.settings.network.SubscriptionUtil; import com.google.android.material.bottomnavigation.BottomNavigationView; @@ -165,7 +166,7 @@ public class MobileNetworkActivity extends SettingsBaseActivity { final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL); if (subId != SUB_ID_NULL) { for (SubscriptionInfo subscription : - mSubscriptionManager.getSelectableSubscriptionInfoList()) { + SubscriptionUtil.getAvailableSubscriptions(this)) { if (subscription.getSubscriptionId() == subId) { return subscription; } diff --git a/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java b/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java index fd296ecc86e..2037adce4b5 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java +++ b/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java @@ -94,8 +94,9 @@ public class MobileNetworkSwitchController extends BasePreferenceController impl return; } final List subs = SubscriptionUtil.getAvailableSubscriptions( - mSubscriptionManager); - if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID || subs.size() < 2) { + mContext); + if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID || + mSubscriptionManager.isSubscriptionEnabled(mSubId) && subs.size() < 2) { mSwitchBar.hide(); return; } diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java index b8ba63c752c..a6238505756 100644 --- a/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java @@ -34,6 +34,7 @@ import android.net.ConnectivityManager; import android.os.UserManager; import android.provider.Settings; import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.euicc.EuiccManager; import android.text.TextUtils; @@ -151,8 +152,11 @@ public class MobileNetworkSummaryControllerTest { mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference); final ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); verify(mContext).startActivity(intentCaptor.capture()); - assertThat(intentCaptor.getValue().getComponent().getClassName()).isEqualTo( + Intent intent = intentCaptor.getValue(); + assertThat(intent.getComponent().getClassName()).isEqualTo( MobileNetworkActivity.class.getName()); + assertThat(intent.getIntExtra(Settings.EXTRA_SUB_ID, + SubscriptionManager.INVALID_SUBSCRIPTION_ID)).isEqualTo(sub1.getSubscriptionId()); } @Test diff --git a/tests/robotests/src/com/android/settings/network/SubscriptionUtilTest.java b/tests/robotests/src/com/android/settings/network/SubscriptionUtilTest.java index c074466b789..28a390d5a98 100644 --- a/tests/robotests/src/com/android/settings/network/SubscriptionUtilTest.java +++ b/tests/robotests/src/com/android/settings/network/SubscriptionUtilTest.java @@ -16,14 +16,21 @@ package com.android.settings.network; +import static android.telephony.UiccSlotInfo.CARD_STATE_INFO_ABSENT; +import static android.telephony.UiccSlotInfo.CARD_STATE_INFO_PRESENT; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import android.content.Context; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.telephony.UiccSlotInfo; import org.junit.Before; import org.junit.Test; @@ -39,17 +46,25 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) public class SubscriptionUtilTest { @Mock - private SubscriptionManager mManager; + private Context mContext; + @Mock + private SubscriptionManager mSubMgr; + @Mock + private TelephonyManager mTelMgr; + @Before public void setUp() { MockitoAnnotations.initMocks(this); + doReturn(mSubMgr).when(mContext).getSystemService(SubscriptionManager.class); + doReturn(mTelMgr).when(mContext).getSystemService(TelephonyManager.class); + when(mTelMgr.getUiccSlotsInfo()).thenReturn(null); } @Test public void getAvailableSubscriptions_nullInfoFromSubscriptionManager_nonNullResult() { - when(mManager.getSelectableSubscriptionInfoList()).thenReturn(null); - final List subs = SubscriptionUtil.getAvailableSubscriptions(mManager); + when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(null); + final List subs = SubscriptionUtil.getAvailableSubscriptions(mContext); assertThat(subs).isNotNull(); assertThat(subs).isEmpty(); } @@ -58,8 +73,8 @@ public class SubscriptionUtilTest { public void getAvailableSubscriptions_oneSubscription_oneResult() { final SubscriptionInfo info = mock(SubscriptionInfo.class); when(info.getMncString()).thenReturn("fake1234"); - when(mManager.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info)); - final List subs = SubscriptionUtil.getAvailableSubscriptions(mManager); + when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info)); + final List subs = SubscriptionUtil.getAvailableSubscriptions(mContext); assertThat(subs).isNotNull(); assertThat(subs).hasSize(1); } @@ -70,8 +85,8 @@ public class SubscriptionUtilTest { final SubscriptionInfo info2 = mock(SubscriptionInfo.class); when(info1.getMncString()).thenReturn("fake1234"); when(info2.getMncString()).thenReturn("fake5678"); - when(mManager.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info1, info2)); - final List subs = SubscriptionUtil.getAvailableSubscriptions(mManager); + when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info1, info2)); + final List subs = SubscriptionUtil.getAvailableSubscriptions(mContext); assertThat(subs).isNotNull(); assertThat(subs).hasSize(2); } @@ -83,9 +98,9 @@ public class SubscriptionUtilTest { final SubscriptionInfo info3 = mock(SubscriptionInfo.class); when(info1.getSubscriptionId()).thenReturn(1); when(info1.getMncString()).thenReturn("fake1234"); - when(mManager.getSelectableSubscriptionInfoList()).thenReturn( + when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn( new ArrayList<>(Arrays.asList(info1, info2, info3))); - final List subs = SubscriptionUtil.getAvailableSubscriptions(mManager); + final List subs = SubscriptionUtil.getAvailableSubscriptions(mContext); assertThat(subs).isNotNull(); assertThat(subs).hasSize(1); assertThat(subs.get(0).getSubscriptionId()).isEqualTo(1); @@ -101,19 +116,96 @@ public class SubscriptionUtilTest { when(info1.getMncString()).thenReturn("fake1234"); when(info4.getSubscriptionId()).thenReturn(4); when(info4.getMncString()).thenReturn("fake5678"); - when(mManager.getSelectableSubscriptionInfoList()).thenReturn(new ArrayList<>( + when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(new ArrayList<>( Arrays.asList(info1, info2, info3, info4))); - final List subs = SubscriptionUtil.getAvailableSubscriptions(mManager); + final List subs = SubscriptionUtil.getAvailableSubscriptions(mContext); assertThat(subs).isNotNull(); assertThat(subs).hasSize(2); assertThat(subs.get(0).getSubscriptionId()).isEqualTo(1); assertThat(subs.get(1).getSubscriptionId()).isEqualTo(4); } + @Test + public void getAvailableSubscriptions_oneSelectableOneDisabledPSim_twoResults() { + final SubscriptionInfo info1 = mock(SubscriptionInfo.class); + final SubscriptionInfo info2 = mock(SubscriptionInfo.class); + + when(info1.getSubscriptionId()).thenReturn(111); + when(info1.getMncString()).thenReturn("fake111"); + when(info1.getSimSlotIndex()).thenReturn(-1); + when(info1.getCardString()).thenReturn("info1_cardid"); + + when(info2.getSubscriptionId()).thenReturn(222); + when(info2.getMncString()).thenReturn("fake222"); + when(info2.getSimSlotIndex()).thenReturn(0); + when(info2.getCardString()).thenReturn("info2_cardid"); + + when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info1)); + when(mSubMgr.getAllSubscriptionInfoList()).thenReturn(Arrays.asList(info1, info2)); + + final UiccSlotInfo info2slot = mock(UiccSlotInfo.class); + when(info2slot.getCardStateInfo()).thenReturn(CARD_STATE_INFO_PRESENT); + when(info2slot.getLogicalSlotIdx()).thenReturn(0); + when(info2slot.getCardId()).thenReturn("info2_cardid"); + + final UiccSlotInfo[] slotInfos = {info2slot}; + when(mTelMgr.getUiccSlotsInfo()).thenReturn(slotInfos); + + final List subs = SubscriptionUtil.getAvailableSubscriptions(mContext); + assertThat(subs).hasSize(2); + assertThat(subs.get(0).getSubscriptionId()).isEqualTo(111); + assertThat(subs.get(1).getSubscriptionId()).isEqualTo(222); + } + + + @Test + public void getAvailableSubscriptions_oneSelectableTwoDisabledPSimsOneAbsent_twoResults() { + final SubscriptionInfo info1 = mock(SubscriptionInfo.class); + final SubscriptionInfo info2 = mock(SubscriptionInfo.class); + final SubscriptionInfo info3 = mock(SubscriptionInfo.class); + + when(info1.getSubscriptionId()).thenReturn(111); + when(info1.getMncString()).thenReturn("fake111"); + when(info1.getSimSlotIndex()).thenReturn(-1); + when(info1.getCardString()).thenReturn("info1_cardid"); + + when(info2.getSubscriptionId()).thenReturn(222); + when(info2.getMncString()).thenReturn("fake222"); + when(info2.getSimSlotIndex()).thenReturn(-1); + when(info2.getCardString()).thenReturn("info2_cardid"); + + when(info3.getSubscriptionId()).thenReturn(333); + when(info3.getMncString()).thenReturn("fake333"); + when(info3.getSimSlotIndex()).thenReturn(0); + when(info3.getCardString()).thenReturn("info3_cardid"); + + when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info1)); + when(mSubMgr.getAllSubscriptionInfoList()).thenReturn(Arrays.asList(info1, info2, info3)); + + final UiccSlotInfo info2slot = mock(UiccSlotInfo.class); + final UiccSlotInfo info3slot = mock(UiccSlotInfo.class); + + when(info2slot.getLogicalSlotIdx()).thenReturn(-1); + when(info2slot.getCardStateInfo()).thenReturn(CARD_STATE_INFO_ABSENT); + when(info2slot.getCardId()).thenReturn("info2_cardid"); + + when(info3slot.getLogicalSlotIdx()).thenReturn(0); + when(info3slot.getCardStateInfo()).thenReturn(CARD_STATE_INFO_PRESENT); + when(info3slot.getCardId()).thenReturn("info3_cardid"); + + final UiccSlotInfo[] slotInfos = {info2slot, info3slot}; + when(mTelMgr.getUiccSlotsInfo()).thenReturn(slotInfos); + + final List subs = SubscriptionUtil.getAvailableSubscriptions(mContext); + assertThat(subs).hasSize(2); + assertThat(subs.get(0).getSubscriptionId()).isEqualTo(111); + assertThat(subs.get(1).getSubscriptionId()).isEqualTo(333); + } + @Test public void getActiveSubscriptions_nullInfoFromSubscriptionManager_nonNullResult() { - when(mManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(null); - final List subs = SubscriptionUtil.getActiveSubscriptions(mManager); + when(mSubMgr.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(null); + final List subs = SubscriptionUtil.getActiveSubscriptions(mSubMgr); assertThat(subs).isNotNull(); assertThat(subs).isEmpty(); } @@ -121,8 +213,8 @@ public class SubscriptionUtilTest { @Test public void getActiveSubscriptions_oneSubscription_oneResult() { final SubscriptionInfo info = mock(SubscriptionInfo.class); - when(mManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(Arrays.asList(info)); - final List subs = SubscriptionUtil.getActiveSubscriptions(mManager); + when(mSubMgr.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(Arrays.asList(info)); + final List subs = SubscriptionUtil.getActiveSubscriptions(mSubMgr); assertThat(subs).isNotNull(); assertThat(subs).hasSize(1); } @@ -131,9 +223,9 @@ public class SubscriptionUtilTest { public void getActiveSubscriptions_twoSubscriptions_twoResults() { final SubscriptionInfo info1 = mock(SubscriptionInfo.class); final SubscriptionInfo info2 = mock(SubscriptionInfo.class); - when(mManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn( + when(mSubMgr.getActiveSubscriptionInfoList(anyBoolean())).thenReturn( Arrays.asList(info1, info2)); - final List subs = SubscriptionUtil.getActiveSubscriptions(mManager); + final List subs = SubscriptionUtil.getActiveSubscriptions(mSubMgr); assertThat(subs).isNotNull(); assertThat(subs).hasSize(2); } diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java index 68f8c912972..f38f2a2bb0c 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java @@ -33,15 +33,18 @@ import android.os.Bundle; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; import android.view.Menu; import android.view.View; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.view.menu.ContextMenuBuilder; import com.android.settings.R; +import com.android.settings.network.SubscriptionUtil; import com.google.android.material.bottomnavigation.BottomNavigationView; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -52,6 +55,7 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import androidx.fragment.app.Fragment; @@ -73,6 +77,8 @@ public class MobileNetworkActivityTest { @Mock private SubscriptionManager mSubscriptionManager; @Mock + private TelephonyManager mTelephonyManager; + @Mock private SubscriptionInfo mSubscriptionInfo; @Mock private SubscriptionInfo mSubscriptionInfo2; @@ -99,6 +105,8 @@ public class MobileNetworkActivityTest { doReturn(mSubscriptionManager).when(mMobileNetworkActivity).getSystemService( SubscriptionManager.class); + doReturn(mTelephonyManager).when(mMobileNetworkActivity).getSystemService( + TelephonyManager.class); doReturn(mBottomNavigationView).when(mMobileNetworkActivity).findViewById(R.id.bottom_nav); doReturn(mFragmentManager).when(mMobileNetworkActivity).getSupportFragmentManager(); doReturn(mFragmentTransaction).when(mFragmentManager).beginTransaction(); @@ -108,6 +116,11 @@ public class MobileNetworkActivityTest { MOBILE_SETTINGS_TAG + CURRENT_SUB_ID); } + @After + public void tearDown() { + SubscriptionUtil.setAvailableSubscriptionsForTesting(null); + } + @Test public void updateBottomNavigationView_oneSubscription_shouldBeGone() { mSubscriptionInfos.add(mSubscriptionInfo); @@ -169,7 +182,7 @@ public class MobileNetworkActivityTest { doReturn(intent).when(mMobileNetworkActivity).getIntent(); mSubscriptionInfos.add(mSubscriptionInfo); mSubscriptionInfos.add(mSubscriptionInfo2); - doReturn(mSubscriptionInfos).when(mSubscriptionManager).getSelectableSubscriptionInfoList(); + SubscriptionUtil.setAvailableSubscriptionsForTesting(mSubscriptionInfos); doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(CURRENT_SUB_ID); assertThat(mMobileNetworkActivity.getSubscriptionId()).isEqualTo(CURRENT_SUB_ID); diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.java index 6d85826ade4..a10227f5924 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -99,12 +100,21 @@ public class MobileNetworkSwitchControllerTest { } @Test - public void displayPreference_onlyOneSubscription_switchBarHidden() { + public void displayPreference_oneEnabledSubscription_switchBarHidden() { + doReturn(true).when(mSubscriptionManager).isSubscriptionEnabled(mSubId); SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscription)); mController.displayPreference(mScreen); assertThat(mSwitchBar.isShowing()).isFalse(); } + @Test + public void displayPreference_oneDisabledSubscription_switchBarNotHidden() { + doReturn(false).when(mSubscriptionManager).isSubscriptionEnabled(mSubId); + SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscription)); + mController.displayPreference(mScreen); + assertThat(mSwitchBar.isShowing()).isTrue(); + } + @Test public void displayPreference_subscriptionEnabled_switchIsOn() { when(mSubscriptionManager.isSubscriptionEnabled(mSubId)).thenReturn(true);