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");
