Use session id to search for rollbacks (2/n) am: 635382efc6
Change-Id: I17a0c7dad58bf33638011a97431eea5630a28b9e
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user