Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 43fb625f authored by Kholoud Mohamed's avatar Kholoud Mohamed
Browse files

Migrate lock task policy APIs to coexistence

Bug: 258442693
Bug: 232918480
Test: atest android.devicepolicy.cts.LockTaskTest with flag
enabled/disabled
Change-Id: Ib8d4498ce84db42ad409adc807f20ad25beb3ace

Change-Id: Idb1d2d277f35850c6e24134dcbeb83c3c0001aa1
parent ba36010e
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -16,24 +16,35 @@

package com.android.server.devicepolicy;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.Log;

import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;

import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.util.Objects;

final class BooleanPolicySerializer extends PolicySerializer<Boolean> {

    @Override
    void saveToXml(TypedXmlSerializer serializer, String attributeName, Boolean value)
    void saveToXml(TypedXmlSerializer serializer, String attributeName, @NonNull Boolean value)
            throws IOException {
        Objects.requireNonNull(value);
        serializer.attributeBoolean(/* namespace= */ null, attributeName, value);
    }

    @Nullable
    @Override
    Boolean readFromXml(TypedXmlPullParser parser, String attributeName)
            throws XmlPullParserException {
    Boolean readFromXml(TypedXmlPullParser parser, String attributeName) {
        try {
            return parser.getAttributeBoolean(/* namespace= */ null, attributeName);
        } catch (XmlPullParserException e) {
            Log.e(DevicePolicyEngine.TAG, "Error parsing Boolean policy value", e);
            return null;
        }
    }
}
+97 −8
Original line number Diff line number Diff line
@@ -12275,10 +12275,40 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
        synchronized (getLockObject()) {
            enforceCanCallLockTaskLocked(caller);
            checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_LOCK_TASK_PACKAGES);
        }
        if (isCoexistenceEnabled(caller)) {
            EnforcingAdmin admin = EnforcingAdmin.createEnterpriseEnforcingAdmin(who);
            if (packages.length == 0) {
                mDevicePolicyEngine.removeLocalPolicy(
                        PolicyDefinition.LOCK_TASK,
                        admin,
                        caller.getUserId());
            } else {
                LockTaskPolicy currentPolicy = mDevicePolicyEngine.getLocalPolicy(
                        PolicyDefinition.LOCK_TASK,
                        caller.getUserId()).getPoliciesSetByAdmins().get(admin);
                LockTaskPolicy policy;
                if (currentPolicy == null) {
                    policy = new LockTaskPolicy(Set.of(packages));
                } else {
                    policy = currentPolicy.clone();
                    policy.setPackages(Set.of(packages));
                }
                mDevicePolicyEngine.setLocalPolicy(
                        PolicyDefinition.LOCK_TASK,
                        EnforcingAdmin.createEnterpriseEnforcingAdmin(who),
                        policy,
                        caller.getUserId());
            }
        } else {
            synchronized (getLockObject()) {
                final int userHandle = caller.getUserId();
                setLockTaskPackagesLocked(userHandle, new ArrayList<>(Arrays.asList(packages)));
            }
        }
    }
    private void setLockTaskPackagesLocked(int userHandle, List<String> packages) {
        DevicePolicyData policy = getUserData(userHandle);
@@ -12297,10 +12327,23 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
        synchronized (getLockObject()) {
            enforceCanCallLockTaskLocked(caller);
        }
        if (isCoexistenceEnabled(caller)) {
            LockTaskPolicy policy = mDevicePolicyEngine.getLocalPolicy(
                    PolicyDefinition.LOCK_TASK, userHandle).getCurrentResolvedPolicy();
            if (policy == null) {
                return new String[0];
            } else {
                return policy.getPackages().toArray(new String[policy.getPackages().size()]);
            }
        } else {
            synchronized (getLockObject()) {
                final List<String> packages = getUserData(userHandle).mLockTaskPackages;
                return packages.toArray(new String[packages.size()]);
            }
        }
    }
    @Override
    public boolean isLockTaskPermitted(String pkg) {
@@ -12314,10 +12357,21 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
        }
        final int userId = mInjector.userHandleGetCallingUserId();
        // TODO(b/260560985): This is not the right check, as the flag could be enabled but there
        //  could be an admin that hasn't targeted U.
        if (isCoexistenceFlagEnabled()) {
            LockTaskPolicy policy = mDevicePolicyEngine.getLocalPolicy(
                    PolicyDefinition.LOCK_TASK, userId).getCurrentResolvedPolicy();
            if (policy == null) {
                return false;
            }
            return policy.getPackages().contains(pkg);
        } else {
            synchronized (getLockObject()) {
                return getUserData(userId).mLockTaskPackages.contains(pkg);
            }
        }
    }
    @Override
    public void setLockTaskFeatures(ComponentName who, int flags) {
@@ -12338,9 +12392,30 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
            enforceCanCallLockTaskLocked(caller);
            enforceCanSetLockTaskFeaturesOnFinancedDevice(caller, flags);
            checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_LOCK_TASK_FEATURES);
        }
        if (isCoexistenceEnabled(caller)) {
            EnforcingAdmin admin = EnforcingAdmin.createEnterpriseEnforcingAdmin(who);
            LockTaskPolicy currentPolicy = mDevicePolicyEngine.getLocalPolicy(
                    PolicyDefinition.LOCK_TASK,
                    caller.getUserId()).getPoliciesSetByAdmins().get(admin);
            if (currentPolicy == null) {
                throw new IllegalArgumentException("Can't set a lock task flags without setting "
                        + "lock task packages first.");
            }
            LockTaskPolicy policy = currentPolicy.clone();
            policy.setFlags(flags);
            mDevicePolicyEngine.setLocalPolicy(
                    PolicyDefinition.LOCK_TASK,
                    EnforcingAdmin.createEnterpriseEnforcingAdmin(who),
                    policy,
                    caller.getUserId());
        } else {
            synchronized (getLockObject()) {
                setLockTaskFeaturesLocked(userHandle, flags);
            }
        }
    }
    private void setLockTaskFeaturesLocked(int userHandle, int flags) {
        DevicePolicyData policy = getUserData(userHandle);
@@ -12356,9 +12431,23 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
        final int userHandle = caller.getUserId();
        synchronized (getLockObject()) {
            enforceCanCallLockTaskLocked(caller);
        }
        if (isCoexistenceEnabled(caller)) {
            LockTaskPolicy policy = mDevicePolicyEngine.getLocalPolicy(
                    PolicyDefinition.LOCK_TASK, userHandle).getCurrentResolvedPolicy();
            if (policy == null) {
                // We default on the power button menu, in order to be consistent with pre-P
                // behaviour.
                return DevicePolicyManager.LOCK_TASK_FEATURE_GLOBAL_ACTIONS;
            }
            return policy.getFlags();
        } else {
            synchronized (getLockObject()) {
                return getUserData(userHandle).mLockTaskFeatures;
            }
        }
    }
    private void maybeClearLockTaskPolicyLocked() {
        mInjector.binderWithCleanCallingIdentity(() -> {
+15 −4
Original line number Diff line number Diff line
@@ -16,24 +16,35 @@

package com.android.server.devicepolicy;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.Log;

import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;

import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.util.Objects;

final class IntegerPolicySerializer extends PolicySerializer<Integer> {

    @Override
    void saveToXml(TypedXmlSerializer serializer, String attributeName, Integer value)
    void saveToXml(TypedXmlSerializer serializer, String attributeName, @NonNull Integer value)
            throws IOException {
        Objects.requireNonNull(value);
        serializer.attributeInt(/* namespace= */ null, attributeName, value);
    }

    @Nullable
    @Override
    Integer readFromXml(TypedXmlPullParser parser, String attributeName)
            throws XmlPullParserException {
    Integer readFromXml(TypedXmlPullParser parser, String attributeName) {
        try {
            return parser.getAttributeInt(/* namespace= */ null, attributeName);
        } catch (XmlPullParserException e) {
            Log.e(DevicePolicyEngine.TAG, "Error parsing Integer policy value", e);
            return null;
        }
    }
}
+59 −27
Original line number Diff line number Diff line
@@ -16,7 +16,10 @@

package com.android.server.devicepolicy;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.admin.DevicePolicyManager;
import android.util.Log;

import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
@@ -24,19 +27,16 @@ import com.android.modules.utils.TypedXmlSerializer;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

final class LockTaskPolicy {
    private Set<String> mPackages;
    private int mFlags;
    static final int DEFAULT_LOCK_TASK_FLAG = DevicePolicyManager.LOCK_TASK_FEATURE_GLOBAL_ACTIONS;
    private Set<String> mPackages = new HashSet<>();
    private int mFlags = DEFAULT_LOCK_TASK_FLAG;

    LockTaskPolicy(@Nullable Set<String> packages, int flags) {
        mPackages = packages;
        mFlags = flags;
    }

    @Nullable
    @NonNull
    Set<String> getPackages() {
        return mPackages;
    }
@@ -45,14 +45,33 @@ final class LockTaskPolicy {
        return mFlags;
    }

    void setPackages(Set<String> packages) {
        mPackages = packages;
    LockTaskPolicy(Set<String> packages) {
        Objects.requireNonNull(packages);
        mPackages.addAll(packages);
    }

    private LockTaskPolicy(Set<String> packages, int flags) {
        Objects.requireNonNull(packages);
        mPackages = new HashSet<>(packages);
        mFlags = flags;
    }

    void setPackages(@NonNull Set<String> packages) {
        Objects.requireNonNull(packages);
        mPackages = new HashSet<>(packages);
    }

    void setFlags(int flags) {
        mFlags = flags;
    }

    @Override
    public LockTaskPolicy clone() {
        LockTaskPolicy policy = new LockTaskPolicy(mPackages);
        policy.setFlags(mFlags);
        return policy;
    }

    @Override
    public boolean equals(@Nullable Object o) {
        if (this == o) return true;
@@ -67,6 +86,11 @@ final class LockTaskPolicy {
        return Objects.hash(mPackages, mFlags);
    }

    @Override
    public String toString() {
        return "mPackages= " + String.join(", ", mPackages) + "; mFlags= " + mFlags;
    }

    static final class LockTaskPolicySerializer extends PolicySerializer<LockTaskPolicy> {

        private static final String ATTR_PACKAGES = ":packages";
@@ -74,15 +98,17 @@ final class LockTaskPolicy {
        private static final String ATTR_FLAGS = ":flags";

        @Override
        void saveToXml(
                TypedXmlSerializer serializer, String attributeNamePrefix, LockTaskPolicy value)
                throws IOException {
            if (value.mPackages != null) {
        void saveToXml(TypedXmlSerializer serializer, String attributeNamePrefix,
                @NonNull LockTaskPolicy value) throws IOException {
            Objects.requireNonNull(value);
            if (value.mPackages == null || value.mPackages.isEmpty()) {
                throw new IllegalArgumentException("Error saving LockTaskPolicy to file, lock task "
                        + "packages must be present");
            }
            serializer.attribute(
                    /* namespace= */ null,
                    attributeNamePrefix + ATTR_PACKAGES,
                    String.join(ATTR_PACKAGES_SEPARATOR, value.mPackages));
            }
            serializer.attributeInt(
                    /* namespace= */ null,
                    attributeNamePrefix + ATTR_FLAGS,
@@ -90,18 +116,24 @@ final class LockTaskPolicy {
        }

        @Override
        LockTaskPolicy readFromXml(TypedXmlPullParser parser, String attributeNamePrefix)
                throws XmlPullParserException {
        LockTaskPolicy readFromXml(TypedXmlPullParser parser, String attributeNamePrefix) {
            String packagesStr = parser.getAttributeValue(
                    /* namespace= */ null,
                    attributeNamePrefix + ATTR_PACKAGES);
            Set<String> packages = packagesStr == null
                    ? null
                    : Set.of(packagesStr.split(ATTR_PACKAGES_SEPARATOR));
            if (packagesStr == null) {
                Log.e(DevicePolicyEngine.TAG, "Error parsing LockTask policy value.");
                return null;
            }
            Set<String> packages = Set.of(packagesStr.split(ATTR_PACKAGES_SEPARATOR));
            try {
                int flags = parser.getAttributeInt(
                        /* namespace= */ null,
                        attributeNamePrefix + ATTR_FLAGS);
                return new LockTaskPolicy(packages, flags);
            } catch (XmlPullParserException e) {
                Log.e(DevicePolicyEngine.TAG, "Error parsing LockTask policy value", e);
                return null;
            }
        }
    }
}
+2 −4
Original line number Diff line number Diff line
@@ -25,8 +25,6 @@ import com.android.internal.util.function.QuadFunction;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;

import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
@@ -225,8 +223,8 @@ final class PolicyDefinition<V> {
        mPolicySerializer.saveToXml(serializer, attributeName, value);
    }

    V readPolicyValueFromXml(TypedXmlPullParser parser, String attributeName)
            throws XmlPullParserException {
    @Nullable
    V readPolicyValueFromXml(TypedXmlPullParser parser, String attributeName) {
        return mPolicySerializer.readFromXml(parser, attributeName);
    }
}
Loading