OSDN Git Service

Only return one mobile subscription per group in Settings.
authorMalcolm Chen <refuhoo@google.com>
Wed, 27 Feb 2019 00:48:40 +0000 (16:48 -0800)
committerXiangyu/Malcolm Chen <refuhoo@google.com>
Wed, 13 Mar 2019 04:14:07 +0000 (04:14 +0000)
Right now getSelectableSubscriptionInfoList returns all subscriptions
that are visible and available. But we should only show one per
subscription group. So updating getSelectableSubscriptionInfoList
to make sure of it.

Bug: 126438122
Test: manual - group Fi primary subscriptions and make sure only
one Fi subscription is shown in Settings UI.
Change-Id: I867296b4f8efbdf2e9885ef34dd45806fa0abbca
Merged-In: I867296b4f8efbdf2e9885ef34dd45806fa0abbca

telephony/java/android/telephony/SubscriptionManager.java

index 1301246..1662d6e 100644 (file)
@@ -69,8 +69,10 @@ import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
@@ -2908,8 +2910,33 @@ public class SubscriptionManager {
         if (availableList == null) {
             return null;
         } else {
-            return availableList.stream().filter(subInfo -> !shouldHideSubscription(subInfo))
-                    .collect(Collectors.toList());
+            // Multiple subscriptions in a group should only have one representative.
+            // It should be the current active primary subscription if any, or any
+            // primary subscription.
+            List<SubscriptionInfo> selectableList = new ArrayList<>();
+            Map<String, SubscriptionInfo> groupMap = new HashMap<>();
+
+            for (SubscriptionInfo info : availableList) {
+                // Opportunistic subscriptions are considered invisible
+                // to users so they should never be returned.
+                if (isInvisibleSubscription(info)) continue;
+
+                String groupUuid = info.getGroupUuid();
+                if (groupUuid == null) {
+                    // Doesn't belong to any group. Add in the list.
+                    selectableList.add(info);
+                } else if (!groupMap.containsKey(groupUuid)
+                        || (groupMap.get(groupUuid).getSimSlotIndex() == INVALID_SIM_SLOT_INDEX
+                        && info.getSimSlotIndex() != INVALID_SIM_SLOT_INDEX)) {
+                    // If it belongs to a group that has never been recorded or it's the current
+                    // active subscription, add it in the list.
+                    selectableList.remove(groupMap.get(groupUuid));
+                    selectableList.add(info);
+                    groupMap.put(groupUuid, info);
+                }
+
+            }
+            return selectableList;
         }
     }