Loading res/values/strings.xml +24 −0 Original line number Diff line number Diff line Loading @@ -10456,6 +10456,30 @@ <item quantity="other"><xliff:g id="count" example="2">%1$d</xliff:g> SIMs</item> </plurals> <!-- Network & internet page. Summary indicating that a SIM is used by default for calls when multiple SIMs are present. [CHAR LIMIT=40] --> <string name="default_for_calls">Default for calls</string> <!-- Network & internet page. Summary indicating that a SIM is used by default for SMS messages when multiple SIMs are present. [CHAR LIMIT=40] --> <string name="default_for_sms">Default for SMS</string> <!-- Network & internet page. Summary indicating that a SIM is used by default for calls and SMS messages when multiple SIMs are present. [CHAR LIMIT=40] --> <string name="default_for_calls_and_sms">Default for calls & SMS</string> <!-- Network & internet page. Summary indicating that a SIM is used by default for mobile data when multiple SIMs are present. [CHAR LIMIT=40] --> <string name="default_for_mobile_data">Default for mobile data</string> <!-- Network & internet page. Summary indicating that a SIM has an active mobile data connection when multiple SIMs are present. [CHAR LIMIT=40] --> <string name="mobile_data_active">Mobile data active</string> <!-- Network & internet page. Summary indicating that a SIM is used by default for mobile data when multiple SIMs are present, but mobile data is currently turned off. [CHAR LIMIT=40] --> <string name="mobile_data_off">Mobile data off</string> <!-- Network & internet page. Summary indicating that a SIM is available to be used for services such as calls, SMS, or data when multiple SIMs are present, but is not currently the default SIM for any of those services. [CHAR LIMIT=40] --> <string name="subscription_available">Available</string> <!-- Title of item shown at the bottom of the page listing multiple mobile service subscriptions; tapping it leads to a UI to add more [CHAR LIMIT=40] --> <string name="mobile_network_list_add_more">Add more</string> src/com/android/settings/network/SubscriptionsPreferenceController.java +52 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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. Loading tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java +75 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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"; Loading @@ -66,6 +72,8 @@ public class SubscriptionsPreferenceControllerTest { private PreferenceCategory mPreferenceCategory; @Mock private SubscriptionManager mSubscriptionManager; @Mock private TelephonyManager mTelephonyManager; private Context mContext; private LifecycleOwner mLifecycleOwner; Loading @@ -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; Loading Loading @@ -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)); } } Loading
res/values/strings.xml +24 −0 Original line number Diff line number Diff line Loading @@ -10456,6 +10456,30 @@ <item quantity="other"><xliff:g id="count" example="2">%1$d</xliff:g> SIMs</item> </plurals> <!-- Network & internet page. Summary indicating that a SIM is used by default for calls when multiple SIMs are present. [CHAR LIMIT=40] --> <string name="default_for_calls">Default for calls</string> <!-- Network & internet page. Summary indicating that a SIM is used by default for SMS messages when multiple SIMs are present. [CHAR LIMIT=40] --> <string name="default_for_sms">Default for SMS</string> <!-- Network & internet page. Summary indicating that a SIM is used by default for calls and SMS messages when multiple SIMs are present. [CHAR LIMIT=40] --> <string name="default_for_calls_and_sms">Default for calls & SMS</string> <!-- Network & internet page. Summary indicating that a SIM is used by default for mobile data when multiple SIMs are present. [CHAR LIMIT=40] --> <string name="default_for_mobile_data">Default for mobile data</string> <!-- Network & internet page. Summary indicating that a SIM has an active mobile data connection when multiple SIMs are present. [CHAR LIMIT=40] --> <string name="mobile_data_active">Mobile data active</string> <!-- Network & internet page. Summary indicating that a SIM is used by default for mobile data when multiple SIMs are present, but mobile data is currently turned off. [CHAR LIMIT=40] --> <string name="mobile_data_off">Mobile data off</string> <!-- Network & internet page. Summary indicating that a SIM is available to be used for services such as calls, SMS, or data when multiple SIMs are present, but is not currently the default SIM for any of those services. [CHAR LIMIT=40] --> <string name="subscription_available">Available</string> <!-- Title of item shown at the bottom of the page listing multiple mobile service subscriptions; tapping it leads to a UI to add more [CHAR LIMIT=40] --> <string name="mobile_network_list_add_more">Add more</string>
src/com/android/settings/network/SubscriptionsPreferenceController.java +52 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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. Loading
tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java +75 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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"; Loading @@ -66,6 +72,8 @@ public class SubscriptionsPreferenceControllerTest { private PreferenceCategory mPreferenceCategory; @Mock private SubscriptionManager mSubscriptionManager; @Mock private TelephonyManager mTelephonyManager; private Context mContext; private LifecycleOwner mLifecycleOwner; Loading @@ -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; Loading Loading @@ -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)); } }