diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index f3d5f6e84113e..0f434803ee4b9 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -613,8 +613,8 @@ final class InstallPackageHelper { Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } - public int installExistingPackageAsUser(@Nullable String packageName, @UserIdInt int userId, - @PackageManager.InstallFlags int installFlags, + public Pair installExistingPackageAsUser(@Nullable String packageName, + @UserIdInt int userId, @PackageManager.InstallFlags int installFlags, @PackageManager.InstallReason int installReason, @Nullable List allowlistedRestrictedPermissions, @Nullable IntentSender intentSender) { @@ -639,7 +639,7 @@ final class InstallPackageHelper { true /* requireFullPermission */, true /* checkShell */, "installExistingPackage for user " + userId); if (mPm.isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) { - return PackageManager.INSTALL_FAILED_USER_RESTRICTED; + return Pair.create(PackageManager.INSTALL_FAILED_USER_RESTRICTED, intentSender); } final long callingId = Binder.clearCallingIdentity(); @@ -655,7 +655,7 @@ final class InstallPackageHelper { final Computer snapshot = mPm.snapshotComputer(); pkgSetting = mPm.mSettings.getPackageLPr(packageName); if (pkgSetting == null || pkgSetting.getPkg() == null) { - return PackageManager.INSTALL_FAILED_INVALID_URI; + return Pair.create(PackageManager.INSTALL_FAILED_INVALID_URI, intentSender); } if (!snapshot.canViewInstantApps(callingUid, UserHandle.getUserId(callingUid))) { // only allow the existing package to be used if it's installed as a full @@ -668,7 +668,7 @@ final class InstallPackageHelper { } } if (!installAllowed) { - return PackageManager.INSTALL_FAILED_INVALID_URI; + return Pair.create(PackageManager.INSTALL_FAILED_INVALID_URI, intentSender); } } if (!pkgSetting.getInstalled(userId)) { @@ -726,14 +726,17 @@ final class InstallPackageHelper { } // start async restore with no post-install since we finish install here + final IntentSender onCompleteSender = intentSender; + intentSender = null; + InstallRequest request = new InstallRequest(userId, PackageManager.INSTALL_SUCCEEDED, pkgSetting.getPkg(), new int[]{ userId }, () -> { mPm.restorePermissionsAndUpdateRolesForNewUserInstall(packageName, userId); - if (intentSender != null) { - onRestoreComplete(PackageManager.INSTALL_SUCCEEDED, mContext, - intentSender); + if (onCompleteSender != null) { + onInstallComplete(PackageManager.INSTALL_SUCCEEDED, mContext, + onCompleteSender); } }); restoreAndPostInstall(request); @@ -742,10 +745,10 @@ final class InstallPackageHelper { Binder.restoreCallingIdentity(callingId); } - return PackageManager.INSTALL_SUCCEEDED; + return Pair.create(PackageManager.INSTALL_SUCCEEDED, intentSender); } - private static void onRestoreComplete(int returnCode, Context context, IntentSender target) { + static void onInstallComplete(int returnCode, Context context, IntentSender target) { Intent fillIn = new Intent(); fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageManager.installStatusToPublicStatus(returnCode)); diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index e8bf82fb80b47..a18d5082e5f18 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -1292,8 +1292,15 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements public void installExistingPackage(String packageName, int installFlags, int installReason, IntentSender statusReceiver, int userId, List allowListedPermissions) { final InstallPackageHelper installPackageHelper = new InstallPackageHelper(mPm); - installPackageHelper.installExistingPackageAsUser(packageName, userId, installFlags, - installReason, allowListedPermissions, statusReceiver); + + var result = installPackageHelper.installExistingPackageAsUser(packageName, userId, + installFlags, installReason, allowListedPermissions, statusReceiver); + + int returnCode = result.first; + IntentSender onCompleteSender = result.second; + if (onCompleteSender != null) { + InstallPackageHelper.onInstallComplete(returnCode, mContext, onCompleteSender); + } } @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 4ddc7e4b44ee1..818d973a3809a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5342,7 +5342,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService public int installExistingPackageAsUser(String packageName, int userId, int installFlags, int installReason, List whiteListedPermissions) { return mInstallPackageHelper.installExistingPackageAsUser(packageName, userId, installFlags, - installReason, whiteListedPermissions, null); + installReason, whiteListedPermissions, null).first; } @Override