diff options
3 files changed, 182 insertions, 7 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java index f30de130f616..ea3c1d95925c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java +++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java @@ -110,13 +110,7 @@ public class DataUsageController { } public DataUsageInfo getDataUsageInfo() { - final String subscriberId = getActiveSubscriberId(); - if (subscriberId == null) { - return warn("no subscriber id"); - } - NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriberId); - template = NetworkTemplate.normalize(template, getTelephonyManager() - .getMergedSubscriberIds()); + NetworkTemplate template = DataUsageUtils.getMobileTemplate(mContext, mSubscriptionId); return getDataUsageInfo(template); } diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java new file mode 100644 index 000000000000..de38e8a366b4 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.net; + +import android.content.Context; +import android.net.NetworkTemplate; +import android.os.ParcelUuid; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.util.Log; + +import java.util.ArrayList; +import java.util.List; + +/** + * Utils class for data usage + */ +public class DataUsageUtils { + private static final String TAG = "DataUsageUtils"; + + /** + * Return mobile NetworkTemplate based on {@code subId} + */ + public static NetworkTemplate getMobileTemplate(Context context, int subId) { + final TelephonyManager telephonyManager = context.getSystemService( + TelephonyManager.class); + final SubscriptionManager subscriptionManager = context.getSystemService( + SubscriptionManager.class); + final SubscriptionInfo info = subscriptionManager.getActiveSubscriptionInfo(subId); + final NetworkTemplate mobileAll = NetworkTemplate.buildTemplateMobileAll( + telephonyManager.getSubscriberId(subId)); + + if (info == null) { + Log.i(TAG, "Subscription is not active: " + subId); + return mobileAll; + } + final ParcelUuid groupUuid = info.getGroupUuid(); + if (groupUuid == null) { + Log.i(TAG, "Subscription doesn't have valid group uuid: " + subId); + return mobileAll; + } + + // Otherwise merge other subscriberId to create new NetworkTemplate + final List<SubscriptionInfo> groupInfos = subscriptionManager.getSubscriptionsInGroup( + groupUuid); + final List<String> mergedSubscriberIds = new ArrayList<>(); + for (SubscriptionInfo subInfo : groupInfos) { + final String subscriberId = telephonyManager.getSubscriberId( + subInfo.getSubscriptionId()); + if (subscriberId != null) { + mergedSubscriberIds.add(subscriberId); + } + } + return NetworkTemplate.normalize(mobileAll, mergedSubscriberIds.toArray(new String[0])); + } +} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java new file mode 100644 index 000000000000..dc33cfe4b2f8 --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.net; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.net.NetworkTemplate; +import android.os.ParcelUuid; +import android.os.RemoteException; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(RobolectricTestRunner.class) +public class DataUsageUtilsTest { + + private static final int SUB_ID = 1; + private static final int SUB_ID_2 = 2; + private static final String SUBSCRIBER_ID = "Test Subscriber"; + private static final String SUBSCRIBER_ID_2 = "Test Subscriber 2"; + + @Mock + private TelephonyManager mTelephonyManager; + @Mock + private SubscriptionManager mSubscriptionManager; + @Mock + private SubscriptionInfo mInfo1; + @Mock + private SubscriptionInfo mInfo2; + @Mock + private ParcelUuid mParcelUuid; + private Context mContext; + private List<SubscriptionInfo> mInfos; + + @Before + public void setUp() throws RemoteException { + MockitoAnnotations.initMocks(this); + + mContext = spy(RuntimeEnvironment.application); + when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); + when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); + when(mTelephonyManager.getSubscriberId(SUB_ID)).thenReturn(SUBSCRIBER_ID); + when(mTelephonyManager.getSubscriberId(SUB_ID_2)).thenReturn(SUBSCRIBER_ID_2); + when(mInfo1.getSubscriptionId()).thenReturn(SUB_ID); + when(mInfo2.getSubscriptionId()).thenReturn(SUB_ID_2); + + mInfos = new ArrayList<>(); + mInfos.add(mInfo1); + mInfos.add(mInfo2); + when(mSubscriptionManager.getSubscriptionsInGroup(mParcelUuid)).thenReturn(mInfos); + } + + @Test + public void getMobileTemplate_infoNull_returnMobileAll() { + when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(null); + + final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); + assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); + assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID_2)).isFalse(); + } + + @Test + public void getMobileTemplate_groupUuidNull_returnMobileAll() { + when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1); + when(mInfo1.getGroupUuid()).thenReturn(null); + + final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); + assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); + assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID_2)).isFalse(); + } + + @Test + public void getMobileTemplate_groupUuidExist_returnMobileMerged() { + when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1); + when(mInfo1.getGroupUuid()).thenReturn(mParcelUuid); + + final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); + assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); + assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID_2)).isTrue(); + } +} |