Allow addSubscriptionsIntoGroup with grouUuid that isn't assigned.
If a caller calls addSubscriptionsIntoGroup with a groupUuid that isn't
assigned to any subscription, we allow it. So that they don't have to
call createSubscriptionGroup if they already have a UUID value they
want to set.
Bug: 133776718
Test: manual & unittest
Change-Id: If7d9fd695fefd26722e74db98d34cd85a9333365
diff --git a/src/java/com/android/internal/telephony/SubscriptionController.java b/src/java/com/android/internal/telephony/SubscriptionController.java
index f97e8f3..3fb9220 100644
--- a/src/java/com/android/internal/telephony/SubscriptionController.java
+++ b/src/java/com/android/internal/telephony/SubscriptionController.java
@@ -3085,12 +3085,6 @@
throw new IllegalArgumentException("Invalid groupUuid");
}
- // TODO: Revisit whether we need this restriction in R. There's no technical need for it,
- // but we don't want to change the API behavior at this time.
- if (getSubscriptionsInGroup(groupUuid, callingPackage).isEmpty()) {
- throw new IllegalArgumentException("Cannot add subscriptions to a non-existent group!");
- }
-
// Makes sure calling package matches caller UID.
mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
// If it doesn't have modify phone state permission, or carrier privilege permission,
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java
index 89bc54a..298f3bc 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java
@@ -60,6 +60,7 @@
import java.util.Comparator;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
public class SubscriptionControllerTest extends TelephonyTest {
private static final int SINGLE_SIM = 1;
@@ -732,6 +733,57 @@
@Test
@SmallTest
+ public void testAddSubscriptionIntoGroupWithCarrierPrivilegePermission() throws Exception {
+ testInsertSim();
+ // Adding a second profile and mark as embedded.
+ // TODO b/123300875 slot index 1 is not expected to be valid
+ mSubscriptionControllerUT.addSubInfoRecord("test2", 1);
+ ContentValues values = new ContentValues();
+ values.put(SubscriptionManager.IS_EMBEDDED, 1);
+ mFakeTelephonyProvider.update(SubscriptionManager.CONTENT_URI, values,
+ SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + 2, null);
+ mSubscriptionControllerUT.refreshCachedActiveSubscriptionInfoList();
+
+ mContextFixture.removeCallingOrSelfPermission(ContextFixture.PERMISSION_ENABLE_ALL);
+ mContextFixture.addCallingOrSelfPermission(Manifest.permission.READ_PHONE_STATE);
+
+ // Create group for sub 1.
+ int[] subIdList = new int[] {1};
+ doReturn(true).when(mTelephonyManager).hasCarrierPrivileges(1);
+ ParcelUuid groupId = mSubscriptionControllerUT.createSubscriptionGroup(
+ subIdList, "packageName1");
+
+ // Try to add sub 2 into group of sub 1.
+ // Should fail as it doesn't have carrier privilege on sub 2.
+ try {
+ mSubscriptionControllerUT.addSubscriptionsIntoGroup(
+ new int[] {2}, groupId, "packageName1");
+ fail("addSubscriptionsIntoGroup should fail with no permission on sub 2.");
+ } catch (SecurityException e) {
+ // Expected result.
+ }
+
+ doReturn(false).when(mTelephonyManager).hasCarrierPrivileges(1);
+ doReturn(true).when(mTelephonyManager).hasCarrierPrivileges(2);
+ // Try to add sub 2 into group of sub 1.
+ // Should fail as it doesn't have carrier privilege on sub 1.
+ try {
+ mSubscriptionControllerUT.addSubscriptionsIntoGroup(
+ new int[] {2}, groupId, "packageName2");
+ fail("addSubscriptionsIntoGroup should fail with no permission on the group (sub 1).");
+ } catch (SecurityException e) {
+ // Expected result.
+ }
+
+ doReturn(true).when(mTelephonyManager).hasCarrierPrivileges(1);
+ mSubscriptionControllerUT.addSubscriptionsIntoGroup(new int[] {2}, groupId, "packageName2");
+ List<SubscriptionInfo> infoList = mSubscriptionControllerUT
+ .getSubscriptionsInGroup(groupId, "packageName2");
+ assertEquals(2, infoList.size());
+ }
+
+ @Test
+ @SmallTest
public void testUpdateSubscriptionGroupWithCarrierPrivilegePermission() throws Exception {
testInsertSim();
// Adding a second profile and mark as embedded.
@@ -896,6 +948,15 @@
.getSubscriptionsInGroup(groupUuid, mContext.getOpPackageName());
assertEquals(1, infoList.size());
assertEquals(2, infoList.get(0).getSubscriptionId());
+
+ // Adding sub 1 into a non-existing UUID, which should be granted.
+ groupUuid = new ParcelUuid(UUID.randomUUID());
+ mSubscriptionControllerUT.addSubscriptionsIntoGroup(
+ subIdList, groupUuid, mContext.getOpPackageName());
+ infoList = mSubscriptionControllerUT
+ .getSubscriptionsInGroup(groupUuid, mContext.getOpPackageName());
+ assertEquals(1, infoList.size());
+ assertEquals(1, infoList.get(0).getSubscriptionId());
}
private void registerMockTelephonyRegistry() {