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

Commit 4975b9e6 authored by Patrick Baumann's avatar Patrick Baumann Committed by Automerger Merge Worker
Browse files

Merge "Keep enabled state across system uninstall" into sc-dev am: e3ece36d

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

Change-Id: I8cd97cac3cad290de309b89640093da8c7469985
parents 837a6cb7 e3ece36d
Loading
Loading
Loading
Loading
+31 −9
Original line number Original line Diff line number Diff line
@@ -21480,6 +21480,8 @@ public class PackageManagerService extends IPackageManager.Stub
        // for the uninstall-updates case and restricted profiles, remember the per-
        // for the uninstall-updates case and restricted profiles, remember the per-
        // user handle installed state
        // user handle installed state
        int[] allUsers;
        int[] allUsers;
        final int freezeUser;
        final SparseArray<Pair<Integer, String>> enabledStateAndCallerPerUser;
        /** enabled state of the uninstalled application */
        /** enabled state of the uninstalled application */
        synchronized (mLock) {
        synchronized (mLock) {
            uninstalledPs = mSettings.getPackageLPr(packageName);
            uninstalledPs = mSettings.getPackageLPr(packageName);
@@ -21524,16 +21526,23 @@ public class PackageManagerService extends IPackageManager.Stub
            }
            }
            info.origUsers = uninstalledPs.queryInstalledUsers(allUsers, true);
            info.origUsers = uninstalledPs.queryInstalledUsers(allUsers, true);
        }
        final int freezeUser;
            if (isUpdatedSystemApp(uninstalledPs)
            if (isUpdatedSystemApp(uninstalledPs)
                    && ((deleteFlags & PackageManager.DELETE_SYSTEM_APP) == 0)) {
                    && ((deleteFlags & PackageManager.DELETE_SYSTEM_APP) == 0)) {
                // We're downgrading a system app, which will apply to all users, so
                // We're downgrading a system app, which will apply to all users, so
                // freeze them all during the downgrade
                // freeze them all during the downgrade
                freezeUser = UserHandle.USER_ALL;
                freezeUser = UserHandle.USER_ALL;
                enabledStateAndCallerPerUser = new SparseArray<>();
                for (int i = 0; i < allUsers.length; i++) {
                    PackageUserState userState = uninstalledPs.readUserState(allUsers[i]);
                    Pair<Integer, String> enabledStateAndCaller =
                            new Pair<>(userState.enabled, userState.lastDisableAppCaller);
                    enabledStateAndCallerPerUser.put(allUsers[i], enabledStateAndCaller);
                }
            } else {
            } else {
                freezeUser = removeUser;
                freezeUser = removeUser;
                enabledStateAndCallerPerUser = null;
            }
        }
        }
        synchronized (mInstallLock) {
        synchronized (mInstallLock) {
@@ -21602,6 +21611,19 @@ public class PackageManagerService extends IPackageManager.Stub
                    }
                    }
                }
                }
            }
            }
            if (enabledStateAndCallerPerUser != null) {
                synchronized (mLock) {
                    for (int i = 0; i < allUsers.length; i++) {
                        Pair<Integer, String> enabledStateAndCaller =
                                enabledStateAndCallerPerUser.get(allUsers[i]);
                        getPackageSetting(packageName)
                                .setEnabled(enabledStateAndCaller.first,
                                        allUsers[i],
                                        enabledStateAndCaller.second);
                    }
                    mSettings.writeAllUsersPackageRestrictionsLPr();
                }
            }
        }
        }
        return res ? PackageManager.DELETE_SUCCEEDED : PackageManager.DELETE_FAILED_INTERNAL_ERROR;
        return res ? PackageManager.DELETE_SUCCEEDED : PackageManager.DELETE_FAILED_INTERNAL_ERROR;