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.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.ArraySet;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@@ -76,16 +78,21 @@ public class DataUsageLib {
} }
private static NetworkTemplate normalizeMobileTemplate( private static NetworkTemplate normalizeMobileTemplate(
@NonNull NetworkTemplate template, @NonNull String[] mergedSet) { @NonNull NetworkTemplate template, @NonNull String[] merged) {
if (template.getSubscriberIds().isEmpty()) return template; if (template.getSubscriberIds().isEmpty()) return template;
// The input template should have at most 1 subscriberId. // The input template should have at most 1 subscriberId.
final String subscriberId = template.getSubscriberIds().iterator().next(); final String subscriberId = template.getSubscriberIds().iterator().next();
// In some rare cases (e.g. b/243015487), merged subscriberId list might contain
if (Set.of(mergedSet).contains(subscriberId)) { // 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 // Requested template subscriber is part of the merge group; return
// a template that matches all merged subscribers. // a template that matches all merged subscribers.
return new NetworkTemplate.Builder(template.getMatchRule()) return new NetworkTemplate.Builder(template.getMatchRule())
.setSubscriberIds(Set.of(mergedSet)) .setSubscriberIds(mergedSet)
.setMeteredness(template.getMeteredness()).build(); .setMeteredness(template.getMeteredness()).build();
} }

View File

@@ -103,11 +103,14 @@ public class DataUsageLibTest {
public void getMobileTemplate_groupUuidExist_returnMobileMerged() { public void getMobileTemplate_groupUuidExist_returnMobileMerged() {
when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1); when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1);
when(mInfo1.getGroupUuid()).thenReturn(mParcelUuid); 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()) 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); final NetworkTemplate networkTemplate = DataUsageLib.getMobileTemplate(mContext, SUB_ID);
assertThat(networkTemplate.getSubscriberIds().contains(SUBSCRIBER_ID)).isTrue(); assertThat(networkTemplate.getSubscriberIds().contains(SUBSCRIBER_ID)).isTrue();
assertThat(networkTemplate.getSubscriberIds().contains(SUBSCRIBER_ID_2)).isTrue(); assertThat(networkTemplate.getSubscriberIds().contains(SUBSCRIBER_ID_2)).isTrue();
assertThat(networkTemplate.getSubscriberIds().size() == 2).isTrue();
} }
} }