From ed5c2a1b100cb5589872871422cff9dc79faa23a Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Fri, 5 Apr 2019 09:55:12 -0700 Subject: [PATCH] Don't allow CBRS subscriptions to be set as default for Calls/SMS CBRS subscriptions (also known as "opportunistic" in the code base) are data-only and it should not be possible to try to set them as the default for Calls or SMS. Fixes: 125855327 Test: make RunSettingsRoboTests Change-Id: Ie20ef21ccc7b27315089f6a61cceb6e1512ec373 --- .../DefaultSubscriptionController.java | 25 +++++++++-------- .../DefaultSubscriptionControllerTest.java | 28 +++++++++++++++++++ 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java index bca6750ca7b..e982a6ba2db 100644 --- a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java +++ b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java @@ -28,6 +28,7 @@ import com.android.settings.core.BasePreferenceController; import com.android.settings.network.SubscriptionUtil; import com.android.settings.network.SubscriptionsChangeListener; +import java.util.ArrayList; import java.util.List; import androidx.lifecycle.Lifecycle; @@ -124,27 +125,29 @@ public abstract class DefaultSubscriptionController extends BasePreferenceContro // We'll have one entry for each available subscription, plus one for a "ask me every // time" entry at the end. - final CharSequence[] displayNames = new CharSequence[subs.size() + 1]; - final CharSequence[] subscriptionIds = new CharSequence[subs.size() + 1]; + final ArrayList displayNames = new ArrayList<>(); + final ArrayList subscriptionIds = new ArrayList<>(); final int serviceDefaultSubId = getDefaultSubscriptionId(); boolean subIsAvailable = false; - int i = 0; - for (; i < subs.size(); i++) { - displayNames[i] = subs.get(i).getDisplayName(); - final int subId = subs.get(i).getSubscriptionId(); - subscriptionIds[i] = Integer.toString(subId); + for (SubscriptionInfo sub : subs) { + if (sub.isOpportunistic()) { + continue; + } + displayNames.add(sub.getDisplayName()); + final int subId = sub.getSubscriptionId(); + subscriptionIds.add(Integer.toString(subId)); if (subId == serviceDefaultSubId) { subIsAvailable = true; } } // Add the extra "Ask every time" value at the end. - displayNames[i] = mContext.getString(R.string.calls_and_sms_ask_every_time); - subscriptionIds[i] = Integer.toString(SubscriptionManager.INVALID_SUBSCRIPTION_ID); + displayNames.add(mContext.getString(R.string.calls_and_sms_ask_every_time)); + subscriptionIds.add(Integer.toString(SubscriptionManager.INVALID_SUBSCRIPTION_ID)); - mPreference.setEntries(displayNames); - mPreference.setEntryValues(subscriptionIds); + mPreference.setEntries(displayNames.toArray(new CharSequence[0])); + mPreference.setEntryValues(subscriptionIds.toArray(new CharSequence[0])); if (subIsAvailable) { mPreference.setValue(Integer.toString(serviceDefaultSubId)); diff --git a/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java index f7a2567dbf1..e503d70599d 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java @@ -147,6 +147,34 @@ public class DefaultSubscriptionControllerTest { Integer.toString(SubscriptionManager.INVALID_SUBSCRIPTION_ID)); } + @Test + public void displayPreference_threeSubsOneIsOpportunistic_correctListPreferenceValues() { + final SubscriptionInfo sub1 = createMockSub(111, "sub1"); + final SubscriptionInfo sub2 = createMockSub(222, "sub2"); + final SubscriptionInfo sub3 = createMockSub(333, "sub3"); + + // Mark sub2 as opportunistic; then it should not appear in the list of entries/entryValues. + when(sub2.isOpportunistic()).thenReturn(true); + + SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2, sub3)); + doReturn(sub1.getSubscriptionId()).when(mController).getDefaultSubscriptionId(); + + mController.displayPreference(mScreen); + + final CharSequence[] entries = mListPreference.getEntries(); + assertThat(entries.length).isEqualTo(3); + assertThat(entries[0]).isEqualTo("sub1"); + assertThat(entries[1]).isEqualTo("sub3"); + assertThat(entries[2]).isEqualTo(mContext.getString(R.string.calls_and_sms_ask_every_time)); + + final CharSequence[] entryValues = mListPreference.getEntryValues(); + assertThat(entryValues.length).isEqualTo(3); + assertThat(entryValues[0]).isEqualTo("111"); + assertThat(entryValues[1]).isEqualTo("333"); + assertThat(entryValues[2]).isEqualTo( + Integer.toString(SubscriptionManager.INVALID_SUBSCRIPTION_ID)); + } + @Test public void onPreferenceChange_prefChangedToSub2_callbackCalledCorrectly() { final SubscriptionInfo sub1 = createMockSub(111, "sub1");