summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/admin/DevicePolicyManagerInternal.java7
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java6
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java5
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java16
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java34
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) {