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

Commit f088c9e5 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Remove persistentPreferrredActivity policy on activity removal" into...

Merge "Remove persistentPreferrredActivity policy on activity removal" into udc-dev am: 7cc9a4bb am: e891421c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23213920



Change-Id: I5bc438261b0088772aaab0a05e423687c846336a
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 4fcf2a08 e891421c
Loading
Loading
Loading
Loading
+50 −0
Original line number Diff line number Diff line
@@ -32,13 +32,17 @@ import android.app.BroadcastOptions;
import android.app.admin.DevicePolicyIdentifiers;
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyState;
import android.app.admin.IntentFilterPolicyKey;
import android.app.admin.PolicyKey;
import android.app.admin.PolicyUpdateReceiver;
import android.app.admin.PolicyValue;
import android.app.admin.TargetUser;
import android.app.admin.UserRestrictionPolicyKey;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
@@ -1043,10 +1047,56 @@ final class DevicePolicyEngine {
            }
            if (updatedPackage != null) {
                updateDeviceAdminServiceOnPackageChanged(updatedPackage, userId);
                removePersistentPreferredActivityPoliciesForPackage(updatedPackage, userId);
            }
        });
    }

    private void removePersistentPreferredActivityPoliciesForPackage(
            @NonNull String packageName, int userId) {
        Set<PolicyKey> policyKeys = getLocalPolicyKeysSetByAllAdmins(
                PolicyDefinition.GENERIC_PERSISTENT_PREFERRED_ACTIVITY, userId);
        for (PolicyKey key : policyKeys) {
            if (!(key instanceof IntentFilterPolicyKey)) {
                throw new IllegalStateException("PolicyKey for "
                        + "PERSISTENT_PREFERRED_ACTIVITY is not of type "
                        + "IntentFilterPolicyKey");
            }
            IntentFilterPolicyKey parsedKey =
                    (IntentFilterPolicyKey) key;
            IntentFilter intentFilter = Objects.requireNonNull(parsedKey.getIntentFilter());
            PolicyDefinition<ComponentName> policyDefinition =
                    PolicyDefinition.PERSISTENT_PREFERRED_ACTIVITY(intentFilter);
            LinkedHashMap<EnforcingAdmin, PolicyValue<ComponentName>> policies =
                    getLocalPoliciesSetByAdmins(
                            policyDefinition,
                            userId);
            IPackageManager packageManager = AppGlobals.getPackageManager();
            for (EnforcingAdmin admin : policies.keySet()) {
                if (policies.get(admin).getValue() != null
                        && policies.get(admin).getValue().getPackageName().equals(packageName)) {
                    try {
                        if (packageManager.getPackageInfo(
                                packageName, 0, userId) == null
                                || packageManager.getReceiverInfo(policies.get(admin).getValue(),
                                PackageManager.MATCH_DIRECT_BOOT_AWARE
                                        | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
                                userId) == null) {
                            Slogf.e(TAG, String.format(
                                    "Persistent preferred activity in package %s not found for "
                                            + "user %d, removing policy for admin",
                                    packageName, userId));
                            removeLocalPolicy(policyDefinition, admin, userId);
                        }
                    } catch (RemoteException re) {
                        // Shouldn't happen.
                        Slogf.wtf(TAG, "Error handling package changes", re);
                    }
                }
            }
        }
    }

    private boolean isPackageInstalled(String packageName, int userId) {
        try {
            return AppGlobals.getPackageManager().getPackageInfo(
+4 −0
Original line number Diff line number Diff line
@@ -11447,6 +11447,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
                        || isDefaultDeviceOwner(caller) || isFinancedDeviceOwner(caller));
                enforcingAdmin = getEnforcingAdminForCaller(who, callerPackageName);
            }
            if (!isPackageInstalledForUser(activity.getPackageName(), userId)) {
                // Fail early as packageManager doesn't persist the activity if its not installed.
                return;
            }
            mDevicePolicyEngine.setLocalPolicy(
                    PolicyDefinition.PERSISTENT_PREFERRED_ACTIVITY(filter),
                    enforcingAdmin,