diff --git a/src/com/android/settings/datausage/lib/DataUsageLib.java b/src/com/android/settings/datausage/lib/DataUsageLib.java index 1ca5eff40f9..b3f7e79bf46 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.net.NetworkTemplate; 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 @@ public class DataUsageLib { } 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 4391425d2ba..fccef4f1465 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 class DataUsageLibTest { 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(); } }