Always show disabled pSIMs in single-sim mode

In single-sim mode, you can have both an eSIM subscription and a pSIM
inserted into the device, and only one of them can be enabled. It turns
out that if the pSIM is the disabled one, we would not show it in the
settings UI; this CL fixes that.

It also fixes a somewhat related problem that I noticed while testing
this, that if you have only one subscription that happens to be
disabled, we were not showing the on/off switch at the top of the page,
which would leave you with no way to enable it.

Bug: 129864878
Test: make RunSettingsRoboTests
Change-Id: I4214ad34c59ac2df429772c066c51a9318f5baa7
This commit is contained in:
Antony Sargent
2019-04-23 10:55:51 -07:00
parent f263f489e2
commit bdd9eb3ba7
9 changed files with 197 additions and 31 deletions

View File

@@ -98,7 +98,7 @@ public class MobileNetworkListController extends AbstractPreferenceController im
mPreferences = new ArrayMap<>(); mPreferences = new ArrayMap<>();
final List<SubscriptionInfo> subscriptions = SubscriptionUtil.getAvailableSubscriptions( final List<SubscriptionInfo> subscriptions = SubscriptionUtil.getAvailableSubscriptions(
mSubscriptionManager); mContext);
for (SubscriptionInfo info : subscriptions) { for (SubscriptionInfo info : subscriptions) {
final int subId = info.getSubscriptionId(); final int subId = info.getSubscriptionId();
Preference pref = existingPreferences.remove(subId); Preference pref = existingPreferences.remove(subId);

View File

@@ -22,6 +22,7 @@ import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.UserManager; import android.os.UserManager;
import android.provider.Settings;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.euicc.EuiccManager; import android.telephony.euicc.EuiccManager;
@@ -99,7 +100,7 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController
@Override @Override
public CharSequence getSummary() { public CharSequence getSummary() {
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions( final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(
mSubscriptionManager); mContext);
if (subs.isEmpty()) { if (subs.isEmpty()) {
if (MobileNetworkUtils.showEuiccSettings(mContext)) { if (MobileNetworkUtils.showEuiccSettings(mContext)) {
return mContext.getResources().getString( return mContext.getResources().getString(
@@ -132,7 +133,7 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController
mPreference.setEnabled(!mChangeListener.isAirplaneModeOn()); mPreference.setEnabled(!mChangeListener.isAirplaneModeOn());
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions( final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(
mSubscriptionManager); mContext);
if (subs.isEmpty()) { if (subs.isEmpty()) {
if (MobileNetworkUtils.showEuiccSettings(mContext)) { if (MobileNetworkUtils.showEuiccSettings(mContext)) {
@@ -154,6 +155,7 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController
if (subs.size() == 1) { if (subs.size() == 1) {
mPreference.setOnPreferenceClickListener((Preference pref) -> { mPreference.setOnPreferenceClickListener((Preference pref) -> {
final Intent intent = new Intent(mContext, MobileNetworkActivity.class); final Intent intent = new Intent(mContext, MobileNetworkActivity.class);
intent.putExtra(Settings.EXTRA_SUB_ID, subs.get(0).getSubscriptionId());
mContext.startActivity(intent); mContext.startActivity(intent);
return true; return true;
}); });

View File

@@ -16,8 +16,15 @@
package com.android.settings.network; 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.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.UiccSlotInfo;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
@@ -27,6 +34,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
public class SubscriptionUtil { public class SubscriptionUtil {
private static final String TAG = "SubscriptionUtil";
private static List<SubscriptionInfo> sAvailableResultsForTesting; private static List<SubscriptionInfo> sAvailableResultsForTesting;
private static List<SubscriptionInfo> sActiveResultsForTesting; private static List<SubscriptionInfo> sActiveResultsForTesting;
@@ -44,21 +52,56 @@ public class SubscriptionUtil {
if (sActiveResultsForTesting != null) { if (sActiveResultsForTesting != null) {
return sActiveResultsForTesting; return sActiveResultsForTesting;
} }
List<SubscriptionInfo> subscriptions = manager.getActiveSubscriptionInfoList(true); final List<SubscriptionInfo> subscriptions = manager.getActiveSubscriptionInfoList(true);
if (subscriptions == null) { if (subscriptions == null) {
return new ArrayList<>(); return new ArrayList<>();
} }
return subscriptions; return subscriptions;
} }
public static List<SubscriptionInfo> getAvailableSubscriptions(SubscriptionManager manager) { private static boolean isInactiveInsertedPSim(UiccSlotInfo slotInfo) {
return !slotInfo.getIsEuicc() && !slotInfo.getIsActive() &&
slotInfo.getCardStateInfo() == CARD_STATE_INFO_PRESENT;
}
public static List<SubscriptionInfo> getAvailableSubscriptions(Context context) {
if (sAvailableResultsForTesting != null) { if (sAvailableResultsForTesting != null) {
return sAvailableResultsForTesting; return sAvailableResultsForTesting;
} }
List<SubscriptionInfo> subscriptions = manager.getSelectableSubscriptionInfoList(); final SubscriptionManager subMgr = context.getSystemService(SubscriptionManager.class);
if (subscriptions == null) { final TelephonyManager telMgr = context.getSystemService(TelephonyManager.class);
subscriptions = new ArrayList<>();
List<SubscriptionInfo> subscriptions =
new ArrayList<>(emptyIfNull(subMgr.getSelectableSubscriptionInfoList()));
// Look for inactive but present physical SIMs that are missing from the selectable list.
final List<UiccSlotInfo> 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 // 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 // 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. // underlying networks that need to be hidden from the user in the UI.

View File

@@ -40,6 +40,7 @@ import com.android.settings.R;
import com.android.settings.core.FeatureFlags; import com.android.settings.core.FeatureFlags;
import com.android.settings.core.SettingsBaseActivity; import com.android.settings.core.SettingsBaseActivity;
import com.android.settings.development.featureflags.FeatureFlagPersistent; import com.android.settings.development.featureflags.FeatureFlagPersistent;
import com.android.settings.network.SubscriptionUtil;
import com.google.android.material.bottomnavigation.BottomNavigationView; 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); final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL);
if (subId != SUB_ID_NULL) { if (subId != SUB_ID_NULL) {
for (SubscriptionInfo subscription : for (SubscriptionInfo subscription :
mSubscriptionManager.getSelectableSubscriptionInfoList()) { SubscriptionUtil.getAvailableSubscriptions(this)) {
if (subscription.getSubscriptionId() == subId) { if (subscription.getSubscriptionId() == subId) {
return subscription; return subscription;
} }

View File

@@ -94,8 +94,9 @@ public class MobileNetworkSwitchController extends BasePreferenceController impl
return; return;
} }
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions( final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(
mSubscriptionManager); mContext);
if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID || subs.size() < 2) { if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID ||
mSubscriptionManager.isSubscriptionEnabled(mSubId) && subs.size() < 2) {
mSwitchBar.hide(); mSwitchBar.hide();
return; return;
} }

View File

@@ -34,6 +34,7 @@ import android.net.ConnectivityManager;
import android.os.UserManager; import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.euicc.EuiccManager; import android.telephony.euicc.EuiccManager;
import android.text.TextUtils; import android.text.TextUtils;
@@ -151,8 +152,11 @@ public class MobileNetworkSummaryControllerTest {
mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference); mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference);
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mContext).startActivity(intentCaptor.capture()); verify(mContext).startActivity(intentCaptor.capture());
assertThat(intentCaptor.getValue().getComponent().getClassName()).isEqualTo( Intent intent = intentCaptor.getValue();
assertThat(intent.getComponent().getClassName()).isEqualTo(
MobileNetworkActivity.class.getName()); MobileNetworkActivity.class.getName());
assertThat(intent.getIntExtra(Settings.EXTRA_SUB_ID,
SubscriptionManager.INVALID_SUBSCRIPTION_ID)).isEqualTo(sub1.getSubscriptionId());
} }
@Test @Test

View File

@@ -16,14 +16,21 @@
package com.android.settings.network; 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 com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.UiccSlotInfo;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -39,17 +46,25 @@ import java.util.List;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class SubscriptionUtilTest { public class SubscriptionUtilTest {
@Mock @Mock
private SubscriptionManager mManager; private Context mContext;
@Mock
private SubscriptionManager mSubMgr;
@Mock
private TelephonyManager mTelMgr;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
doReturn(mSubMgr).when(mContext).getSystemService(SubscriptionManager.class);
doReturn(mTelMgr).when(mContext).getSystemService(TelephonyManager.class);
when(mTelMgr.getUiccSlotsInfo()).thenReturn(null);
} }
@Test @Test
public void getAvailableSubscriptions_nullInfoFromSubscriptionManager_nonNullResult() { public void getAvailableSubscriptions_nullInfoFromSubscriptionManager_nonNullResult() {
when(mManager.getSelectableSubscriptionInfoList()).thenReturn(null); when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(null);
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mManager); final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
assertThat(subs).isNotNull(); assertThat(subs).isNotNull();
assertThat(subs).isEmpty(); assertThat(subs).isEmpty();
} }
@@ -58,8 +73,8 @@ public class SubscriptionUtilTest {
public void getAvailableSubscriptions_oneSubscription_oneResult() { public void getAvailableSubscriptions_oneSubscription_oneResult() {
final SubscriptionInfo info = mock(SubscriptionInfo.class); final SubscriptionInfo info = mock(SubscriptionInfo.class);
when(info.getMncString()).thenReturn("fake1234"); when(info.getMncString()).thenReturn("fake1234");
when(mManager.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info)); when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info));
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mManager); final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
assertThat(subs).isNotNull(); assertThat(subs).isNotNull();
assertThat(subs).hasSize(1); assertThat(subs).hasSize(1);
} }
@@ -70,8 +85,8 @@ public class SubscriptionUtilTest {
final SubscriptionInfo info2 = mock(SubscriptionInfo.class); final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
when(info1.getMncString()).thenReturn("fake1234"); when(info1.getMncString()).thenReturn("fake1234");
when(info2.getMncString()).thenReturn("fake5678"); when(info2.getMncString()).thenReturn("fake5678");
when(mManager.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info1, info2)); when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info1, info2));
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mManager); final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
assertThat(subs).isNotNull(); assertThat(subs).isNotNull();
assertThat(subs).hasSize(2); assertThat(subs).hasSize(2);
} }
@@ -83,9 +98,9 @@ public class SubscriptionUtilTest {
final SubscriptionInfo info3 = mock(SubscriptionInfo.class); final SubscriptionInfo info3 = mock(SubscriptionInfo.class);
when(info1.getSubscriptionId()).thenReturn(1); when(info1.getSubscriptionId()).thenReturn(1);
when(info1.getMncString()).thenReturn("fake1234"); when(info1.getMncString()).thenReturn("fake1234");
when(mManager.getSelectableSubscriptionInfoList()).thenReturn( when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(
new ArrayList<>(Arrays.asList(info1, info2, info3))); new ArrayList<>(Arrays.asList(info1, info2, info3)));
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mManager); final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
assertThat(subs).isNotNull(); assertThat(subs).isNotNull();
assertThat(subs).hasSize(1); assertThat(subs).hasSize(1);
assertThat(subs.get(0).getSubscriptionId()).isEqualTo(1); assertThat(subs.get(0).getSubscriptionId()).isEqualTo(1);
@@ -101,19 +116,96 @@ public class SubscriptionUtilTest {
when(info1.getMncString()).thenReturn("fake1234"); when(info1.getMncString()).thenReturn("fake1234");
when(info4.getSubscriptionId()).thenReturn(4); when(info4.getSubscriptionId()).thenReturn(4);
when(info4.getMncString()).thenReturn("fake5678"); when(info4.getMncString()).thenReturn("fake5678");
when(mManager.getSelectableSubscriptionInfoList()).thenReturn(new ArrayList<>( when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(new ArrayList<>(
Arrays.asList(info1, info2, info3, info4))); Arrays.asList(info1, info2, info3, info4)));
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mManager); final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
assertThat(subs).isNotNull(); assertThat(subs).isNotNull();
assertThat(subs).hasSize(2); assertThat(subs).hasSize(2);
assertThat(subs.get(0).getSubscriptionId()).isEqualTo(1); assertThat(subs.get(0).getSubscriptionId()).isEqualTo(1);
assertThat(subs.get(1).getSubscriptionId()).isEqualTo(4); 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<SubscriptionInfo> 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<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
assertThat(subs).hasSize(2);
assertThat(subs.get(0).getSubscriptionId()).isEqualTo(111);
assertThat(subs.get(1).getSubscriptionId()).isEqualTo(333);
}
@Test @Test
public void getActiveSubscriptions_nullInfoFromSubscriptionManager_nonNullResult() { public void getActiveSubscriptions_nullInfoFromSubscriptionManager_nonNullResult() {
when(mManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(null); when(mSubMgr.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(null);
final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mManager); final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mSubMgr);
assertThat(subs).isNotNull(); assertThat(subs).isNotNull();
assertThat(subs).isEmpty(); assertThat(subs).isEmpty();
} }
@@ -121,8 +213,8 @@ public class SubscriptionUtilTest {
@Test @Test
public void getActiveSubscriptions_oneSubscription_oneResult() { public void getActiveSubscriptions_oneSubscription_oneResult() {
final SubscriptionInfo info = mock(SubscriptionInfo.class); final SubscriptionInfo info = mock(SubscriptionInfo.class);
when(mManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(Arrays.asList(info)); when(mSubMgr.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(Arrays.asList(info));
final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mManager); final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mSubMgr);
assertThat(subs).isNotNull(); assertThat(subs).isNotNull();
assertThat(subs).hasSize(1); assertThat(subs).hasSize(1);
} }
@@ -131,9 +223,9 @@ public class SubscriptionUtilTest {
public void getActiveSubscriptions_twoSubscriptions_twoResults() { public void getActiveSubscriptions_twoSubscriptions_twoResults() {
final SubscriptionInfo info1 = mock(SubscriptionInfo.class); final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
final SubscriptionInfo info2 = mock(SubscriptionInfo.class); final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
when(mManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn( when(mSubMgr.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(
Arrays.asList(info1, info2)); Arrays.asList(info1, info2));
final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mManager); final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mSubMgr);
assertThat(subs).isNotNull(); assertThat(subs).isNotNull();
assertThat(subs).hasSize(2); assertThat(subs).hasSize(2);
} }

View File

@@ -33,15 +33,18 @@ import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.view.Menu; import android.view.Menu;
import android.view.View; import android.view.View;
import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.view.menu.ContextMenuBuilder; import com.android.internal.view.menu.ContextMenuBuilder;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.network.SubscriptionUtil;
import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.bottomnavigation.BottomNavigationView;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -52,6 +55,7 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
@@ -73,6 +77,8 @@ public class MobileNetworkActivityTest {
@Mock @Mock
private SubscriptionManager mSubscriptionManager; private SubscriptionManager mSubscriptionManager;
@Mock @Mock
private TelephonyManager mTelephonyManager;
@Mock
private SubscriptionInfo mSubscriptionInfo; private SubscriptionInfo mSubscriptionInfo;
@Mock @Mock
private SubscriptionInfo mSubscriptionInfo2; private SubscriptionInfo mSubscriptionInfo2;
@@ -99,6 +105,8 @@ public class MobileNetworkActivityTest {
doReturn(mSubscriptionManager).when(mMobileNetworkActivity).getSystemService( doReturn(mSubscriptionManager).when(mMobileNetworkActivity).getSystemService(
SubscriptionManager.class); SubscriptionManager.class);
doReturn(mTelephonyManager).when(mMobileNetworkActivity).getSystemService(
TelephonyManager.class);
doReturn(mBottomNavigationView).when(mMobileNetworkActivity).findViewById(R.id.bottom_nav); doReturn(mBottomNavigationView).when(mMobileNetworkActivity).findViewById(R.id.bottom_nav);
doReturn(mFragmentManager).when(mMobileNetworkActivity).getSupportFragmentManager(); doReturn(mFragmentManager).when(mMobileNetworkActivity).getSupportFragmentManager();
doReturn(mFragmentTransaction).when(mFragmentManager).beginTransaction(); doReturn(mFragmentTransaction).when(mFragmentManager).beginTransaction();
@@ -108,6 +116,11 @@ public class MobileNetworkActivityTest {
MOBILE_SETTINGS_TAG + CURRENT_SUB_ID); MOBILE_SETTINGS_TAG + CURRENT_SUB_ID);
} }
@After
public void tearDown() {
SubscriptionUtil.setAvailableSubscriptionsForTesting(null);
}
@Test @Test
public void updateBottomNavigationView_oneSubscription_shouldBeGone() { public void updateBottomNavigationView_oneSubscription_shouldBeGone() {
mSubscriptionInfos.add(mSubscriptionInfo); mSubscriptionInfos.add(mSubscriptionInfo);
@@ -169,7 +182,7 @@ public class MobileNetworkActivityTest {
doReturn(intent).when(mMobileNetworkActivity).getIntent(); doReturn(intent).when(mMobileNetworkActivity).getIntent();
mSubscriptionInfos.add(mSubscriptionInfo); mSubscriptionInfos.add(mSubscriptionInfo);
mSubscriptionInfos.add(mSubscriptionInfo2); mSubscriptionInfos.add(mSubscriptionInfo2);
doReturn(mSubscriptionInfos).when(mSubscriptionManager).getSelectableSubscriptionInfoList(); SubscriptionUtil.setAvailableSubscriptionsForTesting(mSubscriptionInfos);
doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(CURRENT_SUB_ID); doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(CURRENT_SUB_ID);
assertThat(mMobileNetworkActivity.getSubscriptionId()).isEqualTo(CURRENT_SUB_ID); assertThat(mMobileNetworkActivity.getSubscriptionId()).isEqualTo(CURRENT_SUB_ID);

View File

@@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
@@ -99,12 +100,21 @@ public class MobileNetworkSwitchControllerTest {
} }
@Test @Test
public void displayPreference_onlyOneSubscription_switchBarHidden() { public void displayPreference_oneEnabledSubscription_switchBarHidden() {
doReturn(true).when(mSubscriptionManager).isSubscriptionEnabled(mSubId);
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscription)); SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscription));
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
assertThat(mSwitchBar.isShowing()).isFalse(); 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 @Test
public void displayPreference_subscriptionEnabled_switchIsOn() { public void displayPreference_subscriptionEnabled_switchIsOn() {
when(mSubscriptionManager.isSubscriptionEnabled(mSubId)).thenReturn(true); when(mSubscriptionManager.isSubscriptionEnabled(mSubId)).thenReturn(true);