diff --git a/core/java/android/app/admin/LockTaskPolicy.java b/core/java/android/app/admin/LockTaskPolicy.java index f5d1cb4bb6722..b671d57938035 100644 --- a/core/java/android/app/admin/LockTaskPolicy.java +++ b/core/java/android/app/admin/LockTaskPolicy.java @@ -38,6 +38,7 @@ public final class LockTaskPolicy extends PolicyValue { /** * @hide */ + // We default on the power button menu, in order to be consistent with pre-P behaviour public static final int DEFAULT_LOCK_TASK_FLAG = DevicePolicyManager.LOCK_TASK_FEATURE_GLOBAL_ACTIONS; @@ -72,18 +73,28 @@ public final class LockTaskPolicy extends PolicyValue { /** * @hide */ - public LockTaskPolicy(@NonNull Set packages) { - Objects.requireNonNull(packages); - mPackages.addAll(packages); + public LockTaskPolicy(@Nullable Set packages) { + if (packages != null) { + mPackages.addAll(packages); + } setValue(this); } /** * @hide */ - public LockTaskPolicy(@NonNull Set packages, int flags) { - Objects.requireNonNull(packages); - mPackages = new HashSet<>(packages); + public LockTaskPolicy(int flags) { + mFlags = flags; + setValue(this); + } + + /** + * @hide + */ + public LockTaskPolicy(@Nullable Set packages, int flags) { + if (packages != null) { + mPackages.addAll(packages); + } mFlags = flags; setValue(this); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index f6bc93ab2491a..ee75f84e80a6a 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -14744,24 +14744,24 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (getLockObject()) { enforcingAdmin = enforceCanCallLockTaskLocked(who, caller.getPackageName()); } - if (packages.length == 0) { + LockTaskPolicy currentPolicy = mDevicePolicyEngine.getLocalPolicySetByAdmin( + PolicyDefinition.LOCK_TASK, + enforcingAdmin, + caller.getUserId()); + LockTaskPolicy policy; + if (currentPolicy == null) { + policy = new LockTaskPolicy(Set.of(packages)); + } else { + policy = new LockTaskPolicy(currentPolicy); + policy.setPackages(Set.of(packages)); + } + if (policy.getPackages().isEmpty() + && policy.getFlags() == DevicePolicyManager.LOCK_TASK_FEATURE_NONE) { mDevicePolicyEngine.removeLocalPolicy( PolicyDefinition.LOCK_TASK, enforcingAdmin, caller.getUserId()); } else { - LockTaskPolicy currentPolicy = mDevicePolicyEngine.getLocalPolicySetByAdmin( - PolicyDefinition.LOCK_TASK, - enforcingAdmin, - caller.getUserId()); - LockTaskPolicy policy; - if (currentPolicy == null) { - policy = new LockTaskPolicy(Set.of(packages)); - } else { - policy = new LockTaskPolicy(currentPolicy); - policy.setPackages(Set.of(packages)); - } - mDevicePolicyEngine.setLocalPolicy( PolicyDefinition.LOCK_TASK, enforcingAdmin, @@ -14876,18 +14876,26 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { PolicyDefinition.LOCK_TASK, enforcingAdmin, caller.getUserId()); + LockTaskPolicy policy; if (currentPolicy == null) { - throw new IllegalArgumentException("Can't set a lock task flags without setting " - + "lock task packages first."); + policy = new LockTaskPolicy(flags); + } else { + policy = new LockTaskPolicy(currentPolicy); + policy.setFlags(flags); + } + if (policy.getPackages().isEmpty() + && policy.getFlags() == DevicePolicyManager.LOCK_TASK_FEATURE_NONE) { + mDevicePolicyEngine.removeLocalPolicy( + PolicyDefinition.LOCK_TASK, + enforcingAdmin, + caller.getUserId()); + } else { + mDevicePolicyEngine.setLocalPolicy( + PolicyDefinition.LOCK_TASK, + enforcingAdmin, + policy, + caller.getUserId()); } - LockTaskPolicy policy = new LockTaskPolicy(currentPolicy); - policy.setFlags(flags); - - mDevicePolicyEngine.setLocalPolicy( - PolicyDefinition.LOCK_TASK, - enforcingAdmin, - policy, - caller.getUserId()); } else { Objects.requireNonNull(who, "ComponentName is null"); synchronized (getLockObject()) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/LockTaskPolicySerializer.java b/services/devicepolicy/java/com/android/server/devicepolicy/LockTaskPolicySerializer.java index 0f6f3c5a59211..20bd2d75f8469 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/LockTaskPolicySerializer.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/LockTaskPolicySerializer.java @@ -42,10 +42,6 @@ final class LockTaskPolicySerializer extends PolicySerializer { void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull LockTaskPolicy value) throws IOException { Objects.requireNonNull(value); - if (value.getPackages() == null || value.getPackages().isEmpty()) { - throw new IllegalArgumentException("Error saving LockTaskPolicy to file, lock task " - + "packages must be present"); - } serializer.attribute( /* namespace= */ null, ATTR_PACKAGES,