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

Commit e3ece36d authored by Patrick Baumann's avatar Patrick Baumann Committed by Android (Google) Code Review
Browse files

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

parents 84527707 ab80ca61
Loading
Loading
Loading
Loading
+31 −9
Original line number 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-
        // user handle installed state
        int[] allUsers;
        final int freezeUser;
        final SparseArray<Pair<Integer, String>> enabledStateAndCallerPerUser;
        /** enabled state of the uninstalled application */
        synchronized (mLock) {
            uninstalledPs = mSettings.getPackageLPr(packageName);
@@ -21524,16 +21526,23 @@ public class PackageManagerService extends IPackageManager.Stub
            }
            info.origUsers = uninstalledPs.queryInstalledUsers(allUsers, true);
        }
        final int freezeUser;
            if (isUpdatedSystemApp(uninstalledPs)
                    && ((deleteFlags & PackageManager.DELETE_SYSTEM_APP) == 0)) {
                // We're downgrading a system app, which will apply to all users, so
                // freeze them all during the downgrade
                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 {
                freezeUser = removeUser;
                enabledStateAndCallerPerUser = null;
            }
        }
        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;