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

Commit 6b8e3e10 authored by Rhed Jao's avatar Rhed Jao
Browse files

Send extra when automatically removing packages (2/2)

Broadcasts ACTION_PACKAGE_REMOVED with the EXTRA_PACKAGE_AUTO_REMOVAL
field, when system prunes a package automatically.

Bug: 111318529
Test: atest CtsAppSecurityHostTestCases:EphemeralTest
Change-Id: Ib4aa2c3dd53dd42080aab4f875dbd7b4b866b44c
parent acbe943d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -771,8 +771,8 @@ class InstantAppRegistry {
            for (int i = 0; i < packageCount; i++) {
                final String packageToDelete = packagesToDelete.get(i);
                if (mService.deletePackageX(packageToDelete, PackageManager.VERSION_CODE_HIGHEST,
                        UserHandle.USER_SYSTEM, PackageManager.DELETE_ALL_USERS)
                                == PackageManager.DELETE_SUCCEEDED) {
                        UserHandle.USER_SYSTEM, PackageManager.DELETE_ALL_USERS,
                        true /*removedBySystem*/) == PackageManager.DELETE_SUCCEEDED) {
                    if (file.getUsableSpace() >= neededSpace) {
                        return true;
                    }
+19 −14
Original line number Diff line number Diff line
@@ -2150,7 +2150,7 @@ public class PackageManagerService extends IPackageManager.Stub
        if (succeeded) {
            // Send the removed broadcasts
            if (res.removedInfo != null) {
                res.removedInfo.sendPackageRemovedBroadcasts(killApp);
                res.removedInfo.sendPackageRemovedBroadcasts(killApp, false /*removedBySystem*/);
            }
            // Allowlist any restricted permissions first as some may be runtime
@@ -5315,8 +5315,8 @@ public class PackageManagerService extends IPackageManager.Stub
                final VersionedPackage pkgToDelete = packagesToDelete.get(i);
                // Delete the package synchronously (will fail of the lib used for any user).
                if (deletePackageX(pkgToDelete.getPackageName(), pkgToDelete.getLongVersionCode(),
                        UserHandle.USER_SYSTEM, PackageManager.DELETE_ALL_USERS)
                                == PackageManager.DELETE_SUCCEEDED) {
                        UserHandle.USER_SYSTEM, PackageManager.DELETE_ALL_USERS,
                        true /*removedBySystem*/) == PackageManager.DELETE_SUCCEEDED) {
                    if (volume.getUsableSpace() >= neededSpace) {
                        return true;
                    }
@@ -13305,7 +13305,7 @@ public class PackageManagerService extends IPackageManager.Stub
        info.removedUsers = new int[] {userId};
        info.broadcastUsers = new int[] {userId};
        info.uid = UserHandle.getUid(userId, pkgSetting.appId);
        info.sendPackageRemovedBroadcasts(true /*killApp*/);
        info.sendPackageRemovedBroadcasts(true /*killApp*/, false /*removedBySystem*/);
    }
    private void sendDistractingPackagesChanged(String[] pkgList, int[] uidList, int userId,
@@ -18599,21 +18599,21 @@ public class PackageManagerService extends IPackageManager.Stub
            if (doDeletePackage) {
                if (!deleteAllUsers) {
                    returnCode = deletePackageX(internalPackageName, versionCode,
                            userId, deleteFlags);
                            userId, deleteFlags, false /*removedBySystem*/);
                } else {
                    int[] blockUninstallUserIds = getBlockUninstallForUsers(
                            internalPackageName, users);
                    // If nobody is blocking uninstall, proceed with delete for all users
                    if (ArrayUtils.isEmpty(blockUninstallUserIds)) {
                        returnCode = deletePackageX(internalPackageName, versionCode,
                                userId, deleteFlags);
                                userId, deleteFlags, false /*removedBySystem*/);
                    } else {
                        // Otherwise uninstall individually for users with blockUninstalls=false
                        final int userFlags = deleteFlags & ~PackageManager.DELETE_ALL_USERS;
                        for (int userId1 : users) {
                            if (!ArrayUtils.contains(blockUninstallUserIds, userId1)) {
                                returnCode = deletePackageX(internalPackageName, versionCode,
                                        userId1, userFlags);
                                        userId1, userFlags, false /*removedBySystem*/);
                                if (returnCode != PackageManager.DELETE_SUCCEEDED) {
                                    Slog.w(TAG, "Package delete failed for user " + userId1
                                            + ", returnCode " + returnCode);
@@ -18840,8 +18840,12 @@ public class PackageManagerService extends IPackageManager.Stub
     *  updating mSettings to reflect current status
     *  persisting settings for later use
     *  sending a broadcast if necessary
     *
     *  @param removedBySystem A boolean to indicate the package was removed automatically without
     *                         the user-initiated action.
     */
    int deletePackageX(String packageName, long versionCode, int userId, int deleteFlags) {
    int deletePackageX(String packageName, long versionCode, int userId, int deleteFlags,
            boolean removedBySystem) {
        final PackageRemovedInfo info = new PackageRemovedInfo(this);
        final boolean res;
@@ -18938,7 +18942,7 @@ public class PackageManagerService extends IPackageManager.Stub
        if (res) {
            final boolean killApp = (deleteFlags & PackageManager.DELETE_DONT_KILL_APP) == 0;
            info.sendPackageRemovedBroadcasts(killApp);
            info.sendPackageRemovedBroadcasts(killApp, removedBySystem);
            info.sendSystemPackageUpdatedBroadcasts();
        }
        // Force a gc here.
@@ -19014,8 +19018,8 @@ public class PackageManagerService extends IPackageManager.Stub
            this.packageSender = packageSender;
        }
        void sendPackageRemovedBroadcasts(boolean killApp) {
            sendPackageRemovedBroadcastInternal(killApp);
        void sendPackageRemovedBroadcasts(boolean killApp, boolean removedBySystem) {
            sendPackageRemovedBroadcastInternal(killApp, removedBySystem);
        }
        void sendSystemPackageUpdatedBroadcasts() {
@@ -19044,7 +19048,7 @@ public class PackageManagerService extends IPackageManager.Stub
            }
        }
        private void sendPackageRemovedBroadcastInternal(boolean killApp) {
        private void sendPackageRemovedBroadcastInternal(boolean killApp, boolean removedBySystem) {
            // Don't send static shared library removal broadcasts as these
            // libs are visible only the the apps that depend on them an one
            // cannot remove the library if it has a dependency.
@@ -19056,6 +19060,7 @@ public class PackageManagerService extends IPackageManager.Stub
            extras.putInt(Intent.EXTRA_UID, removedUid);
            extras.putBoolean(Intent.EXTRA_DATA_REMOVED, dataRemoved);
            extras.putBoolean(Intent.EXTRA_DONT_KILL_APP, !killApp);
            extras.putBoolean(Intent.EXTRA_REMOVED_BY_SYSTEM, removedBySystem);
            if (isUpdate || isRemovedPackageSystemUpdate) {
                extras.putBoolean(Intent.EXTRA_REPLACING, true);
            }
@@ -23972,7 +23977,7 @@ public class PackageManagerService extends IPackageManager.Stub
                }
                //end run
                mHandler.post(() -> deletePackageX(packageName, PackageManager.VERSION_CODE_HIGHEST,
                        userId, 0));
                        userId, 0, true /*removedBySystem*/));
            }
        }
    }
@@ -24202,7 +24207,7 @@ public class PackageManagerService extends IPackageManager.Stub
            // It is currently possible that the package will be deleted even if it is installed
            // after this method returns.
            mHandler.post(() -> deletePackageX(packageName, PackageManager.VERSION_CODE_HIGHEST,
                    0, PackageManager.DELETE_ALL_USERS));
                    0, PackageManager.DELETE_ALL_USERS, true /*removedBySystem*/));
        }
    }