Merge "Use DPMS lock for the policy engine" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
98c8c131ac
@@ -101,7 +101,7 @@ final class DevicePolicyEngine {
|
|||||||
private final UserManager mUserManager;
|
private final UserManager mUserManager;
|
||||||
|
|
||||||
// TODO(b/256849338): add more granular locks
|
// TODO(b/256849338): add more granular locks
|
||||||
private final Object mLock = new Object();
|
private final Object mLock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map of <userId, Map<policyKey, policyState>>
|
* Map of <userId, Map<policyKey, policyState>>
|
||||||
@@ -122,9 +122,11 @@ final class DevicePolicyEngine {
|
|||||||
|
|
||||||
DevicePolicyEngine(
|
DevicePolicyEngine(
|
||||||
@NonNull Context context,
|
@NonNull Context context,
|
||||||
@NonNull DeviceAdminServiceController deviceAdminServiceController) {
|
@NonNull DeviceAdminServiceController deviceAdminServiceController,
|
||||||
|
@NonNull Object lock) {
|
||||||
mContext = Objects.requireNonNull(context);
|
mContext = Objects.requireNonNull(context);
|
||||||
mDeviceAdminServiceController = Objects.requireNonNull(deviceAdminServiceController);
|
mDeviceAdminServiceController = Objects.requireNonNull(deviceAdminServiceController);
|
||||||
|
mLock = Objects.requireNonNull(lock);
|
||||||
mUserManager = mContext.getSystemService(UserManager.class);
|
mUserManager = mContext.getSystemService(UserManager.class);
|
||||||
mLocalPolicies = new SparseArray<>();
|
mLocalPolicies = new SparseArray<>();
|
||||||
mGlobalPolicies = new HashMap<>();
|
mGlobalPolicies = new HashMap<>();
|
||||||
@@ -152,8 +154,8 @@ final class DevicePolicyEngine {
|
|||||||
PolicyState<V> localPolicyState = getLocalPolicyStateLocked(policyDefinition, userId);
|
PolicyState<V> localPolicyState = getLocalPolicyStateLocked(policyDefinition, userId);
|
||||||
|
|
||||||
if (policyDefinition.isNonCoexistablePolicy()) {
|
if (policyDefinition.isNonCoexistablePolicy()) {
|
||||||
setNonCoexistableLocalPolicy(policyDefinition, localPolicyState, enforcingAdmin,
|
setNonCoexistableLocalPolicyLocked(policyDefinition, localPolicyState,
|
||||||
value, userId, skipEnforcePolicy);
|
enforcingAdmin, value, userId, skipEnforcePolicy);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,7 +175,7 @@ final class DevicePolicyEngine {
|
|||||||
// the data structures.
|
// the data structures.
|
||||||
if (!skipEnforcePolicy) {
|
if (!skipEnforcePolicy) {
|
||||||
if (policyChanged) {
|
if (policyChanged) {
|
||||||
onLocalPolicyChanged(policyDefinition, enforcingAdmin, userId);
|
onLocalPolicyChangedLocked(policyDefinition, enforcingAdmin, userId);
|
||||||
}
|
}
|
||||||
boolean policyEnforced = Objects.equals(
|
boolean policyEnforced = Objects.equals(
|
||||||
localPolicyState.getCurrentResolvedPolicy(), value);
|
localPolicyState.getCurrentResolvedPolicy(), value);
|
||||||
@@ -211,7 +213,7 @@ final class DevicePolicyEngine {
|
|||||||
*
|
*
|
||||||
* <p>Passing a {@code null} value means the policy set by this admin should be removed.
|
* <p>Passing a {@code null} value means the policy set by this admin should be removed.
|
||||||
*/
|
*/
|
||||||
private <V> void setNonCoexistableLocalPolicy(
|
private <V> void setNonCoexistableLocalPolicyLocked(
|
||||||
PolicyDefinition<V> policyDefinition,
|
PolicyDefinition<V> policyDefinition,
|
||||||
PolicyState<V> localPolicyState,
|
PolicyState<V> localPolicyState,
|
||||||
EnforcingAdmin enforcingAdmin,
|
EnforcingAdmin enforcingAdmin,
|
||||||
@@ -266,8 +268,8 @@ final class DevicePolicyEngine {
|
|||||||
PolicyState<V> localPolicyState = getLocalPolicyStateLocked(policyDefinition, userId);
|
PolicyState<V> localPolicyState = getLocalPolicyStateLocked(policyDefinition, userId);
|
||||||
|
|
||||||
if (policyDefinition.isNonCoexistablePolicy()) {
|
if (policyDefinition.isNonCoexistablePolicy()) {
|
||||||
setNonCoexistableLocalPolicy(policyDefinition, localPolicyState, enforcingAdmin,
|
setNonCoexistableLocalPolicyLocked(policyDefinition, localPolicyState,
|
||||||
/* value= */ null, userId, /* skipEnforcePolicy= */ false);
|
enforcingAdmin, /* value= */ null, userId, /* skipEnforcePolicy= */ false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,7 +284,7 @@ final class DevicePolicyEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (policyChanged) {
|
if (policyChanged) {
|
||||||
onLocalPolicyChanged(policyDefinition, enforcingAdmin, userId);
|
onLocalPolicyChangedLocked(policyDefinition, enforcingAdmin, userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// For a removePolicy to be enforced, it means no current policy exists
|
// For a removePolicy to be enforced, it means no current policy exists
|
||||||
@@ -348,7 +350,7 @@ final class DevicePolicyEngine {
|
|||||||
/**
|
/**
|
||||||
* Enforces the new policy and notifies relevant admins.
|
* Enforces the new policy and notifies relevant admins.
|
||||||
*/
|
*/
|
||||||
private <V> void onLocalPolicyChanged(
|
private <V> void onLocalPolicyChangedLocked(
|
||||||
@NonNull PolicyDefinition<V> policyDefinition,
|
@NonNull PolicyDefinition<V> policyDefinition,
|
||||||
@NonNull EnforcingAdmin enforcingAdmin,
|
@NonNull EnforcingAdmin enforcingAdmin,
|
||||||
int userId) {
|
int userId) {
|
||||||
@@ -358,7 +360,7 @@ final class DevicePolicyEngine {
|
|||||||
policyDefinition, localPolicyState.getCurrentResolvedPolicy(), userId);
|
policyDefinition, localPolicyState.getCurrentResolvedPolicy(), userId);
|
||||||
|
|
||||||
// Send policy updates to admins who've set it locally
|
// Send policy updates to admins who've set it locally
|
||||||
sendPolicyChangedToAdmins(
|
sendPolicyChangedToAdminsLocked(
|
||||||
localPolicyState,
|
localPolicyState,
|
||||||
enforcingAdmin,
|
enforcingAdmin,
|
||||||
policyDefinition,
|
policyDefinition,
|
||||||
@@ -369,7 +371,7 @@ final class DevicePolicyEngine {
|
|||||||
// Send policy updates to admins who've set it globally
|
// Send policy updates to admins who've set it globally
|
||||||
if (hasGlobalPolicyLocked(policyDefinition)) {
|
if (hasGlobalPolicyLocked(policyDefinition)) {
|
||||||
PolicyState<V> globalPolicyState = getGlobalPolicyStateLocked(policyDefinition);
|
PolicyState<V> globalPolicyState = getGlobalPolicyStateLocked(policyDefinition);
|
||||||
sendPolicyChangedToAdmins(
|
sendPolicyChangedToAdminsLocked(
|
||||||
globalPolicyState,
|
globalPolicyState,
|
||||||
enforcingAdmin,
|
enforcingAdmin,
|
||||||
policyDefinition,
|
policyDefinition,
|
||||||
@@ -424,7 +426,7 @@ final class DevicePolicyEngine {
|
|||||||
// the data structures.
|
// the data structures.
|
||||||
if (!skipEnforcePolicy) {
|
if (!skipEnforcePolicy) {
|
||||||
if (policyChanged) {
|
if (policyChanged) {
|
||||||
onGlobalPolicyChanged(policyDefinition, enforcingAdmin);
|
onGlobalPolicyChangedLocked(policyDefinition, enforcingAdmin);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean policyAppliedGlobally = Objects.equals(
|
boolean policyAppliedGlobally = Objects.equals(
|
||||||
@@ -473,7 +475,7 @@ final class DevicePolicyEngine {
|
|||||||
boolean policyChanged = policyState.removePolicy(enforcingAdmin);
|
boolean policyChanged = policyState.removePolicy(enforcingAdmin);
|
||||||
|
|
||||||
if (policyChanged) {
|
if (policyChanged) {
|
||||||
onGlobalPolicyChanged(policyDefinition, enforcingAdmin);
|
onGlobalPolicyChangedLocked(policyDefinition, enforcingAdmin);
|
||||||
}
|
}
|
||||||
|
|
||||||
applyGlobalPolicyOnUsersWithLocalPoliciesLocked(policyDefinition, enforcingAdmin,
|
applyGlobalPolicyOnUsersWithLocalPoliciesLocked(policyDefinition, enforcingAdmin,
|
||||||
@@ -499,7 +501,7 @@ final class DevicePolicyEngine {
|
|||||||
/**
|
/**
|
||||||
* Enforces the new policy globally and notifies relevant admins.
|
* Enforces the new policy globally and notifies relevant admins.
|
||||||
*/
|
*/
|
||||||
private <V> void onGlobalPolicyChanged(
|
private <V> void onGlobalPolicyChangedLocked(
|
||||||
@NonNull PolicyDefinition<V> policyDefinition,
|
@NonNull PolicyDefinition<V> policyDefinition,
|
||||||
@NonNull EnforcingAdmin enforcingAdmin) {
|
@NonNull EnforcingAdmin enforcingAdmin) {
|
||||||
PolicyState<V> policyState = getGlobalPolicyStateLocked(policyDefinition);
|
PolicyState<V> policyState = getGlobalPolicyStateLocked(policyDefinition);
|
||||||
@@ -507,7 +509,7 @@ final class DevicePolicyEngine {
|
|||||||
enforcePolicy(policyDefinition, policyState.getCurrentResolvedPolicy(),
|
enforcePolicy(policyDefinition, policyState.getCurrentResolvedPolicy(),
|
||||||
UserHandle.USER_ALL);
|
UserHandle.USER_ALL);
|
||||||
|
|
||||||
sendPolicyChangedToAdmins(
|
sendPolicyChangedToAdminsLocked(
|
||||||
policyState,
|
policyState,
|
||||||
enforcingAdmin,
|
enforcingAdmin,
|
||||||
policyDefinition,
|
policyDefinition,
|
||||||
@@ -552,7 +554,7 @@ final class DevicePolicyEngine {
|
|||||||
policyDefinition,
|
policyDefinition,
|
||||||
localPolicyState.getCurrentResolvedPolicy(),
|
localPolicyState.getCurrentResolvedPolicy(),
|
||||||
userId);
|
userId);
|
||||||
sendPolicyChangedToAdmins(
|
sendPolicyChangedToAdminsLocked(
|
||||||
localPolicyState,
|
localPolicyState,
|
||||||
enforcingAdmin,
|
enforcingAdmin,
|
||||||
policyDefinition,
|
policyDefinition,
|
||||||
@@ -745,34 +747,35 @@ final class DevicePolicyEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
<V> void transferPolicies(EnforcingAdmin oldAdmin, EnforcingAdmin newAdmin) {
|
<V> void transferPolicies(EnforcingAdmin oldAdmin, EnforcingAdmin newAdmin) {
|
||||||
Set<PolicyKey> globalPolicies = new HashSet<>(mGlobalPolicies.keySet());
|
synchronized (mLock) {
|
||||||
for (PolicyKey policy : globalPolicies) {
|
Set<PolicyKey> globalPolicies = new HashSet<>(mGlobalPolicies.keySet());
|
||||||
PolicyState<?> policyState = mGlobalPolicies.get(policy);
|
for (PolicyKey policy : globalPolicies) {
|
||||||
if (policyState.getPoliciesSetByAdmins().containsKey(oldAdmin)) {
|
PolicyState<?> policyState = mGlobalPolicies.get(policy);
|
||||||
PolicyDefinition<V> policyDefinition =
|
|
||||||
(PolicyDefinition<V>) policyState.getPolicyDefinition();
|
|
||||||
PolicyValue<V> policyValue =
|
|
||||||
(PolicyValue<V>) policyState.getPoliciesSetByAdmins().get(oldAdmin);
|
|
||||||
setGlobalPolicy(policyDefinition, newAdmin, policyValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < mLocalPolicies.size(); i++) {
|
|
||||||
int userId = mLocalPolicies.keyAt(i);
|
|
||||||
Set<PolicyKey> localPolicies = new HashSet<>(
|
|
||||||
mLocalPolicies.get(userId).keySet());
|
|
||||||
for (PolicyKey policy : localPolicies) {
|
|
||||||
PolicyState<?> policyState = mLocalPolicies.get(userId).get(policy);
|
|
||||||
if (policyState.getPoliciesSetByAdmins().containsKey(oldAdmin)) {
|
if (policyState.getPoliciesSetByAdmins().containsKey(oldAdmin)) {
|
||||||
PolicyDefinition<V> policyDefinition =
|
PolicyDefinition<V> policyDefinition =
|
||||||
(PolicyDefinition<V>) policyState.getPolicyDefinition();
|
(PolicyDefinition<V>) policyState.getPolicyDefinition();
|
||||||
PolicyValue<V> policyValue =
|
PolicyValue<V> policyValue =
|
||||||
(PolicyValue<V>) policyState.getPoliciesSetByAdmins().get(oldAdmin);
|
(PolicyValue<V>) policyState.getPoliciesSetByAdmins().get(oldAdmin);
|
||||||
setLocalPolicy(policyDefinition, newAdmin, policyValue, userId);
|
setGlobalPolicy(policyDefinition, newAdmin, policyValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < mLocalPolicies.size(); i++) {
|
||||||
|
int userId = mLocalPolicies.keyAt(i);
|
||||||
|
Set<PolicyKey> localPolicies = new HashSet<>(
|
||||||
|
mLocalPolicies.get(userId).keySet());
|
||||||
|
for (PolicyKey policy : localPolicies) {
|
||||||
|
PolicyState<?> policyState = mLocalPolicies.get(userId).get(policy);
|
||||||
|
if (policyState.getPoliciesSetByAdmins().containsKey(oldAdmin)) {
|
||||||
|
PolicyDefinition<V> policyDefinition =
|
||||||
|
(PolicyDefinition<V>) policyState.getPolicyDefinition();
|
||||||
|
PolicyValue<V> policyValue =
|
||||||
|
(PolicyValue<V>) policyState.getPoliciesSetByAdmins().get(oldAdmin);
|
||||||
|
setLocalPolicy(policyDefinition, newAdmin, policyValue, userId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
removePoliciesForAdmin(oldAdmin);
|
removePoliciesForAdmin(oldAdmin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -836,7 +839,7 @@ final class DevicePolicyEngine {
|
|||||||
mLocalPolicies.get(userId).put(
|
mLocalPolicies.get(userId).put(
|
||||||
policyDefinition.getPolicyKey(), new PolicyState<>(policyDefinition));
|
policyDefinition.getPolicyKey(), new PolicyState<>(policyDefinition));
|
||||||
}
|
}
|
||||||
return getPolicyState(mLocalPolicies.get(userId), policyDefinition);
|
return getPolicyStateLocked(mLocalPolicies.get(userId), policyDefinition);
|
||||||
}
|
}
|
||||||
|
|
||||||
private <V> void removeLocalPolicyStateLocked(
|
private <V> void removeLocalPolicyStateLocked(
|
||||||
@@ -858,14 +861,14 @@ final class DevicePolicyEngine {
|
|||||||
mGlobalPolicies.put(
|
mGlobalPolicies.put(
|
||||||
policyDefinition.getPolicyKey(), new PolicyState<>(policyDefinition));
|
policyDefinition.getPolicyKey(), new PolicyState<>(policyDefinition));
|
||||||
}
|
}
|
||||||
return getPolicyState(mGlobalPolicies, policyDefinition);
|
return getPolicyStateLocked(mGlobalPolicies, policyDefinition);
|
||||||
}
|
}
|
||||||
|
|
||||||
private <V> void removeGlobalPolicyStateLocked(PolicyDefinition<V> policyDefinition) {
|
private <V> void removeGlobalPolicyStateLocked(PolicyDefinition<V> policyDefinition) {
|
||||||
mGlobalPolicies.remove(policyDefinition.getPolicyKey());
|
mGlobalPolicies.remove(policyDefinition.getPolicyKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <V> PolicyState<V> getPolicyState(
|
private static <V> PolicyState<V> getPolicyStateLocked(
|
||||||
Map<PolicyKey, PolicyState<?>> policies, PolicyDefinition<V> policyDefinition) {
|
Map<PolicyKey, PolicyState<?>> policies, PolicyDefinition<V> policyDefinition) {
|
||||||
try {
|
try {
|
||||||
// This will not throw an exception because policyDefinition is of type V, so unless
|
// This will not throw an exception because policyDefinition is of type V, so unless
|
||||||
@@ -935,7 +938,7 @@ final class DevicePolicyEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO(b/261430877): Finalise the decision on which admins to send the updates to.
|
// TODO(b/261430877): Finalise the decision on which admins to send the updates to.
|
||||||
private <V> void sendPolicyChangedToAdmins(
|
private <V> void sendPolicyChangedToAdminsLocked(
|
||||||
PolicyState<V> policyState,
|
PolicyState<V> policyState,
|
||||||
EnforcingAdmin callingAdmin,
|
EnforcingAdmin callingAdmin,
|
||||||
PolicyDefinition<V> policyDefinition,
|
PolicyDefinition<V> policyDefinition,
|
||||||
@@ -1210,17 +1213,19 @@ final class DevicePolicyEngine {
|
|||||||
if (parentInfo == null || parentInfo.getUserHandle().getIdentifier() == userId) {
|
if (parentInfo == null || parentInfo.getUserHandle().getIdentifier() == userId) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!mLocalPolicies.contains(parentInfo.getUserHandle().getIdentifier())) {
|
synchronized (mLock) {
|
||||||
return;
|
if (!mLocalPolicies.contains(parentInfo.getUserHandle().getIdentifier())) {
|
||||||
}
|
return;
|
||||||
for (Map.Entry<PolicyKey, PolicyState<?>> entry : mLocalPolicies.get(
|
}
|
||||||
parentInfo.getUserHandle().getIdentifier()).entrySet()) {
|
for (Map.Entry<PolicyKey, PolicyState<?>> entry : mLocalPolicies.get(
|
||||||
enforcePolicyOnUser(userId, entry.getValue());
|
parentInfo.getUserHandle().getIdentifier()).entrySet()) {
|
||||||
|
enforcePolicyOnUserLocked(userId, entry.getValue());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private <V> void enforcePolicyOnUser(int userId, PolicyState<V> policyState) {
|
private <V> void enforcePolicyOnUserLocked(int userId, PolicyState<V> policyState) {
|
||||||
if (!policyState.getPolicyDefinition().isInheritable()) {
|
if (!policyState.getPolicyDefinition().isInheritable()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1239,26 +1244,28 @@ final class DevicePolicyEngine {
|
|||||||
*/
|
*/
|
||||||
@NonNull
|
@NonNull
|
||||||
DevicePolicyState getDevicePolicyState() {
|
DevicePolicyState getDevicePolicyState() {
|
||||||
Map<UserHandle, Map<PolicyKey, android.app.admin.PolicyState<?>>> policies =
|
synchronized (mLock) {
|
||||||
new HashMap<>();
|
Map<UserHandle, Map<PolicyKey, android.app.admin.PolicyState<?>>> policies =
|
||||||
for (int i = 0; i < mLocalPolicies.size(); i++) {
|
new HashMap<>();
|
||||||
UserHandle user = UserHandle.of(mLocalPolicies.keyAt(i));
|
for (int i = 0; i < mLocalPolicies.size(); i++) {
|
||||||
policies.put(user, new HashMap<>());
|
UserHandle user = UserHandle.of(mLocalPolicies.keyAt(i));
|
||||||
for (PolicyKey policyKey : mLocalPolicies.valueAt(i).keySet()) {
|
policies.put(user, new HashMap<>());
|
||||||
policies.get(user).put(
|
for (PolicyKey policyKey : mLocalPolicies.valueAt(i).keySet()) {
|
||||||
policyKey,
|
policies.get(user).put(
|
||||||
mLocalPolicies.valueAt(i).get(policyKey).getParcelablePolicyState());
|
policyKey,
|
||||||
|
mLocalPolicies.valueAt(i).get(policyKey).getParcelablePolicyState());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
if (!mGlobalPolicies.isEmpty()) {
|
||||||
if (!mGlobalPolicies.isEmpty()) {
|
policies.put(UserHandle.ALL, new HashMap<>());
|
||||||
policies.put(UserHandle.ALL, new HashMap<>());
|
for (PolicyKey policyKey : mGlobalPolicies.keySet()) {
|
||||||
for (PolicyKey policyKey : mGlobalPolicies.keySet()) {
|
policies.get(UserHandle.ALL).put(
|
||||||
policies.get(UserHandle.ALL).put(
|
policyKey,
|
||||||
policyKey,
|
mGlobalPolicies.get(policyKey).getParcelablePolicyState());
|
||||||
mGlobalPolicies.get(policyKey).getParcelablePolicyState());
|
}
|
||||||
}
|
}
|
||||||
|
return new DevicePolicyState(policies);
|
||||||
}
|
}
|
||||||
return new DevicePolicyState(policies);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1266,23 +1273,25 @@ final class DevicePolicyEngine {
|
|||||||
* Removes all local and global policies set by that admin.
|
* Removes all local and global policies set by that admin.
|
||||||
*/
|
*/
|
||||||
void removePoliciesForAdmin(EnforcingAdmin admin) {
|
void removePoliciesForAdmin(EnforcingAdmin admin) {
|
||||||
Set<PolicyKey> globalPolicies = new HashSet<>(mGlobalPolicies.keySet());
|
synchronized (mLock) {
|
||||||
for (PolicyKey policy : globalPolicies) {
|
Set<PolicyKey> globalPolicies = new HashSet<>(mGlobalPolicies.keySet());
|
||||||
PolicyState<?> policyState = mGlobalPolicies.get(policy);
|
for (PolicyKey policy : globalPolicies) {
|
||||||
if (policyState.getPoliciesSetByAdmins().containsKey(admin)) {
|
PolicyState<?> policyState = mGlobalPolicies.get(policy);
|
||||||
removeGlobalPolicy(policyState.getPolicyDefinition(), admin);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < mLocalPolicies.size(); i++) {
|
|
||||||
Set<PolicyKey> localPolicies = new HashSet<>(
|
|
||||||
mLocalPolicies.get(mLocalPolicies.keyAt(i)).keySet());
|
|
||||||
for (PolicyKey policy : localPolicies) {
|
|
||||||
PolicyState<?> policyState = mLocalPolicies.get(
|
|
||||||
mLocalPolicies.keyAt(i)).get(policy);
|
|
||||||
if (policyState.getPoliciesSetByAdmins().containsKey(admin)) {
|
if (policyState.getPoliciesSetByAdmins().containsKey(admin)) {
|
||||||
removeLocalPolicy(
|
removeGlobalPolicy(policyState.getPolicyDefinition(), admin);
|
||||||
policyState.getPolicyDefinition(), admin, mLocalPolicies.keyAt(i));
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < mLocalPolicies.size(); i++) {
|
||||||
|
Set<PolicyKey> localPolicies = new HashSet<>(
|
||||||
|
mLocalPolicies.get(mLocalPolicies.keyAt(i)).keySet());
|
||||||
|
for (PolicyKey policy : localPolicies) {
|
||||||
|
PolicyState<?> policyState = mLocalPolicies.get(
|
||||||
|
mLocalPolicies.keyAt(i)).get(policy);
|
||||||
|
if (policyState.getPoliciesSetByAdmins().containsKey(admin)) {
|
||||||
|
removeLocalPolicy(
|
||||||
|
policyState.getPolicyDefinition(), admin, mLocalPolicies.keyAt(i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1292,23 +1301,25 @@ final class DevicePolicyEngine {
|
|||||||
* Removes all local policies for the provided {@code userId}.
|
* Removes all local policies for the provided {@code userId}.
|
||||||
*/
|
*/
|
||||||
private void removeLocalPoliciesForUser(int userId) {
|
private void removeLocalPoliciesForUser(int userId) {
|
||||||
if (!mLocalPolicies.contains(userId)) {
|
synchronized (mLock) {
|
||||||
// No policies on user
|
if (!mLocalPolicies.contains(userId)) {
|
||||||
return;
|
// No policies on user
|
||||||
}
|
return;
|
||||||
|
|
||||||
Set<PolicyKey> localPolicies = new HashSet<>(mLocalPolicies.get(userId).keySet());
|
|
||||||
for (PolicyKey policy : localPolicies) {
|
|
||||||
PolicyState<?> policyState = mLocalPolicies.get(userId).get(policy);
|
|
||||||
Set<EnforcingAdmin> admins = new HashSet<>(
|
|
||||||
policyState.getPoliciesSetByAdmins().keySet());
|
|
||||||
for (EnforcingAdmin admin : admins) {
|
|
||||||
removeLocalPolicy(
|
|
||||||
policyState.getPolicyDefinition(), admin, userId);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
mLocalPolicies.remove(userId);
|
Set<PolicyKey> localPolicies = new HashSet<>(mLocalPolicies.get(userId).keySet());
|
||||||
|
for (PolicyKey policy : localPolicies) {
|
||||||
|
PolicyState<?> policyState = mLocalPolicies.get(userId).get(policy);
|
||||||
|
Set<EnforcingAdmin> admins = new HashSet<>(
|
||||||
|
policyState.getPoliciesSetByAdmins().keySet());
|
||||||
|
for (EnforcingAdmin admin : admins) {
|
||||||
|
removeLocalPolicy(
|
||||||
|
policyState.getPolicyDefinition(), admin, userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mLocalPolicies.remove(userId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1376,7 +1387,7 @@ final class DevicePolicyEngine {
|
|||||||
*/
|
*/
|
||||||
private void updateDeviceAdminServiceOnPolicyRemoveLocked(
|
private void updateDeviceAdminServiceOnPolicyRemoveLocked(
|
||||||
@NonNull EnforcingAdmin enforcingAdmin) {
|
@NonNull EnforcingAdmin enforcingAdmin) {
|
||||||
if (doesAdminHavePolicies(enforcingAdmin)) {
|
if (doesAdminHavePoliciesLocked(enforcingAdmin)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int userId = enforcingAdmin.getUserId();
|
int userId = enforcingAdmin.getUserId();
|
||||||
@@ -1399,7 +1410,7 @@ final class DevicePolicyEngine {
|
|||||||
/* actionForLog= */ "policy-removed");
|
/* actionForLog= */ "policy-removed");
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean doesAdminHavePolicies(@NonNull EnforcingAdmin enforcingAdmin) {
|
private boolean doesAdminHavePoliciesLocked(@NonNull EnforcingAdmin enforcingAdmin) {
|
||||||
for (PolicyKey policy : mGlobalPolicies.keySet()) {
|
for (PolicyKey policy : mGlobalPolicies.keySet()) {
|
||||||
PolicyState<?> policyState = mGlobalPolicies.get(policy);
|
PolicyState<?> policyState = mGlobalPolicies.get(policy);
|
||||||
if (policyState.getPoliciesSetByAdmins().containsKey(enforcingAdmin)) {
|
if (policyState.getPoliciesSetByAdmins().containsKey(enforcingAdmin)) {
|
||||||
@@ -1420,13 +1431,17 @@ final class DevicePolicyEngine {
|
|||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private Set<EnforcingAdmin> getEnforcingAdminsOnUser(int userId) {
|
private Set<EnforcingAdmin> getEnforcingAdminsOnUser(int userId) {
|
||||||
return mEnforcingAdmins.contains(userId)
|
synchronized (mLock) {
|
||||||
? mEnforcingAdmins.get(userId) : Collections.emptySet();
|
return mEnforcingAdmins.contains(userId)
|
||||||
|
? mEnforcingAdmins.get(userId) : Collections.emptySet();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void write() {
|
private void write() {
|
||||||
Log.d(TAG, "Writing device policies to file.");
|
synchronized (mLock) {
|
||||||
new DevicePoliciesReaderWriter().writeToFileLocked();
|
Log.d(TAG, "Writing device policies to file.");
|
||||||
|
new DevicePoliciesReaderWriter().writeToFileLocked();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(b/256852787): trigger resolving logic after loading policies as roles are recalculated
|
// TODO(b/256852787): trigger resolving logic after loading policies as roles are recalculated
|
||||||
@@ -1436,11 +1451,11 @@ final class DevicePolicyEngine {
|
|||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
clear();
|
clear();
|
||||||
new DevicePoliciesReaderWriter().readFromFileLocked();
|
new DevicePoliciesReaderWriter().readFromFileLocked();
|
||||||
reapplyAllPolicies();
|
reapplyAllPoliciesLocked();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private <V> void reapplyAllPolicies() {
|
private <V> void reapplyAllPoliciesLocked() {
|
||||||
for (PolicyKey policy : mGlobalPolicies.keySet()) {
|
for (PolicyKey policy : mGlobalPolicies.keySet()) {
|
||||||
PolicyState<?> policyState = mGlobalPolicies.get(policy);
|
PolicyState<?> policyState = mGlobalPolicies.get(policy);
|
||||||
// Policy definition and value will always be of the same type
|
// Policy definition and value will always be of the same type
|
||||||
@@ -1470,10 +1485,8 @@ final class DevicePolicyEngine {
|
|||||||
* <p>Note that this doesn't clear any enforcements, it only clears the data structures.
|
* <p>Note that this doesn't clear any enforcements, it only clears the data structures.
|
||||||
*/
|
*/
|
||||||
void clearAllPolicies() {
|
void clearAllPolicies() {
|
||||||
synchronized (mLock) {
|
clear();
|
||||||
clear();
|
write();
|
||||||
write();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
private void clear() {
|
private void clear() {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
|
|||||||
@@ -2093,7 +2093,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
|
|||||||
mUserData = new SparseArray<>();
|
mUserData = new SparseArray<>();
|
||||||
mOwners = makeOwners(injector, pathProvider);
|
mOwners = makeOwners(injector, pathProvider);
|
||||||
|
|
||||||
mDevicePolicyEngine = new DevicePolicyEngine(mContext, mDeviceAdminServiceController);
|
mDevicePolicyEngine = new DevicePolicyEngine(
|
||||||
|
mContext, mDeviceAdminServiceController, getLockObject());
|
||||||
|
|
||||||
if (!mHasFeature) {
|
if (!mHasFeature) {
|
||||||
// Skip the rest of the initialization
|
// Skip the rest of the initialization
|
||||||
|
|||||||
Reference in New Issue
Block a user