Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae267bae authored by Junyu Lai's avatar Junyu Lai Committed by Gerrit Code Review
Browse files

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

parents 905d584b 8005bc8f
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -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();
        }

+4 −1
Original line number Diff line number Diff line
@@ -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();
    }
}