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

Commit 9df1e0a7 authored by Ayush Sharma's avatar Ayush Sharma
Browse files

Fix deadlock between NPMS and DPMS

Bug: 264898256
Fixes: 264940087
Fixes: 255306060
Test:
atest MixedManagedProfileOwnerTest#testSetMeteredDataDisabledPackages
atest MixedProfileOwnerTest#testSetMeteredDataDisabledPackages
atest MixedDeviceOwnerTest#testSetMeteredDataDisabledPackages

Change-Id: I4ad190cabe01c92fe392a5851033c5bf3469c3ca
parent 1a2ab4f8
Loading
Loading
Loading
Loading
+29 −26
Original line number Diff line number Diff line
@@ -1412,7 +1412,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
                            policy.mAdminList.remove(i);
                            policy.mAdminMap.remove(aa.info.getComponent());
                            pushActiveAdminPackagesLocked(userHandle);
                            pushMeteredDisabledPackages(userHandle);
                        }
                    }
                } catch (RemoteException re) {
@@ -1453,6 +1452,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
        if (removedAdmin) {
            // The removed admin might have disabled camera, so update user restrictions.
            pushUserRestrictions(userHandle);
            pushMeteredDisabledPackages(userHandle);
        }
    }
@@ -17875,21 +17875,23 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
        if (!mHasFeature) {
            return packageNames;
        }
        synchronized (getLockObject()) {
            final ActiveAdmin admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId());
        return mInjector.binderWithCleanCallingIdentity(() -> {
            final List<String> excludedPkgs = removeInvalidPkgsForMeteredDataRestriction(
                    caller.getUserId(), packageNames);
            synchronized (getLockObject()) {
                final ActiveAdmin admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId());
                admin.meteredDisabledPackages = packageNames;
                pushMeteredDisabledPackages(caller.getUserId());
                saveSettingsLocked(caller.getUserId());
            }
            pushMeteredDisabledPackages(caller.getUserId());
            return excludedPkgs;
        });
    }
    }
    private List<String> removeInvalidPkgsForMeteredDataRestriction(
            int userId, List<String> pkgNames) {
        synchronized (getLockObject()) {
            final Set<String> activeAdmins = getActiveAdminPackagesLocked(userId);
            final List<String> excludedPkgs = new ArrayList<>();
            for (int i = pkgNames.size() - 1; i >= 0; --i) {
@@ -17911,6 +17913,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
            pkgNames.removeAll(excludedPkgs);
            return excludedPkgs;
        }
    }
    @Override
    public List<String> getMeteredDataDisabledPackages(ComponentName who) {