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
diff --git a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
index bca6750..e982a6b 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.network.SubscriptionUtil;
import com.android.settings.network.SubscriptionsChangeListener;
+import java.util.ArrayList;
import java.util.List;
import androidx.lifecycle.Lifecycle;
@@ -124,27 +125,29 @@
// 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<CharSequence> displayNames = new ArrayList<>();
+ final ArrayList<CharSequence> 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 f7a2567..e503d70 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java
@@ -148,6 +148,34 @@
}
@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");
final SubscriptionInfo sub2 = createMockSub(222, "sub2");