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
This commit is contained in:
Junyu Lai
2023-03-09 13:57:19 +08:00
parent 5bb798f518
commit 8005bc8f5b
2 changed files with 15 additions and 5 deletions

View File

@@ -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();
}

View File

@@ -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();
}
}