Merge "Add disable pSIM option in Settings"

This commit is contained in:
Xiangyu/Malcolm Chen
2019-12-09 22:30:06 +00:00
committed by Android (Google) Code Review
9 changed files with 79 additions and 19 deletions

View File

@@ -117,6 +117,8 @@ public class MobileNetworkListController extends AbstractPreferenceController im
} else { } else {
if (mSubscriptionManager.isActiveSubscriptionId(subId)) { if (mSubscriptionManager.isActiveSubscriptionId(subId)) {
pref.setSummary(R.string.mobile_network_active_sim); pref.setSummary(R.string.mobile_network_active_sim);
} else if (SubscriptionUtil.showToggleForPhysicalSim(mSubscriptionManager)) {
pref.setSummary(mContext.getString(R.string.mobile_network_inactive_sim));
} else { } else {
pref.setSummary(mContext.getString(R.string.mobile_network_tap_to_activate, pref.setSummary(mContext.getString(R.string.mobile_network_tap_to_activate,
SubscriptionUtil.getDisplayName(info))); SubscriptionUtil.getDisplayName(info)));
@@ -124,7 +126,8 @@ public class MobileNetworkListController extends AbstractPreferenceController im
} }
pref.setOnPreferenceClickListener(clickedPref -> { pref.setOnPreferenceClickListener(clickedPref -> {
if (!info.isEmbedded() && !mSubscriptionManager.isActiveSubscriptionId(subId)) { if (!info.isEmbedded() && !mSubscriptionManager.isActiveSubscriptionId(subId)
&& !SubscriptionUtil.showToggleForPhysicalSim(mSubscriptionManager)) {
mSubscriptionManager.setSubscriptionEnabled(subId, true); mSubscriptionManager.setSubscriptionEnabled(subId, true);
} else { } else {
final Intent intent = new Intent(mContext, MobileNetworkActivity.class); final Intent intent = new Intent(mContext, MobileNetworkActivity.class);

View File

@@ -110,7 +110,8 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController
} else if (subs.size() == 1) { } else if (subs.size() == 1) {
final SubscriptionInfo info = subs.get(0); final SubscriptionInfo info = subs.get(0);
final int subId = info.getSubscriptionId(); final int subId = info.getSubscriptionId();
if (!info.isEmbedded() && !mSubscriptionManager.isActiveSubscriptionId(subId)) { if (!info.isEmbedded() && !mSubscriptionManager.isActiveSubscriptionId(subId)
&& !SubscriptionUtil.showToggleForPhysicalSim(mSubscriptionManager)) {
return mContext.getString(R.string.mobile_network_tap_to_activate, return mContext.getString(R.string.mobile_network_tap_to_activate,
SubscriptionUtil.getDisplayName(info)); SubscriptionUtil.getDisplayName(info));
} else { } else {
@@ -163,7 +164,8 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController
mPreference.setOnPreferenceClickListener((Preference pref) -> { mPreference.setOnPreferenceClickListener((Preference pref) -> {
final SubscriptionInfo info = subs.get(0); final SubscriptionInfo info = subs.get(0);
final int subId = info.getSubscriptionId(); final int subId = info.getSubscriptionId();
if (!info.isEmbedded() && !mSubscriptionManager.isActiveSubscriptionId(subId)) { if (!info.isEmbedded() && !mSubscriptionManager.isActiveSubscriptionId(subId)
&& !SubscriptionUtil.showToggleForPhysicalSim(mSubscriptionManager)) {
mSubscriptionManager.setSubscriptionEnabled(subId, true); mSubscriptionManager.setSubscriptionEnabled(subId, true);
} else { } else {
final Intent intent = new Intent(mContext, MobileNetworkActivity.class); final Intent intent = new Intent(mContext, MobileNetworkActivity.class);

View File

@@ -113,4 +113,11 @@ public class SubscriptionUtil {
} }
return ""; return "";
} }
/**
* Whether Settings should show a "Use SIM" toggle in pSIM detailed page.
*/
public static boolean showToggleForPhysicalSim(SubscriptionManager subMgr) {
return subMgr.canDisablePhysicalSubscription();
}
} }

View File

@@ -19,7 +19,6 @@ package com.android.settings.network.telephony;
import android.content.Context; 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 com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.network.SubscriptionUtil; import com.android.settings.network.SubscriptionUtil;
@@ -41,9 +40,11 @@ public class DisableSimFooterPreferenceController extends BasePreferenceControll
if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
return CONDITIONALLY_UNAVAILABLE; return CONDITIONALLY_UNAVAILABLE;
} }
SubscriptionManager subManager = mContext.getSystemService(SubscriptionManager.class);
for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(mContext)) { for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(mContext)) {
if (info.getSubscriptionId() == mSubId) { if (info.getSubscriptionId() == mSubId) {
if (info.isEmbedded()) { if (info.isEmbedded() || SubscriptionUtil.showToggleForPhysicalSim(subManager)) {
return CONDITIONALLY_UNAVAILABLE; return CONDITIONALLY_UNAVAILABLE;
} }
break; break;

View File

@@ -99,14 +99,13 @@ public class MobileNetworkSwitchController extends BasePreferenceController impl
} }
} }
// For eSIM, we always want the toggle. The telephony stack doesn't currently support // For eSIM, we always want the toggle. If telephony stack support disabling a pSIM
// disabling a pSIM directly (b/133379187), so we for now we don't include this on pSIM. // directly, we show the toggle.
if (subInfo == null || !subInfo.isEmbedded()) { if (subInfo == null || (!subInfo.isEmbedded() && !SubscriptionUtil.showToggleForPhysicalSim(
mSubscriptionManager))) {
mSwitchBar.hide(); mSwitchBar.hide();
} else { } else {
mSwitchBar.show(); mSwitchBar.show();
// TODO b/135222940: re-evaluate whether to use
// mSubscriptionManager#isSubscriptionEnabled
mSwitchBar.setChecked(mSubscriptionManager.isActiveSubId(mSubId)); mSwitchBar.setChecked(mSubscriptionManager.isActiveSubId(mSubId));
} }
} }

View File

@@ -22,6 +22,7 @@ import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@@ -30,7 +31,6 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.provider.Settings; import android.provider.Settings;
@@ -46,7 +46,6 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
@@ -155,6 +154,7 @@ public class MobileNetworkListControllerTest {
when(sub1.isEmbedded()).thenReturn(true); when(sub1.isEmbedded()).thenReturn(true);
doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(eq(1)); doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(eq(1));
doReturn(false).when(mSubscriptionManager).isActiveSubscriptionId(eq(2)); doReturn(false).when(mSubscriptionManager).isActiveSubscriptionId(eq(2));
doReturn(false).when(mSubscriptionManager).canDisablePhysicalSubscription();
when(sub2.isEmbedded()).thenReturn(false); when(sub2.isEmbedded()).thenReturn(false);
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2)); SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2));
@@ -166,13 +166,21 @@ public class MobileNetworkListControllerTest {
final ArgumentCaptor<Preference> preferenceCaptor = ArgumentCaptor.forClass( final ArgumentCaptor<Preference> preferenceCaptor = ArgumentCaptor.forClass(
Preference.class); Preference.class);
verify(mPreferenceScreen, times(2)).addPreference(preferenceCaptor.capture()); verify(mPreferenceScreen, times(2)).addPreference(preferenceCaptor.capture());
final Preference pref1 = preferenceCaptor.getAllValues().get(0); Preference pref1 = preferenceCaptor.getAllValues().get(0);
final Preference pref2 = preferenceCaptor.getAllValues().get(1); Preference pref2 = preferenceCaptor.getAllValues().get(1);
assertThat(pref1.getSummary()).isEqualTo("Active / Downloaded SIM"); assertThat(pref1.getSummary()).isEqualTo("Active / Downloaded SIM");
assertThat(pref2.getSummary()).isEqualTo("Tap to activate sub2"); assertThat(pref2.getSummary()).isEqualTo("Tap to activate sub2");
pref2.getOnPreferenceClickListener().onPreferenceClick(pref2); pref2.getOnPreferenceClickListener().onPreferenceClick(pref2);
verify(mSubscriptionManager).setSubscriptionEnabled(eq(2), eq(true)); verify(mSubscriptionManager).setSubscriptionEnabled(eq(2), eq(true));
// If disabling pSIM is allowed, summary of inactive pSIM should be different.
clearInvocations(mPreferenceScreen);
clearInvocations(mSubscriptionManager);
doReturn(true).when(mSubscriptionManager).canDisablePhysicalSubscription();
mController.onResume();
pref2 = preferenceCaptor.getAllValues().get(1);
assertThat(pref2.getSummary()).isEqualTo("Inactive / SIM");
} }
@Test @Test

View File

@@ -29,7 +29,6 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
@@ -52,7 +51,6 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
@@ -168,7 +166,7 @@ public class MobileNetworkSummaryControllerTest {
} }
@Test @Test
public void getSummary_oneInactivePSim_correctSummaryAndClickHandler() { public void getSummary_oneInactivePSim_cannotDisablePsim_correctSummaryAndClickHandler() {
final SubscriptionInfo sub1 = mock(SubscriptionInfo.class); final SubscriptionInfo sub1 = mock(SubscriptionInfo.class);
when(sub1.getSubscriptionId()).thenReturn(1); when(sub1.getSubscriptionId()).thenReturn(1);
when(sub1.getDisplayName()).thenReturn("sub1"); when(sub1.getDisplayName()).thenReturn("sub1");
@@ -185,6 +183,30 @@ public class MobileNetworkSummaryControllerTest {
verify(mSubscriptionManager).setSubscriptionEnabled(eq(sub1.getSubscriptionId()), eq(true)); verify(mSubscriptionManager).setSubscriptionEnabled(eq(sub1.getSubscriptionId()), eq(true));
} }
@Test
public void getSummary_oneInactivePSim_canDisablePsim_correctSummaryAndClickHandler() {
final SubscriptionInfo sub1 = mock(SubscriptionInfo.class);
when(sub1.getSubscriptionId()).thenReturn(1);
when(sub1.getDisplayName()).thenReturn("sub1");
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1));
when(mSubscriptionManager.isActiveSubscriptionId(eq(1))).thenReturn(false);
when(mSubscriptionManager.canDisablePhysicalSubscription()).thenReturn(true);
mController.displayPreference(mPreferenceScreen);
mController.onResume();
assertThat(mController.getSummary()).isEqualTo("sub1");
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
doNothing().when(mContext).startActivity(intentCaptor.capture());
mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference);
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 @Test
public void getSummary_twoSubscriptions_correctSummaryAndFragment() { public void getSummary_twoSubscriptions_correctSummaryAndFragment() {
final SubscriptionInfo sub1 = mock(SubscriptionInfo.class); final SubscriptionInfo sub1 = mock(SubscriptionInfo.class);

View File

@@ -18,11 +18,13 @@ package com.android.settings.network.telephony;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import com.android.settings.network.SubscriptionUtil; import com.android.settings.network.SubscriptionUtil;
@@ -45,12 +47,15 @@ public class DisableSimFooterPreferenceControllerTest {
private SubscriptionInfo mInfo; private SubscriptionInfo mInfo;
private Context mContext; private Context mContext;
@Mock
private SubscriptionManager mSubscriptionManager;
private DisableSimFooterPreferenceController mController; private DisableSimFooterPreferenceController mController;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application; mContext = spy(RuntimeEnvironment.application);
doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class);
when(mInfo.getSubscriptionId()).thenReturn(SUB_ID); when(mInfo.getSubscriptionId()).thenReturn(SUB_ID);
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mInfo)); SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mInfo));
mController = new DisableSimFooterPreferenceController(mContext, PREF_KEY); mController = new DisableSimFooterPreferenceController(mContext, PREF_KEY);
@@ -69,9 +74,18 @@ public class DisableSimFooterPreferenceControllerTest {
} }
@Test @Test
public void isAvailable_pSIM_available() { public void isAvailable_pSIM_available_cannot_disable_pSIM() {
when(mInfo.isEmbedded()).thenReturn(false); when(mInfo.isEmbedded()).thenReturn(false);
mController.init(SUB_ID); mController.init(SUB_ID);
doReturn(false).when(mSubscriptionManager).canDisablePhysicalSubscription();
assertThat(mController.isAvailable()).isTrue(); assertThat(mController.isAvailable()).isTrue();
} }
@Test
public void isAvailable_pSIM_available_can_disable_pSIM() {
when(mInfo.isEmbedded()).thenReturn(false);
mController.init(SUB_ID);
doReturn(true).when(mSubscriptionManager).canDisablePhysicalSubscription();
assertThat(mController.isAvailable()).isFalse();
}
} }

View File

@@ -105,6 +105,10 @@ public class MobileNetworkSwitchControllerTest {
when(mSubscription.isEmbedded()).thenReturn(false); when(mSubscription.isEmbedded()).thenReturn(false);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
assertThat(mSwitchBar.isShowing()).isFalse(); assertThat(mSwitchBar.isShowing()).isFalse();
when(mSubscriptionManager.canDisablePhysicalSubscription()).thenReturn(true);
mController.displayPreference(mScreen);
assertThat(mSwitchBar.isShowing()).isTrue();
} }
@Test @Test