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:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user