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