Allow setting lock task features without setting packages

Fixes: 278121754
Test: MixedDeviceOwnerTest#testLockTaskAfterReboot
Change-Id: Ib2fe11f927d2085b8bc50f86ef0c3681b9472291
This commit is contained in:
Kholoud Mohamed
2023-04-20 16:49:16 +00:00
parent 29ddb4d350
commit bae1a7a286
3 changed files with 48 additions and 33 deletions

View File

@@ -38,6 +38,7 @@ public final class LockTaskPolicy extends PolicyValue<LockTaskPolicy> {
/**
* @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<LockTaskPolicy> {
/**
* @hide
*/
public LockTaskPolicy(@NonNull Set<String> packages) {
Objects.requireNonNull(packages);
mPackages.addAll(packages);
public LockTaskPolicy(@Nullable Set<String> packages) {
if (packages != null) {
mPackages.addAll(packages);
}
setValue(this);
}
/**
* @hide
*/
public LockTaskPolicy(@NonNull Set<String> packages, int flags) {
Objects.requireNonNull(packages);
mPackages = new HashSet<>(packages);
public LockTaskPolicy(int flags) {
mFlags = flags;
setValue(this);
}
/**
* @hide
*/
public LockTaskPolicy(@Nullable Set<String> packages, int flags) {
if (packages != null) {
mPackages.addAll(packages);
}
mFlags = flags;
setValue(this);
}

View File

@@ -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()) {

View File

@@ -42,10 +42,6 @@ final class LockTaskPolicySerializer extends PolicySerializer<LockTaskPolicy> {
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,