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

Commit 8e33f630 authored by Tony Mak's avatar Tony Mak
Browse files

Clear granted permission when app is uninstalled by one of the multiple users

Bug: 21838358

Change-Id: Iccd46382c9468d0503da0bb49a49040ae712e2cc
parent 1247e48e
Loading
Loading
Loading
Loading
+27 −1
Original line number Diff line number Diff line
@@ -12500,6 +12500,8 @@ public class PackageManagerService extends IPackageManager.Stub {
                if (clearPackagePreferredActivitiesLPw(packageName, removeUser)) {
                    scheduleWritePackageRestrictionsLocked(removeUser);
                }
                revokeRuntimePermissionsAndClearAllFlagsLocked(ps.getPermissionsState(),
                        removeUser);
            }
            return true;
        }
@@ -12706,13 +12708,37 @@ public class PackageManagerService extends IPackageManager.Stub {
                | PackageManager.FLAG_PERMISSION_USER_FIXED
                | PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE;
        revokeRuntimePermissionsAndClearFlagsLocked(permissionsState, userId, userSetFlags);
    }
    /**
     * Revokes granted runtime permissions and clears all flags.
     *
     * @param permissionsState The permission state to reset.
     * @param userId The device user for which to do a reset.
     */
    private void revokeRuntimePermissionsAndClearAllFlagsLocked(
            PermissionsState permissionsState, int userId) {
        revokeRuntimePermissionsAndClearFlagsLocked(permissionsState, userId,
                PackageManager.MASK_PERMISSION_FLAGS);
    }
    /**
     * Revokes granted runtime permissions and clears certain flags.
     *
     * @param permissionsState The permission state to reset.
     * @param userId The device user for which to do a reset.
     * @param flags The flags that is going to be reset.
     */
    private void revokeRuntimePermissionsAndClearFlagsLocked(
            PermissionsState permissionsState, int userId, int flags) {
        boolean needsWrite = false;
        for (PermissionState state : permissionsState.getRuntimePermissionStates(userId)) {
            BasePermission bp = mSettings.mPermissions.get(state.getName());
            if (bp != null) {
                permissionsState.revokeRuntimePermission(bp, userId);
                permissionsState.updatePermissionFlags(bp, userId, userSetFlags, 0);
                permissionsState.updatePermissionFlags(bp, userId, flags, 0);
                needsWrite = true;
            }
        }