Loading services/core/java/com/android/server/pm/InstallPackageHelper.java +20 −9 Original line number Original line Diff line number Diff line Loading @@ -829,7 +829,8 @@ final class InstallPackageHelper { if (DEBUG_INSTALL) Log.v(TAG, "+ starting restore round-trip " + token); if (DEBUG_INSTALL) Log.v(TAG, "+ starting restore round-trip " + token); if (request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED && doRestore) { final boolean succeeded = request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED; if (succeeded && doRestore) { // Pass responsibility to the Backup Manager. It will perform a // Pass responsibility to the Backup Manager. It will perform a // restore if appropriate, then pass responsibility back to the // restore if appropriate, then pass responsibility back to the // Package Manager to run the post-install observer callbacks // Package Manager to run the post-install observer callbacks Loading @@ -843,10 +844,27 @@ final class InstallPackageHelper { // need to be snapshotted or restored for the package. // need to be snapshotted or restored for the package. // // // TODO(narayan): Get this working for cases where userId == UserHandle.USER_ALL. // TODO(narayan): Get this working for cases where userId == UserHandle.USER_ALL. if (request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED && !doRestore && update) { if (succeeded && !doRestore && update) { doRestore = performRollbackManagerRestore(userId, token, request); doRestore = performRollbackManagerRestore(userId, token, request); } } if (succeeded && !request.hasPostInstallRunnable()) { boolean hasNeverBeenRestored = packageSetting != null && packageSetting.isPendingRestore(); request.setPostInstallRunnable(() -> { // Permissions should be restored on each user that has the app installed for the // first time, unless it's an unarchive install for an archived app, in which case // the permissions should be restored on each user that has the app updated. int[] userIdsToRestorePermissions = hasNeverBeenRestored ? request.getUpdateBroadcastUserIds() : request.getFirstTimeBroadcastUserIds(); for (int restorePermissionUserId : userIdsToRestorePermissions) { mPm.restorePermissionsAndUpdateRolesForNewUserInstall(request.getName(), restorePermissionUserId); } }); } if (doRestore) { if (doRestore) { if (packageSetting != null) { if (packageSetting != null) { synchronized (mPm.mLock) { synchronized (mPm.mLock) { Loading Loading @@ -2851,7 +2869,6 @@ final class InstallPackageHelper { mPm.notifyInstantAppPackageInstalled(request.getPkg().getPackageName(), mPm.notifyInstantAppPackageInstalled(request.getPkg().getPackageName(), request.getNewUsers()); request.getNewUsers()); request.populateBroadcastUsers(); final int[] firstUserIds = request.getFirstTimeBroadcastUserIds(); final int[] firstUserIds = request.getFirstTimeBroadcastUserIds(); if (request.getPkg().getStaticSharedLibraryName() == null) { if (request.getPkg().getStaticSharedLibraryName() == null) { Loading @@ -2863,12 +2880,6 @@ final class InstallPackageHelper { mPm.mRequiredInstallerPackage, mPm.mRequiredInstallerPackage, /* packageSender= */ mPm, launchedForRestore, killApp, update, archived); /* packageSender= */ mPm, launchedForRestore, killApp, update, archived); // Work that needs to happen on first install within each user for (int userId : firstUserIds) { mPm.restorePermissionsAndUpdateRolesForNewUserInstall(packageName, userId); } if (request.isAllNewUsers() && !update) { if (request.isAllNewUsers() && !update) { mPm.notifyPackageAdded(packageName, request.getAppId()); mPm.notifyPackageAdded(packageName, request.getAppId()); } else { } else { Loading services/core/java/com/android/server/pm/InstallRequest.java +13 −3 Original line number Original line Diff line number Diff line Loading @@ -692,6 +692,14 @@ final class InstallRequest { } } } } public void setPostInstallRunnable(Runnable runnable) { mPostInstallRunnable = runnable; } public boolean hasPostInstallRunnable() { return mPostInstallRunnable != null; } public void runPostInstallRunnable() { public void runPostInstallRunnable() { if (mPostInstallRunnable != null) { if (mPostInstallRunnable != null) { mPostInstallRunnable.run(); mPostInstallRunnable.run(); Loading Loading @@ -753,6 +761,7 @@ final class InstallRequest { public void setNewUsers(int[] newUsers) { public void setNewUsers(int[] newUsers) { mNewUsers = newUsers; mNewUsers = newUsers; populateBroadcastUsers(); } } public void setOriginPackage(String originPackage) { public void setOriginPackage(String originPackage) { Loading Loading @@ -829,10 +838,11 @@ final class InstallRequest { } } /** /** * Determine the set of users who are adding this package for the first time vs. those who are * Determine the set of users who are adding this package for the first time (aka "new" users) * seeing an update. * vs. those who are seeing an update (aka "update" users). The lists can be calculated as soon * as the "new" users are set. */ */ public void populateBroadcastUsers() { private void populateBroadcastUsers() { assertScanResultExists(); assertScanResultExists(); mFirstTimeBroadcastUserIds = EMPTY_INT_ARRAY; mFirstTimeBroadcastUserIds = EMPTY_INT_ARRAY; mFirstTimeBroadcastInstantUserIds = EMPTY_INT_ARRAY; mFirstTimeBroadcastInstantUserIds = EMPTY_INT_ARRAY; Loading Loading
services/core/java/com/android/server/pm/InstallPackageHelper.java +20 −9 Original line number Original line Diff line number Diff line Loading @@ -829,7 +829,8 @@ final class InstallPackageHelper { if (DEBUG_INSTALL) Log.v(TAG, "+ starting restore round-trip " + token); if (DEBUG_INSTALL) Log.v(TAG, "+ starting restore round-trip " + token); if (request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED && doRestore) { final boolean succeeded = request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED; if (succeeded && doRestore) { // Pass responsibility to the Backup Manager. It will perform a // Pass responsibility to the Backup Manager. It will perform a // restore if appropriate, then pass responsibility back to the // restore if appropriate, then pass responsibility back to the // Package Manager to run the post-install observer callbacks // Package Manager to run the post-install observer callbacks Loading @@ -843,10 +844,27 @@ final class InstallPackageHelper { // need to be snapshotted or restored for the package. // need to be snapshotted or restored for the package. // // // TODO(narayan): Get this working for cases where userId == UserHandle.USER_ALL. // TODO(narayan): Get this working for cases where userId == UserHandle.USER_ALL. if (request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED && !doRestore && update) { if (succeeded && !doRestore && update) { doRestore = performRollbackManagerRestore(userId, token, request); doRestore = performRollbackManagerRestore(userId, token, request); } } if (succeeded && !request.hasPostInstallRunnable()) { boolean hasNeverBeenRestored = packageSetting != null && packageSetting.isPendingRestore(); request.setPostInstallRunnable(() -> { // Permissions should be restored on each user that has the app installed for the // first time, unless it's an unarchive install for an archived app, in which case // the permissions should be restored on each user that has the app updated. int[] userIdsToRestorePermissions = hasNeverBeenRestored ? request.getUpdateBroadcastUserIds() : request.getFirstTimeBroadcastUserIds(); for (int restorePermissionUserId : userIdsToRestorePermissions) { mPm.restorePermissionsAndUpdateRolesForNewUserInstall(request.getName(), restorePermissionUserId); } }); } if (doRestore) { if (doRestore) { if (packageSetting != null) { if (packageSetting != null) { synchronized (mPm.mLock) { synchronized (mPm.mLock) { Loading Loading @@ -2851,7 +2869,6 @@ final class InstallPackageHelper { mPm.notifyInstantAppPackageInstalled(request.getPkg().getPackageName(), mPm.notifyInstantAppPackageInstalled(request.getPkg().getPackageName(), request.getNewUsers()); request.getNewUsers()); request.populateBroadcastUsers(); final int[] firstUserIds = request.getFirstTimeBroadcastUserIds(); final int[] firstUserIds = request.getFirstTimeBroadcastUserIds(); if (request.getPkg().getStaticSharedLibraryName() == null) { if (request.getPkg().getStaticSharedLibraryName() == null) { Loading @@ -2863,12 +2880,6 @@ final class InstallPackageHelper { mPm.mRequiredInstallerPackage, mPm.mRequiredInstallerPackage, /* packageSender= */ mPm, launchedForRestore, killApp, update, archived); /* packageSender= */ mPm, launchedForRestore, killApp, update, archived); // Work that needs to happen on first install within each user for (int userId : firstUserIds) { mPm.restorePermissionsAndUpdateRolesForNewUserInstall(packageName, userId); } if (request.isAllNewUsers() && !update) { if (request.isAllNewUsers() && !update) { mPm.notifyPackageAdded(packageName, request.getAppId()); mPm.notifyPackageAdded(packageName, request.getAppId()); } else { } else { Loading
services/core/java/com/android/server/pm/InstallRequest.java +13 −3 Original line number Original line Diff line number Diff line Loading @@ -692,6 +692,14 @@ final class InstallRequest { } } } } public void setPostInstallRunnable(Runnable runnable) { mPostInstallRunnable = runnable; } public boolean hasPostInstallRunnable() { return mPostInstallRunnable != null; } public void runPostInstallRunnable() { public void runPostInstallRunnable() { if (mPostInstallRunnable != null) { if (mPostInstallRunnable != null) { mPostInstallRunnable.run(); mPostInstallRunnable.run(); Loading Loading @@ -753,6 +761,7 @@ final class InstallRequest { public void setNewUsers(int[] newUsers) { public void setNewUsers(int[] newUsers) { mNewUsers = newUsers; mNewUsers = newUsers; populateBroadcastUsers(); } } public void setOriginPackage(String originPackage) { public void setOriginPackage(String originPackage) { Loading Loading @@ -829,10 +838,11 @@ final class InstallRequest { } } /** /** * Determine the set of users who are adding this package for the first time vs. those who are * Determine the set of users who are adding this package for the first time (aka "new" users) * seeing an update. * vs. those who are seeing an update (aka "update" users). The lists can be calculated as soon * as the "new" users are set. */ */ public void populateBroadcastUsers() { private void populateBroadcastUsers() { assertScanResultExists(); assertScanResultExists(); mFirstTimeBroadcastUserIds = EMPTY_INT_ARRAY; mFirstTimeBroadcastUserIds = EMPTY_INT_ARRAY; mFirstTimeBroadcastInstantUserIds = EMPTY_INT_ARRAY; mFirstTimeBroadcastInstantUserIds = EMPTY_INT_ARRAY; Loading