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));
+ }
}