diff options
| -rw-r--r-- | api/current.txt | 4 | ||||
| -rw-r--r-- | api/removed.txt | 1 | ||||
| -rw-r--r-- | api/system-current.txt | 4 | ||||
| -rw-r--r-- | api/system-removed.txt | 1 | ||||
| -rw-r--r-- | api/test-current.txt | 4 | ||||
| -rw-r--r-- | api/test-removed.txt | 1 | ||||
| -rw-r--r-- | core/java/android/app/admin/DevicePolicyManager.java | 35 | ||||
| -rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java | 16 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java | 16 |
9 files changed, 53 insertions, 29 deletions
diff --git a/api/current.txt b/api/current.txt index b1ff0ddb01de..c108729bf27d 100644 --- a/api/current.txt +++ b/api/current.txt @@ -6287,7 +6287,7 @@ package android.app.admin { method public int enableSystemApp(android.content.ComponentName, android.content.Intent); method public java.lang.String[] getAccountTypesWithManagementDisabled(); method public java.util.List<android.content.ComponentName> getActiveAdmins(); - method public java.util.List<java.lang.String> getAffiliationIds(android.content.ComponentName); + method public java.util.Set<java.lang.String> getAffiliationIds(android.content.ComponentName); method public java.lang.String getAlwaysOnVpnPackage(android.content.ComponentName); method public android.os.Bundle getApplicationRestrictions(android.content.ComponentName, java.lang.String); method public deprecated java.lang.String getApplicationRestrictionsManagingPackage(android.content.ComponentName); @@ -6373,7 +6373,7 @@ package android.app.admin { method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrievePreRebootSecurityLogs(android.content.ComponentName); method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(android.content.ComponentName); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); - method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>); + method public void setAffiliationIds(android.content.ComponentName, java.util.Set<java.lang.String>); method public void setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String, boolean) throws android.content.pm.PackageManager.NameNotFoundException, java.lang.UnsupportedOperationException; method public boolean setApplicationHidden(android.content.ComponentName, java.lang.String, boolean); method public void setApplicationRestrictions(android.content.ComponentName, java.lang.String, android.os.Bundle); diff --git a/api/removed.txt b/api/removed.txt index dc9c54e8b1cd..f1ce247ae4cc 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -18,6 +18,7 @@ package android.app.admin { method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String); method public deprecated java.lang.String getDeviceInitializerApp(); method public deprecated android.content.ComponentName getDeviceInitializerComponent(); + method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>); } } diff --git a/api/system-current.txt b/api/system-current.txt index 8a4b335f89c7..f3fc024e1f05 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6498,7 +6498,7 @@ package android.app.admin { method public int enableSystemApp(android.content.ComponentName, android.content.Intent); method public java.lang.String[] getAccountTypesWithManagementDisabled(); method public java.util.List<android.content.ComponentName> getActiveAdmins(); - method public java.util.List<java.lang.String> getAffiliationIds(android.content.ComponentName); + method public java.util.Set<java.lang.String> getAffiliationIds(android.content.ComponentName); method public java.lang.String getAlwaysOnVpnPackage(android.content.ComponentName); method public android.os.Bundle getApplicationRestrictions(android.content.ComponentName, java.lang.String); method public deprecated java.lang.String getApplicationRestrictionsManagingPackage(android.content.ComponentName); @@ -6602,7 +6602,7 @@ package android.app.admin { method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(android.content.ComponentName); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); method public deprecated boolean setActiveProfileOwner(android.content.ComponentName, java.lang.String) throws java.lang.IllegalArgumentException; - method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>); + method public void setAffiliationIds(android.content.ComponentName, java.util.Set<java.lang.String>); method public void setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String, boolean) throws android.content.pm.PackageManager.NameNotFoundException, java.lang.UnsupportedOperationException; method public boolean setApplicationHidden(android.content.ComponentName, java.lang.String, boolean); method public void setApplicationRestrictions(android.content.ComponentName, java.lang.String, android.os.Bundle); diff --git a/api/system-removed.txt b/api/system-removed.txt index 4862bb76f0c2..9128df6742ae 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -16,6 +16,7 @@ package android.app.admin { public class DevicePolicyManager { method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle); method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String); + method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>); } } diff --git a/api/test-current.txt b/api/test-current.txt index e784e72d9c9a..abdb59a790f8 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -6307,7 +6307,7 @@ package android.app.admin { method public int enableSystemApp(android.content.ComponentName, android.content.Intent); method public java.lang.String[] getAccountTypesWithManagementDisabled(); method public java.util.List<android.content.ComponentName> getActiveAdmins(); - method public java.util.List<java.lang.String> getAffiliationIds(android.content.ComponentName); + method public java.util.Set<java.lang.String> getAffiliationIds(android.content.ComponentName); method public java.lang.String getAlwaysOnVpnPackage(android.content.ComponentName); method public android.os.Bundle getApplicationRestrictions(android.content.ComponentName, java.lang.String); method public deprecated java.lang.String getApplicationRestrictionsManagingPackage(android.content.ComponentName); @@ -6400,7 +6400,7 @@ package android.app.admin { method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrievePreRebootSecurityLogs(android.content.ComponentName); method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(android.content.ComponentName); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); - method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>); + method public void setAffiliationIds(android.content.ComponentName, java.util.Set<java.lang.String>); method public void setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String, boolean) throws android.content.pm.PackageManager.NameNotFoundException, java.lang.UnsupportedOperationException; method public boolean setApplicationHidden(android.content.ComponentName, java.lang.String, boolean); method public void setApplicationRestrictions(android.content.ComponentName, java.lang.String, android.os.Bundle); diff --git a/api/test-removed.txt b/api/test-removed.txt index dc9c54e8b1cd..f1ce247ae4cc 100644 --- a/api/test-removed.txt +++ b/api/test-removed.txt @@ -18,6 +18,7 @@ package android.app.admin { method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String); method public deprecated java.lang.String getDeviceInitializerApp(); method public deprecated android.content.ComponentName getDeviceInitializerComponent(); + method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>); } } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 82ad8252c5a9..bb3b4a4625fc 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -56,6 +56,7 @@ import android.provider.Settings; import android.security.Credentials; import android.service.restrictions.RestrictionsReceiver; import android.telephony.TelephonyManager; +import android.util.ArraySet; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; @@ -80,6 +81,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Set; /** * Public interface for managing policies enforced on a device. Most clients of this class must be @@ -7507,13 +7509,31 @@ public class DevicePolicyManager { * created. * * @param admin Which profile or device owner this request is associated with. - * @param ids A list of opaque non-empty affiliation ids. Duplicate elements will be ignored. + * @param ids A set of opaque non-empty affiliation ids. * - * @throws NullPointerException if {@code ids} is null or contains null elements. - * @throws IllegalArgumentException if {@code ids} contains an empty string. + * @throws IllegalArgumentException if {@code ids} is null or contains an empty string. + */ + public void setAffiliationIds(@NonNull ComponentName admin, @NonNull Set<String> ids) { + throwIfParentInstance("setAffiliationIds"); + if (ids == null) { + throw new IllegalArgumentException("ids must not be null"); + } + try { + mService.setAffiliationIds(admin, new ArrayList<>(ids)); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * STOPSHIP (b/37622682) Remove it before release. + * @removed */ public void setAffiliationIds(@NonNull ComponentName admin, @NonNull List<String> ids) { throwIfParentInstance("setAffiliationIds"); + if (ids == null) { + throw new IllegalArgumentException("ids must not be null"); + } try { mService.setAffiliationIds(admin, ids); } catch (RemoteException e) { @@ -7522,13 +7542,12 @@ public class DevicePolicyManager { } /** - * Returns the list of affiliation ids previously set via {@link #setAffiliationIds}, or an - * empty list if none have been set. + * Returns the set of affiliation ids previously set via {@link #setAffiliationIds}, or an + * empty set if none have been set. */ - public @NonNull List<String> getAffiliationIds(@NonNull ComponentName admin) { - throwIfParentInstance("getAffiliationIds"); + public @NonNull Set<String> getAffiliationIds(@NonNull ComponentName admin) { try { - return mService.getAffiliationIds(admin); + return new ArraySet<>(mService.getAffiliationIds(admin)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index e82ba9cee919..99c21e2e4269 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -10016,14 +10016,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return; } + if (ids == null) { + throw new IllegalArgumentException("ids must not be null"); + } + for (String id : ids) { + if (TextUtils.isEmpty(id)) { + throw new IllegalArgumentException("ids must not contain empty string"); + } + } - Preconditions.checkNotNull(admin); - Preconditions.checkCollectionElementsNotNull(ids, "ids"); - - final Set<String> affiliationIds = new ArraySet<String>(ids); - Preconditions.checkArgument( - !affiliationIds.contains(""), "ids must not contain empty strings"); - + final Set<String> affiliationIds = new ArraySet<>(ids); final int callingUserId = mInjector.userHandleGetCallingUserId(); synchronized (this) { getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 6a01c1c6a591..971cdf8cfb84 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -2154,7 +2154,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Have the profile owner specify a set of affiliation ids. Check that the test user remains // unaffiliated. - final List<String> userAffiliationIds = new ArrayList<>(); + final Set<String> userAffiliationIds = new ArraySet<>(); userAffiliationIds.add("red"); userAffiliationIds.add("green"); userAffiliationIds.add("blue"); @@ -2164,7 +2164,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Have the device owner specify a set of affiliation ids that do not intersect with those // specified by the profile owner. Check that the test user remains unaffiliated. - final List<String> deviceAffiliationIds = new ArrayList<>(); + final Set<String> deviceAffiliationIds = new ArraySet<>(); deviceAffiliationIds.add("cyan"); deviceAffiliationIds.add("yellow"); deviceAffiliationIds.add("magenta"); @@ -2184,7 +2184,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertTrue(dpm.isAffiliatedUser()); // Clear affiliation ids for the profile owner. The user becomes unaffiliated. - dpm.setAffiliationIds(admin2, Collections.emptyList()); + dpm.setAffiliationIds(admin2, Collections.emptySet()); assertTrue(dpm.getAffiliationIds(admin2).isEmpty()); assertFalse(dpm.isAffiliatedUser()); @@ -3377,7 +3377,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { MoreAsserts.assertEmpty(targetUsers); // Setting affiliation ids - final List<String> userAffiliationIds = Arrays.asList("some.affiliation-id"); + final Set<String> userAffiliationIds = Collections.singleton("some.affiliation-id"); mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; dpm.setAffiliationIds(admin1, userAffiliationIds); @@ -3397,7 +3397,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { MoreAsserts.assertContentsInAnyOrder(targetUsers, UserHandle.SYSTEM); // Changing affiliation ids in one - dpm.setAffiliationIds(admin1, Arrays.asList("some-different-affiliation-id")); + dpm.setAffiliationIds(admin1, Collections.singleton("some-different-affiliation-id")); // Since the managed profile is not affiliated any more, they should not be allowed to talk // to each other. @@ -3422,7 +3422,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { addManagedProfile(adminDifferentPackage, MANAGED_PROFILE_ADMIN_UID, admin2); // Setting affiliation ids - final List<String> userAffiliationIds = Arrays.asList("some-affiliation-id"); + final Set<String> userAffiliationIds = Collections.singleton("some-affiliation-id"); dpm.setAffiliationIds(admin1, userAffiliationIds); mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; @@ -3484,7 +3484,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertFalse(dpm.isLockTaskPermitted("doPackage1")); // Setting same affiliation ids - final List<String> userAffiliationIds = Arrays.asList("some-affiliation-id"); + final Set<String> userAffiliationIds = Collections.singleton("some-affiliation-id"); mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; dpm.setAffiliationIds(admin1, userAffiliationIds); @@ -3500,7 +3500,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { .updateLockTaskPackages(eq(MANAGED_PROFILE_USER_ID), eq(poPackages)); // Unaffiliate the profile, lock task mode no longer available on the profile. - dpm.setAffiliationIds(adminDifferentPackage, Collections.<String>emptyList()); + dpm.setAffiliationIds(adminDifferentPackage, Collections.emptySet()); assertFalse(dpm.isLockTaskPermitted("poPackage1")); // Lock task packages cleared when loading user data and when the user becomes unaffiliated. verify(mContext.iactivityManager, times(2)) |