Loading services/core/java/com/android/server/rollback/RollbackData.java +8 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,14 @@ class RollbackData { */ public Instant timestamp; /** * Whether this Rollback is currently in progress. This field is true from the point * we commit a {@code PackageInstaller} session containing these packages to the point the * {@code PackageInstaller} calls into the {@code onFinished} callback. */ // NOTE: All accesses to this field are from the RollbackManager handler thread. public boolean inProgress = false; RollbackData(int rollbackId, File backupDir) { this.rollbackId = rollbackId; this.backupDir = backupDir; Loading services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +21 −6 Original line number Diff line number Diff line Loading @@ -285,14 +285,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { Log.i(TAG, "Initiating rollback of " + targetPackageName); // Get the latest RollbackData for the target package. RollbackData data = getRollbackForPackage(targetPackageName); final RollbackData data = getRollbackForPackage(targetPackageName); if (data == null) { sendFailure(statusReceiver, "No rollback available for package."); return; } if (data.rollbackId != rollback.getRollbackId()) { sendFailure(statusReceiver, "Rollback for package is out of date"); sendFailure(statusReceiver, "Rollback for package is out of date."); return; } if (data.inProgress) { sendFailure(statusReceiver, "Rollback for package is already in progress."); return; } Loading Loading @@ -371,6 +376,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { final LocalIntentReceiver receiver = new LocalIntentReceiver( (Intent result) -> { // We've now completed the rollback, so we mark it as no longer in // progress. data.inProgress = false; int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE); if (status != PackageInstaller.STATUS_SUCCESS) { Loading @@ -392,6 +401,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } ); data.inProgress = true; parentSession.commit(receiver.getIntentSender()); } catch (IOException e) { Log.e(TAG, "Unable to roll back " + targetPackageName, e); Loading Loading @@ -774,10 +784,15 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { getHandler().post(() -> { PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class); // TODO(narayan): Should we make sure we're in the middle of a session commit for a // a package with this package name ? Otherwise it's possible we may roll back data // for some other downgrade. if (getRollbackForPackage(packageName) == null) { final RollbackData rollbackData = getRollbackForPackage(packageName); if (rollbackData == null) { pmi.finishPackageInstall(token, false); return; } if (!rollbackData.inProgress) { Log.e(TAG, "Request to restore userData for: " + packageName + ", but no rollback in progress."); pmi.finishPackageInstall(token, false); return; } Loading Loading
services/core/java/com/android/server/rollback/RollbackData.java +8 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,14 @@ class RollbackData { */ public Instant timestamp; /** * Whether this Rollback is currently in progress. This field is true from the point * we commit a {@code PackageInstaller} session containing these packages to the point the * {@code PackageInstaller} calls into the {@code onFinished} callback. */ // NOTE: All accesses to this field are from the RollbackManager handler thread. public boolean inProgress = false; RollbackData(int rollbackId, File backupDir) { this.rollbackId = rollbackId; this.backupDir = backupDir; Loading
services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +21 −6 Original line number Diff line number Diff line Loading @@ -285,14 +285,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { Log.i(TAG, "Initiating rollback of " + targetPackageName); // Get the latest RollbackData for the target package. RollbackData data = getRollbackForPackage(targetPackageName); final RollbackData data = getRollbackForPackage(targetPackageName); if (data == null) { sendFailure(statusReceiver, "No rollback available for package."); return; } if (data.rollbackId != rollback.getRollbackId()) { sendFailure(statusReceiver, "Rollback for package is out of date"); sendFailure(statusReceiver, "Rollback for package is out of date."); return; } if (data.inProgress) { sendFailure(statusReceiver, "Rollback for package is already in progress."); return; } Loading Loading @@ -371,6 +376,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { final LocalIntentReceiver receiver = new LocalIntentReceiver( (Intent result) -> { // We've now completed the rollback, so we mark it as no longer in // progress. data.inProgress = false; int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE); if (status != PackageInstaller.STATUS_SUCCESS) { Loading @@ -392,6 +401,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } ); data.inProgress = true; parentSession.commit(receiver.getIntentSender()); } catch (IOException e) { Log.e(TAG, "Unable to roll back " + targetPackageName, e); Loading Loading @@ -774,10 +784,15 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { getHandler().post(() -> { PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class); // TODO(narayan): Should we make sure we're in the middle of a session commit for a // a package with this package name ? Otherwise it's possible we may roll back data // for some other downgrade. if (getRollbackForPackage(packageName) == null) { final RollbackData rollbackData = getRollbackForPackage(packageName); if (rollbackData == null) { pmi.finishPackageInstall(token, false); return; } if (!rollbackData.inProgress) { Log.e(TAG, "Request to restore userData for: " + packageName + ", but no rollback in progress."); pmi.finishPackageInstall(token, false); return; } Loading