diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index e18b2e87222df..38d662aaf9060 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -606,8 +606,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) { @@ -632,7 +632,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(); @@ -648,7 +648,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 @@ -661,7 +661,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)) { @@ -719,14 +719,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); @@ -735,10 +738,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 1641d61af4372..6491fd1b1f98b 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -1293,8 +1293,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 0c52bb5e7ead7..ae520c00d977a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5350,7 +5350,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