Use session id to search for rollbacks (2/n) am: 635382efc6

Change-Id: I17a0c7dad58bf33638011a97431eea5630a28b9e
This commit is contained in:
Automerger Merge Worker
2020-02-28 06:55:26 +00:00

View File

@@ -205,14 +205,16 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_INSTALL_FLAGS, 0); PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_INSTALL_FLAGS, 0);
int user = intent.getIntExtra( int user = intent.getIntExtra(
PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_USER, 0); PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_USER, 0);
int sessionId = intent.getIntExtra(
PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_SESSION_ID, -1);
File newPackageCodePath = new File(intent.getData().getPath()); File newPackageCodePath = new File(intent.getData().getPath());
queueSleepIfNeeded(); queueSleepIfNeeded();
getHandler().post(() -> { getHandler().post(() -> {
boolean success = boolean success = enableRollback(
enableRollback(installFlags, newPackageCodePath, user, token); sessionId, installFlags, newPackageCodePath, user, token);
int ret = PackageManagerInternal.ENABLE_ROLLBACK_SUCCEEDED; int ret = PackageManagerInternal.ENABLE_ROLLBACK_SUCCEEDED;
if (!success) { if (!success) {
ret = PackageManagerInternal.ENABLE_ROLLBACK_FAILED; ret = PackageManagerInternal.ENABLE_ROLLBACK_FAILED;
@@ -240,17 +242,16 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
if (Intent.ACTION_CANCEL_ENABLE_ROLLBACK.equals(intent.getAction())) { if (Intent.ACTION_CANCEL_ENABLE_ROLLBACK.equals(intent.getAction())) {
int token = intent.getIntExtra( int token = intent.getIntExtra(
PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_TOKEN, -1); PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_TOKEN, -1);
int sessionId = intent.getIntExtra(
PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_SESSION_ID, -1);
if (LOCAL_LOGV) { if (LOCAL_LOGV) {
Slog.v(TAG, "broadcast=ACTION_CANCEL_ENABLE_ROLLBACK token=" + token); Slog.v(TAG, "broadcast=ACTION_CANCEL_ENABLE_ROLLBACK token=" + token);
} }
synchronized (mLock) { synchronized (mLock) {
for (int i = 0; i < mRollbacks.size(); ++i) { Rollback rollback = getRollbackForSessionLocked(sessionId);
Rollback rollback = mRollbacks.get(i); if (rollback != null && rollback.isEnabling()) {
if (rollback.hasToken(token) && rollback.isEnabling()) { mRollbacks.remove(rollback);
mRollbacks.remove(i);
rollback.delete(mAppDataRollbackHelper); rollback.delete(mAppDataRollbackHelper);
break;
}
} }
} }
} }
@@ -723,51 +724,24 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
* @return true if enabling the rollback succeeds, false otherwise. * @return true if enabling the rollback succeeds, false otherwise.
*/ */
@WorkerThread @WorkerThread
private boolean enableRollback( private boolean enableRollback(int sessionId,
int installFlags, File newPackageCodePath, @UserIdInt int user, int token) { int installFlags, File newPackageCodePath, @UserIdInt int user, int token) {
if (LOCAL_LOGV) { if (LOCAL_LOGV) {
Slog.v(TAG, "enableRollback user=" + user + " token=" + token Slog.v(TAG, "enableRollback user=" + user + " token=" + token
+ " path=" + newPackageCodePath.getAbsolutePath()); + " path=" + newPackageCodePath.getAbsolutePath());
} }
// Find the session id associated with this install. PackageInstaller installer = mContext.getPackageManager().getPackageInstaller();
// TODO: It would be nice if package manager or package installer told PackageInstaller.SessionInfo packageSession = installer.getSessionInfo(sessionId);
// us the session directly, rather than have to search for it if (packageSession == null) {
// ourselves. Slog.e(TAG, "Unable to find session for enabled rollback.");
// getAllSessions only returns sessions for the associated user.
// Create a context with the right user so we can find the matching
// session.
final Context context = getContextAsUser(UserHandle.of(user));
if (context == null) {
Slog.e(TAG, "Unable to create context for install session user.");
return false; return false;
} }
PackageInstaller.SessionInfo parentSession = null; PackageInstaller.SessionInfo parentSession = packageSession.hasParentSessionId()
PackageInstaller.SessionInfo packageSession = null; ? installer.getSessionInfo(packageSession.getParentSessionId()) : packageSession;
PackageInstaller installer = context.getPackageManager().getPackageInstaller(); if (parentSession == null) {
for (PackageInstaller.SessionInfo info : installer.getAllSessions()) { Slog.e(TAG, "Unable to find parent session for enabled rollback.");
if (info.isMultiPackage()) {
for (int childId : info.getChildSessionIds()) {
PackageInstaller.SessionInfo child = installer.getSessionInfo(childId);
if (sessionMatchesForEnableRollback(child, installFlags, newPackageCodePath)) {
// TODO: Check we only have one matching session?
parentSession = info;
packageSession = child;
break;
}
}
} else if (sessionMatchesForEnableRollback(info, installFlags, newPackageCodePath)) {
// TODO: Check we only have one matching session?
parentSession = info;
packageSession = info;
break;
}
}
if (parentSession == null || packageSession == null) {
Slog.e(TAG, "Unable to find session for enabled rollback.");
return false; return false;
} }