Snap for 6727488 from 97aad7834e02cd473a003a60689ccfb822f66245 to rvc-qpr1-release

Change-Id: I8c68e77b87a93644b840771f375479aa4edf21e0
diff --git a/src/com/android/mms/service/MmsService.java b/src/com/android/mms/service/MmsService.java
index 277f0b7..eb0fd88 100644
--- a/src/com/android/mms/service/MmsService.java
+++ b/src/com/android/mms/service/MmsService.java
@@ -42,6 +42,7 @@
 import android.security.NetworkSecurityPolicy;
 import android.service.carrier.CarrierMessagingService;
 import android.telephony.SmsManager;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.telephony.data.ApnSetting;
@@ -63,7 +64,10 @@
 
 import java.io.IOException;
 import java.util.ArrayDeque;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Queue;
 import java.util.concurrent.Callable;
@@ -71,6 +75,8 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * System service to process MMS API requests
@@ -253,6 +259,24 @@
                 subId = SubscriptionManager.getDefaultSmsSubscriptionId();
             }
 
+            if (!isActiveSubId(subId)) {
+                List<SubscriptionInfo> activeSubList = getActiveSubscriptionsInGroup(subId);
+                if (activeSubList.isEmpty()) {
+                    sendErrorInPendingIntent(downloadedIntent);
+                    return;
+                }
+
+                subId = activeSubList.get(0).getSubscriptionId();
+                int defaultSmsSubId = SubscriptionManager.getDefaultSmsSubscriptionId();
+                // If we have default sms subscription, prefer to use that. Otherwise, use first
+                // subscription
+                for (SubscriptionInfo subInfo : activeSubList) {
+                    if (subInfo.getSubscriptionId() == defaultSmsSubId) {
+                        subId = subInfo.getSubscriptionId();
+                    }
+                }
+            }
+
             final DownloadRequest request = new DownloadRequest(MmsService.this, subId, locationUrl,
                     contentUri, downloadedIntent, callingPkg, configOverrides, MmsService.this,
                     messageId);
@@ -276,6 +300,48 @@
             addSimRequest(request);
         }
 
+        private List<SubscriptionInfo> getActiveSubscriptionsInGroup(int subId) {
+            SubscriptionManager subManager =
+                    (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+
+            if (subManager == null) {
+                return Collections.emptyList();
+            }
+
+            List<SubscriptionInfo> subList = subManager.getAvailableSubscriptionInfoList();
+
+            if (subList == null) {
+                return Collections.emptyList();
+            }
+
+            SubscriptionInfo subscriptionInfo = null;
+            for (SubscriptionInfo subInfo : subList) {
+                if (subInfo.getSubscriptionId() == subId) {
+                    subscriptionInfo = subInfo;
+                    break;
+                }
+            }
+
+            if (subscriptionInfo == null) {
+                return Collections.emptyList();
+            }
+
+            if (subscriptionInfo.getGroupUuid() == null) {
+                return Collections.emptyList();
+            }
+
+            List<SubscriptionInfo> subscriptionInGroupList =
+                    subManager.getSubscriptionsInGroup(subscriptionInfo.getGroupUuid());
+
+            // the list is sorted by isOpportunistic and isOpportunistic == false will have higher
+            // priority
+            return subscriptionInGroupList.stream()
+                    .filter(info ->
+                            info.getSimSlotIndex() != SubscriptionManager.INVALID_SIM_SLOT_INDEX)
+                    .sorted(Comparator.comparing(SubscriptionInfo::isOpportunistic))
+                    .collect(Collectors.toList());
+        }
+
         @Override
         public Uri importTextMessage(String callingPkg, String address, int type, String text,
                 long timestampMillis, boolean seen, boolean read) {