Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 70244c68 authored by Narayan Kamath's avatar Narayan Kamath Committed by Android (Google) Code Review
Browse files

Merge "RollbackManager: Keep track of "in progress" rollbacks."

parents 9e063227 bc36f8d1
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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;
+21 −6
Original line number Diff line number Diff line
@@ -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;
        }

@@ -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) {
@@ -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);
@@ -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;
            }