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

Commit 94740ca9 authored by Kholoud Mohamed's avatar Kholoud Mohamed Committed by Automerger Merge Worker
Browse files

Merge "Prevent uninstalling the device management role" into tm-qpr-dev am: 2c11df7f

parents 298d7c19 2c11df7f
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -3211,6 +3211,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
        return isPackageDeviceAdmin(packageName, UserHandle.USER_ALL);
    }

    // TODO(b/261957226): centralise this logic in DPM
    boolean isPackageDeviceAdmin(String packageName, int userId) {
        final IDevicePolicyManager dpm = getDevicePolicyManager();
        try {
@@ -3237,6 +3238,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
                    if (dpm.packageHasActiveAdmins(packageName, users[i])) {
                        return true;
                    }
                    if (isDeviceManagementRoleHolder(packageName, users[i])) {
                        return true;
                    }
                }
            }
        } catch (RemoteException e) {
@@ -3244,6 +3248,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService
        return false;
    }

    private boolean isDeviceManagementRoleHolder(String packageName, int userId) {
        return Objects.equals(packageName, getDevicePolicyManagementRoleHolderPackageName(userId));
    }

    @Nullable
    private String getDevicePolicyManagementRoleHolderPackageName(int userId) {
        return Binder.withCleanCallingIdentity(() -> {
            RoleManager roleManager = mContext.getSystemService(RoleManager.class);
            List<String> roleHolders =
                    roleManager.getRoleHoldersAsUser(
                            RoleManager.ROLE_DEVICE_POLICY_MANAGEMENT, UserHandle.of(userId));
            if (roleHolders.isEmpty()) {
                return null;
            }
            return roleHolders.get(0);
        });
    }

    /** Returns the device policy manager interface. */
    private IDevicePolicyManager getDevicePolicyManager() {
        if (mDevicePolicyManager == null) {