Merge "Add check to delete app in child only if present." into udc-dev

This commit is contained in:
Ankita Vyas
2023-03-17 08:02:31 +00:00
committed by Android (Google) Code Review

View File

@@ -19,6 +19,7 @@ package com.android.server.pm;
import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS; import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import static android.content.pm.PackageManager.DELETE_SUCCEEDED;
import static android.content.pm.PackageManager.MATCH_KNOWN_PACKAGES; import static android.content.pm.PackageManager.MATCH_KNOWN_PACKAGES;
import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.storage.StorageManager.FLAG_STORAGE_CE; import static android.os.storage.StorageManager.FLAG_STORAGE_CE;
@@ -339,7 +340,7 @@ final class DeletePackageHelper {
packageInstallerService.onInstallerPackageDeleted(uninstalledPs.getAppId(), removeUser); packageInstallerService.onInstallerPackageDeleted(uninstalledPs.getAppId(), removeUser);
} }
return res ? PackageManager.DELETE_SUCCEEDED : PackageManager.DELETE_FAILED_INTERNAL_ERROR; return res ? DELETE_SUCCEEDED : PackageManager.DELETE_FAILED_INTERNAL_ERROR;
} }
/* /*
@@ -777,24 +778,33 @@ final class DeletePackageHelper {
returnCode = deletePackageX(internalPackageName, versionCode, returnCode = deletePackageX(internalPackageName, versionCode,
userId, deleteFlags, false /*removedBySystem*/); userId, deleteFlags, false /*removedBySystem*/);
// Delete package in child only if successfully deleted in parent.
if (returnCode == DELETE_SUCCEEDED && packageState != null) {
// Get a list of child user profiles and delete if package is // Get a list of child user profiles and delete if package is
// present in that profile. // present in that profile.
int[] childUserIds = mUserManagerInternal.getProfileIds(userId, true); int[] childUserIds = mUserManagerInternal.getProfileIds(userId, true);
int returnCodeOfChild; int returnCodeOfChild;
for (int childId : childUserIds) { for (int childId : childUserIds) {
if (childId == userId) continue; if (childId == userId) continue;
// If package is not present in child then don't attempt to delete.
if (!packageState.getUserStateOrDefault(childId).isInstalled()) {
continue;
}
UserProperties userProperties = mUserManagerInternal UserProperties userProperties = mUserManagerInternal
.getUserProperties(childId); .getUserProperties(childId);
if (userProperties != null && userProperties.getDeleteAppWithParent()) { if (userProperties != null && userProperties.getDeleteAppWithParent()) {
returnCodeOfChild = deletePackageX(internalPackageName, versionCode, returnCodeOfChild = deletePackageX(internalPackageName, versionCode,
childId, deleteFlags, false /*removedBySystem*/); childId, deleteFlags, false /*removedBySystem*/);
if (returnCodeOfChild != PackageManager.DELETE_SUCCEEDED) { if (returnCodeOfChild != DELETE_SUCCEEDED) {
Slog.w(TAG, "Package delete failed for user " + childId Slog.w(TAG, "Package delete failed for user " + childId
+ ", returnCode " + returnCodeOfChild); + ", returnCode " + returnCodeOfChild);
returnCode = PackageManager.DELETE_FAILED_FOR_CHILD_PROFILE; returnCode = PackageManager.DELETE_FAILED_FOR_CHILD_PROFILE;
} }
} }
} }
}
} else { } else {
int[] blockUninstallUserIds = getBlockUninstallForUsers(innerSnapshot, int[] blockUninstallUserIds = getBlockUninstallForUsers(innerSnapshot,
internalPackageName, users); internalPackageName, users);
@@ -809,7 +819,7 @@ final class DeletePackageHelper {
if (!ArrayUtils.contains(blockUninstallUserIds, userId1)) { if (!ArrayUtils.contains(blockUninstallUserIds, userId1)) {
returnCode = deletePackageX(internalPackageName, versionCode, returnCode = deletePackageX(internalPackageName, versionCode,
userId1, userFlags, false /*removedBySystem*/); userId1, userFlags, false /*removedBySystem*/);
if (returnCode != PackageManager.DELETE_SUCCEEDED) { if (returnCode != DELETE_SUCCEEDED) {
Slog.w(TAG, "Package delete failed for user " + userId1 Slog.w(TAG, "Package delete failed for user " + userId1
+ ", returnCode " + returnCode); + ", returnCode " + returnCode);
} }