Provide @hide API to return merged IMSIs from grouping.
Bug: 135105735
Test: test app. Apply grouping and call the new API, to make sure
it returns correct values.
Change-Id: I99586976d3421d4b35be465201ee33cbb2dfd1d9
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java
index b15ea98..23e29493 100644
--- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java
@@ -18,11 +18,11 @@
import android.content.Context;
import android.net.NetworkTemplate;
-import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
+import com.android.internal.util.ArrayUtils;
/**
* Utils class for data usage
*/
@@ -34,19 +34,25 @@
*/
public static NetworkTemplate getMobileTemplate(Context context, int subId) {
final TelephonyManager telephonyManager = context.getSystemService(
- TelephonyManager.class).createForSubscriptionId(subId);
+ 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) {
+ if (!subscriptionManager.isActiveSubId(subId)) {
Log.i(TAG, "Subscription is not active: " + subId);
return mobileAll;
}
- // Use old API to build networkTemplate
- return NetworkTemplate.normalize(mobileAll, telephonyManager.getMergedSubscriberIds());
+ final String[] mergedSubscriberIds = telephonyManager.createForSubscriptionId(subId)
+ .getMergedSubscriberIdsFromGroup();
+
+ if (ArrayUtils.isEmpty(mergedSubscriberIds)) {
+ Log.i(TAG, "mergedSubscriberIds is null.");
+ return mobileAll;
+ }
+
+ return NetworkTemplate.normalize(mobileAll, mergedSubscriberIds);
}
}
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
index 821c0b3..5cae611 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
@@ -37,13 +38,13 @@
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";
@@ -66,21 +67,16 @@
mContext = spy(RuntimeEnvironment.application);
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
- when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
when(mTelephonyManager.getSubscriberId(SUB_ID)).thenReturn(SUBSCRIBER_ID);
- when(mTelephonyManager.getMergedSubscriberIds()).thenReturn(
- new String[]{SUBSCRIBER_ID, SUBSCRIBER_ID_2});
-
- mInfos = new ArrayList<>();
- mInfos.add(mInfo1);
- mInfos.add(mInfo2);
- when(mSubscriptionManager.getSubscriptionsInGroup(mParcelUuid)).thenReturn(mInfos);
+ when(mTelephonyManager.getSubscriberId(SUB_ID_2)).thenReturn(SUBSCRIBER_ID_2);
+ when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
+ when(mSubscriptionManager.isActiveSubId(anyInt())).thenReturn(true);
}
@Test
public void getMobileTemplate_infoNull_returnMobileAll() {
- when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(null);
+ when(mSubscriptionManager.isActiveSubId(SUB_ID)).thenReturn(false);
final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID);
assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue();
@@ -88,9 +84,23 @@
}
@Test
- public void getMobileTemplate_infoExisted_returnMobileMerged() {
+ public void getMobileTemplate_groupUuidNull_returnMobileAll() {
+ when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1);
+ when(mInfo1.getGroupUuid()).thenReturn(null);
+ when(mTelephonyManager.getMergedSubscriberIdsFromGroup())
+ .thenReturn(new String[] {SUBSCRIBER_ID});
+
+ 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);
+ when(mTelephonyManager.getMergedSubscriberIdsFromGroup())
+ .thenReturn(new String[] {SUBSCRIBER_ID, SUBSCRIBER_ID_2});
final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID);
assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue();
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 758cd28..2708766 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -3972,9 +3972,14 @@
* The returned set of subscriber IDs will include the subscriber ID corresponding to this
* TelephonyManager's subId.
*
+ * This is deprecated and {@link #getMergedSubscriberIdsFromGroup()} should be used for data
+ * usage merging purpose.
+ * TODO: remove this API.
+ *
* @hide
*/
@UnsupportedAppUsage
+ @Deprecated
public @Nullable String[] getMergedSubscriberIds() {
try {
ITelephony telephony = getITelephony();
@@ -3987,6 +3992,28 @@
}
/**
+ * Return the set of subscriber IDs that should be considered "merged together" for data usage
+ * purposes. Unlike {@link #getMergedSubscriberIds()} this API merge subscriberIds based on
+ * subscription grouping: subscriberId of those in the same group will all be returned.
+ *
+ * <p>Requires the calling app to have READ_PRIVILEGED_PHONE_STATE permission.
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ public @Nullable String[] getMergedSubscriberIdsFromGroup() {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ return telephony.getMergedSubscriberIdsFromGroup(getSubId(), getOpPackageName());
+ }
+ } catch (RemoteException ex) {
+ } catch (NullPointerException ex) {
+ }
+ return null;
+ }
+
+ /**
* Returns the MSISDN string.
* for a GSM phone. Return null if it is unavailable.
*
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 5a27a0f..7112ac1 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1059,6 +1059,11 @@
String[] getMergedSubscriberIds(int subId, String callingPackage);
/**
+ * @hide
+ */
+ String[] getMergedSubscriberIdsFromGroup(int subId, String callingPackage);
+
+ /**
* Override the operator branding for the current ICCID.
*
* Once set, whenever the SIM is present in the device, the service