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

This commit is contained in:
Patrick Baumann
2021-06-22 20:20:27 +00:00
committed by Android (Google) Code Review

View File

@@ -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<>();
} else { for (int i = 0; i < allUsers.length; i++) {
freezeUser = removeUser; 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) { 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;