diff options
5 files changed, 63 insertions, 5 deletions
diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java index d85b2cdbe66f..0e78275fa30b 100644 --- a/core/java/android/app/admin/DevicePolicyManagerInternal.java +++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java @@ -23,6 +23,7 @@ import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.os.UserHandle; +import android.os.UserManager.EnforcingUser; import java.util.List; import java.util.Set; @@ -326,4 +327,10 @@ public abstract class DevicePolicyManagerInternal { */ public abstract List<Bundle> getApplicationRestrictionsPerAdminForUser( String packageName, @UserIdInt int userId); + + /** + * Returns a list of users who set a user restriction on a given user. + */ + public abstract List<EnforcingUser> getUserRestrictionSources(String restriction, + @UserIdInt int userId); } diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java index 964e4b24d130..00ccea1f93f1 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java @@ -36,6 +36,7 @@ import android.os.Build; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; +import android.os.UserManager.EnforcingUser; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ForegroundColorSpan; @@ -118,12 +119,13 @@ public class RestrictedLockUtilsInternal extends RestrictedLockUtils { return enforcedAdmin; } - final int restrictionSource = enforcingUsers.get(0).getUserRestrictionSource(); + final EnforcingUser enforcingUser = enforcingUsers.get(0); + final int restrictionSource = enforcingUser.getUserRestrictionSource(); if (restrictionSource == UserManager.RESTRICTION_SOURCE_SYSTEM) { return null; } - final EnforcedAdmin admin = getProfileOrDeviceOwner(context, userHandle); + final EnforcedAdmin admin = getProfileOrDeviceOwner(context, enforcingUser.getUserHandle()); if (admin != null) { return admin; } diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 4e043aae4f09..7e88e13e1788 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -2854,9 +2854,8 @@ public class UserManagerService extends IUserManager.Stub { UserHandle.USER_NULL, UserManager.RESTRICTION_SOURCE_SYSTEM)); } - synchronized (mRestrictionsLock) { - result.addAll(mDevicePolicyUserRestrictions.getEnforcingUsers(restrictionKey, userId)); - } + result.addAll(getDevicePolicyManagerInternal() + .getUserRestrictionSources(restrictionKey, userId)); return result; } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java index df968f9e4ca8..cf7c7186e4de 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java @@ -605,6 +605,22 @@ final class DevicePolicyEngine { } /** + * Retrieves the values set for the provided {@code policyDefinition} by each admin. + */ + @NonNull + <V> LinkedHashMap<EnforcingAdmin, PolicyValue<V>> getGlobalPoliciesSetByAdmins( + @NonNull PolicyDefinition<V> policyDefinition) { + Objects.requireNonNull(policyDefinition); + + synchronized (mLock) { + if (!hasGlobalPolicyLocked(policyDefinition)) { + return new LinkedHashMap<>(); + } + return getGlobalPolicyStateLocked(policyDefinition).getPoliciesSetByAdmins(); + } + } + + /** * Returns the policies set by the given admin that share the same * {@link PolicyKey#getIdentifier()} as the provided {@code policyDefinition}. * diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index f875e3418479..2846b394e6e7 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -410,6 +410,7 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; +import android.os.UserManager.EnforcingUser; import android.os.UserManager.UserRestrictionSource; import android.os.storage.StorageManager; import android.permission.AdminPermissionControlParams; @@ -16346,6 +16347,39 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return List.of(bundle); }); } + + public List<EnforcingUser> getUserRestrictionSources(String restriction, + @UserIdInt int userId) { + PolicyDefinition<Boolean> policy = + PolicyDefinition.getPolicyDefinitionForUserRestriction(restriction); + + Set<EnforcingAdmin> localAdmins = + mDevicePolicyEngine.getLocalPoliciesSetByAdmins(policy, userId).keySet(); + + Set<EnforcingAdmin> globalAdmins = + mDevicePolicyEngine.getGlobalPoliciesSetByAdmins(policy).keySet(); + + List<EnforcingUser> enforcingUsers = new ArrayList(); + enforcingUsers.addAll(getEnforcingUsers(localAdmins)); + enforcingUsers.addAll(getEnforcingUsers(globalAdmins)); + return enforcingUsers; + } + + private List<EnforcingUser> getEnforcingUsers(Set<EnforcingAdmin> admins) { + List<EnforcingUser> enforcingUsers = new ArrayList(); + ComponentName deviceOwner = mOwners.getDeviceOwnerComponent(); + for (EnforcingAdmin admin : admins) { + if (deviceOwner != null + && deviceOwner.getPackageName().equals(admin.getPackageName())) { + enforcingUsers.add(new EnforcingUser(admin.getUserId(), + UserManager.RESTRICTION_SOURCE_DEVICE_OWNER)); + } else { + enforcingUsers.add(new EnforcingUser(admin.getUserId(), + UserManager.RESTRICTION_SOURCE_PROFILE_OWNER)); + } + } + return enforcingUsers; + } } private Intent createShowAdminSupportIntent(int userId) { |