Merge "Do not crash when duplication found in merged imsi list" am: ae267bae74

Original change: https://android-review.googlesource.com/c/platform/packages/apps/Settings/+/2479336

Change-Id: I3e55fc5496918d8e2d0c230df74b62e1e6847fb6
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/src/com/android/settings/datausage/lib/DataUsageLib.java b/src/com/android/settings/datausage/lib/DataUsageLib.java
index 1ca5eff..b3f7e79 100644
--- a/src/com/android/settings/datausage/lib/DataUsageLib.java
+++ b/src/com/android/settings/datausage/lib/DataUsageLib.java
@@ -22,12 +22,14 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.util.ArraySet;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
 
 import com.android.internal.util.ArrayUtils;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
@@ -76,16 +78,21 @@
     }
 
     private static NetworkTemplate normalizeMobileTemplate(
-            @NonNull NetworkTemplate template, @NonNull String[] mergedSet) {
+            @NonNull NetworkTemplate template, @NonNull String[] merged) {
         if (template.getSubscriberIds().isEmpty()) return template;
         // The input template should have at most 1 subscriberId.
         final String subscriberId = template.getSubscriberIds().iterator().next();
-
-        if (Set.of(mergedSet).contains(subscriberId)) {
+        // In some rare cases (e.g. b/243015487), merged subscriberId list might contain
+        // duplicated items. Deduplication for better error handling.
+        final ArraySet mergedSet = new ArraySet(merged);
+        if (mergedSet.size() != merged.length) {
+            Log.wtf(TAG, "Duplicated merged list detected: " + Arrays.toString(merged));
+        }
+        if (mergedSet.contains(subscriberId)) {
             // Requested template subscriber is part of the merge group; return
             // a template that matches all merged subscribers.
             return new NetworkTemplate.Builder(template.getMatchRule())
-                    .setSubscriberIds(Set.of(mergedSet))
+                    .setSubscriberIds(mergedSet)
                     .setMeteredness(template.getMeteredness()).build();
         }
 
diff --git a/tests/robotests/src/com/android/settings/datausage/lib/DataUsageLibTest.java b/tests/robotests/src/com/android/settings/datausage/lib/DataUsageLibTest.java
index 4391425..fccef4f 100644
--- a/tests/robotests/src/com/android/settings/datausage/lib/DataUsageLibTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/lib/DataUsageLibTest.java
@@ -103,11 +103,14 @@
     public void getMobileTemplate_groupUuidExist_returnMobileMerged() {
         when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1);
         when(mInfo1.getGroupUuid()).thenReturn(mParcelUuid);
+        // In some rare cases (e.g. b/243015487), merged subscriberId list might contain
+        // duplicated items. The implementation should perform deduplication.
         when(mTelephonyManager.getMergedImsisFromGroup())
-                .thenReturn(new String[] {SUBSCRIBER_ID, SUBSCRIBER_ID_2});
+                .thenReturn(new String[] {SUBSCRIBER_ID, SUBSCRIBER_ID, SUBSCRIBER_ID_2});
 
         final NetworkTemplate networkTemplate = DataUsageLib.getMobileTemplate(mContext, SUB_ID);
         assertThat(networkTemplate.getSubscriberIds().contains(SUBSCRIBER_ID)).isTrue();
         assertThat(networkTemplate.getSubscriberIds().contains(SUBSCRIBER_ID_2)).isTrue();
+        assertThat(networkTemplate.getSubscriberIds().size() == 2).isTrue();
     }
 }