From 8fc473629a62d2226b45a9c65e4bfc2ccc6a3e75 Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Thu, 7 Feb 2019 10:22:29 -0800 Subject: [PATCH] Set summary for SIM entries in multi-SIM header On the Network & internet page, when you have multiple active SIMs we add a header with an entry for each one. This CL sets the summary for those entries to be a 1 or 2 line indication of what services (calls, SMS, and data) that SIM is used for by default, or just an indication that the SIM is available. And for the SIM used by default for data, we include status information about whether it's connected or not. Bug: 116349402 Test: make RunSettingsRoboTests Change-Id: I46f37433f753724bbde8876f0d89c3155b2c3812 --- res/values/strings.xml | 24 ++++++ .../SubscriptionsPreferenceController.java | 54 ++++++++++++- ...SubscriptionsPreferenceControllerTest.java | 75 +++++++++++++++++++ 3 files changed, 151 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index c891432025d..5b9fda01554 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10456,6 +10456,30 @@ %1$d SIMs + + Default for calls + + Default for SMS + + Default for calls & SMS + + Default for mobile data + + Mobile data active + + Mobile data off + + Available + Add more diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java index 6952a1e9fbd..a6397827b32 100644 --- a/src/com/android/settings/network/SubscriptionsPreferenceController.java +++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; import androidx.collection.ArrayMap; import androidx.lifecycle.Lifecycle; @@ -136,11 +137,10 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl mPreferenceGroup.addPreference(pref); } pref.setTitle(info.getDisplayName()); + pref.setSummary(getSummary(subId)); pref.setIcon(R.drawable.ic_network_cell); pref.setOrder(order++); - // TODO(asargent) - set summary here to indicate default for calls/sms and data - pref.setOnPreferenceClickListener(clickedPref -> { final Intent intent = new Intent(mContext, MobileNetworkActivity.class); intent.putExtra(Settings.EXTRA_SUB_ID, subId); @@ -158,6 +158,56 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl mUpdateListener.onChildrenUpdated(); } + /** + * The summary can have either 1 or 2 lines depending on which services (calls, SMS, data) this + * subscription is the default for. + * + * If this subscription is the default for calls and/or SMS, we add a line to show that. + * + * If this subscription is the default for data, we add a line with detail about + * whether the data connection is active. + * + * If a subscription isn't the default for anything, we just say it is available. + */ + protected String getSummary(int subId) { + final int callsDefaultSubId = SubscriptionManager.getDefaultVoiceSubscriptionId(); + final int smsDefaultSubId = SubscriptionManager.getDefaultSmsSubscriptionId(); + final int dataDefaultSubId = SubscriptionManager.getDefaultDataSubscriptionId(); + + String line1 = null; + if (subId == callsDefaultSubId && subId == smsDefaultSubId) { + line1 = mContext.getString(R.string.default_for_calls_and_sms); + } else if (subId == callsDefaultSubId) { + line1 = mContext.getString(R.string.default_for_calls); + } else if (subId == smsDefaultSubId) { + line1 = mContext.getString(R.string.default_for_sms); + } + + String line2 = null; + if (subId == dataDefaultSubId) { + final TelephonyManager telMgrForSub = mContext.getSystemService( + TelephonyManager.class).createForSubscriptionId(subId); + final int dataState = telMgrForSub.getDataState(); + if (dataState == TelephonyManager.DATA_CONNECTED) { + line2 = mContext.getString(R.string.mobile_data_active); + } else if (!telMgrForSub.isDataEnabled()) { + line2 = mContext.getString(R.string.mobile_data_off); + } else { + line2 = mContext.getString(R.string.default_for_mobile_data); + } + } + + if (line1 != null && line2 != null) { + return String.join(System.lineSeparator(), line1, line2); + } else if (line1 != null) { + return line1; + } else if (line2 != null) { + return line2; + } else { + return mContext.getString(R.string.subscription_available); + } + } + /** * * @return true if there are at least 2 available subscriptions. diff --git a/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java index 70536997493..a4847457441 100644 --- a/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java @@ -20,6 +20,7 @@ import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -34,7 +35,9 @@ import android.content.Intent; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import com.android.settings.R; import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.After; @@ -46,6 +49,8 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowSubscriptionManager; import java.util.ArrayList; import java.util.Arrays; @@ -57,6 +62,7 @@ import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; @RunWith(RobolectricTestRunner.class) +@Config(shadows = ShadowSubscriptionManager.class) public class SubscriptionsPreferenceControllerTest { private static final String KEY = "preference_group"; @@ -66,6 +72,8 @@ public class SubscriptionsPreferenceControllerTest { private PreferenceCategory mPreferenceCategory; @Mock private SubscriptionManager mSubscriptionManager; + @Mock + private TelephonyManager mTelephonyManager; private Context mContext; private LifecycleOwner mLifecycleOwner; @@ -81,6 +89,8 @@ public class SubscriptionsPreferenceControllerTest { mLifecycleOwner = () -> mLifecycle; mLifecycle = new Lifecycle(mLifecycleOwner); when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); + when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); + when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); when(mScreen.findPreference(eq(KEY))).thenReturn(mPreferenceCategory); when(mPreferenceCategory.getContext()).thenReturn(mContext); mOnChildUpdatedCount = 0; @@ -280,4 +290,69 @@ public class SubscriptionsPreferenceControllerTest { public void threePreferences_thirdPreferenceClicked_correctIntentFires() { runPreferenceClickTest(3, 2); } + + @Test + public void getSummary_twoSubsOneDefaultForEverythingDataActive() { + final SubscriptionInfo sub1 = mock(SubscriptionInfo.class); + final SubscriptionInfo sub2 = mock(SubscriptionInfo.class); + when(sub1.getSubscriptionId()).thenReturn(11); + when(sub2.getSubscriptionId()).thenReturn(22); + SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2)); + + ShadowSubscriptionManager.setDefaultDataSubscriptionId(11); + ShadowSubscriptionManager.setDefaultSmsSubscriptionId(11); + ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(11); + when(mTelephonyManager.getDataState()).thenReturn(TelephonyManager.DATA_CONNECTED); + + assertThat(mController.getSummary(11)).isEqualTo( + mContext.getString(R.string.default_for_calls_and_sms) + System.lineSeparator() + + mContext.getString(R.string.mobile_data_active)); + + assertThat(mController.getSummary(22)).isEqualTo( + mContext.getString(R.string.subscription_available)); + } + + @Test + public void getSummary_twoSubsOneDefaultForEverythingDataDisabled() { + final SubscriptionInfo sub1 = mock(SubscriptionInfo.class); + final SubscriptionInfo sub2 = mock(SubscriptionInfo.class); + when(sub1.getSubscriptionId()).thenReturn(11); + when(sub2.getSubscriptionId()).thenReturn(22); + SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2)); + + ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(11); + ShadowSubscriptionManager.setDefaultSmsSubscriptionId(11); + ShadowSubscriptionManager.setDefaultDataSubscriptionId(11); + when(mTelephonyManager.getDataState()).thenReturn(TelephonyManager.DATA_DISCONNECTED); + when(mTelephonyManager.isDataEnabled()).thenReturn(false); + + assertThat(mController.getSummary(11)).isEqualTo( + mContext.getString(R.string.default_for_calls_and_sms) + System.lineSeparator() + + mContext.getString(R.string.mobile_data_off)); + + assertThat(mController.getSummary(22)).isEqualTo( + mContext.getString(R.string.subscription_available)); + } + + @Test + public void getSummary_twoSubsOneForCallsAndDataOneForSms() { + final SubscriptionInfo sub1 = mock(SubscriptionInfo.class); + final SubscriptionInfo sub2 = mock(SubscriptionInfo.class); + when(sub1.getSubscriptionId()).thenReturn(11); + when(sub2.getSubscriptionId()).thenReturn(22); + SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2)); + + ShadowSubscriptionManager.setDefaultDataSubscriptionId(11); + ShadowSubscriptionManager.setDefaultSmsSubscriptionId(22); + ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(11); + when(mTelephonyManager.getDataState()).thenReturn(TelephonyManager.DATA_DISCONNECTED); + when(mTelephonyManager.isDataEnabled()).thenReturn(true); + + assertThat(mController.getSummary(11)).isEqualTo( + mContext.getString(R.string.default_for_calls) + System.lineSeparator() + + mContext.getString(R.string.default_for_mobile_data)); + + assertThat(mController.getSummary(22)).isEqualTo( + mContext.getString(R.string.default_for_sms)); + } }