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

Commit 8005bc8f authored by Junyu Lai's avatar Junyu Lai
Browse files

Do not crash when duplication found in merged imsi list

For some unknown reason, the merged imsi list might contain
duplicated items. Deduplication for better error handling.

Test: make RunSettingsRoboTests
Fix: 271298466
Change-Id: I3cbe8f9441769963a16720fc5128db173fa0868b
parent 5bb798f5
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();
    }
}