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

Commit 60ac706f authored by Richard Uhler's avatar Richard Uhler
Browse files

Add isAvailable flag to RollbackData.

To distinguish between rollbacks of staged sessions before and after the
session has been applied.

Bug: 112431924
Test: atest RollbackTest
Change-Id: I93d6af4836933c0b551e17479ec896639ca0740e
parent 7a5eeb1a
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -55,6 +55,14 @@ class RollbackData {
     */
    public int stagedSessionId;

    /**
     * A flag to indicate whether the rollback should be considered available
     * for use. This will always be true for rollbacks of non-staged sessions.
     * For rollbacks of staged sessions, this is not set to true until after
     * the staged session has been applied.
     */
    public boolean isAvailable;

    /**
     * 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
@@ -63,10 +71,11 @@ class RollbackData {
    // NOTE: All accesses to this field are from the RollbackManager handler thread.
    public boolean inProgress = false;

    RollbackData(int rollbackId, File backupDir, int stagedSessionId) {
    RollbackData(int rollbackId, File backupDir, int stagedSessionId, boolean isAvailable) {
        this.rollbackId = rollbackId;
        this.backupDir = backupDir;
        this.stagedSessionId = stagedSessionId;
        this.isAvailable = isAvailable;
    }

    /**
+10 −3
Original line number Diff line number Diff line
@@ -221,7 +221,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
            List<RollbackInfo> rollbacks = new ArrayList<>();
            for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
                RollbackData data = mAvailableRollbacks.get(i);
                rollbacks.add(new RollbackInfo(data.rollbackId, data.packages, data.isStaged()));
                if (data.isAvailable) {
                    rollbacks.add(new RollbackInfo(data.rollbackId,
                                data.packages, data.isStaged()));
                }
            }
            return new ParceledListSlice<>(rollbacks);
        }
@@ -655,6 +658,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
            Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
            while (iter.hasNext()) {
                RollbackData data = iter.next();
                if (!data.isAvailable) {
                    continue;
                }

                if (!now.isBefore(data.timestamp.plusMillis(ROLLBACK_LIFETIME_DURATION_MILLIS))) {
                    iter.remove();
                    mRollbackStore.deleteAvailableRollback(data);
@@ -1064,7 +1071,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
            ensureRollbackDataLoadedLocked();
            for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
                RollbackData data = mAvailableRollbacks.get(i);
                if (getPackageRollbackInfo(data, packageName) != null) {
                if (data.isAvailable && getPackageRollbackInfo(data, packageName) != null) {
                    return data;
                }
            }
@@ -1083,7 +1090,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
            ensureRollbackDataLoadedLocked();
            for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
                RollbackData data = mAvailableRollbacks.get(i);
                if (data.rollbackId == rollbackId) {
                if (data.isAvailable && data.rollbackId == rollbackId) {
                    return data;
                }
            }
+5 −3
Original line number Diff line number Diff line
@@ -201,13 +201,13 @@ class RollbackStore {
     */
    RollbackData createAvailableRollback(int rollbackId) throws IOException {
        File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId));
        return new RollbackData(rollbackId, backupDir, -1);
        return new RollbackData(rollbackId, backupDir, -1, true);
    }

    RollbackData createPendingStagedRollback(int rollbackId, int stagedSessionId)
            throws IOException {
        File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId));
        return new RollbackData(rollbackId, backupDir, stagedSessionId);
        return new RollbackData(rollbackId, backupDir, stagedSessionId, false);
    }

    /**
@@ -247,6 +247,7 @@ class RollbackStore {
            dataJson.put("packages", toJson(data.packages));
            dataJson.put("timestamp", data.timestamp.toString());
            dataJson.put("stagedSessionId", data.stagedSessionId);
            dataJson.put("isAvailable", data.isAvailable);

            PrintWriter pw = new PrintWriter(new File(data.backupDir, "rollback.json"));
            pw.println(dataJson.toString());
@@ -307,8 +308,9 @@ class RollbackStore {

            int rollbackId = dataJson.getInt("rollbackId");
            int stagedSessionId = dataJson.getInt("stagedSessionId");
            boolean isAvailable = dataJson.getBoolean("isAvailable");
            RollbackData data = new RollbackData(rollbackId, backupDir,
                    stagedSessionId);
                    stagedSessionId, isAvailable);
            data.packages.addAll(packageRollbackInfosFromJson(dataJson.getJSONArray("packages")));
            data.timestamp = Instant.parse(dataJson.getString("timestamp"));
            return data;
+1 −1
Original line number Diff line number Diff line
@@ -80,7 +80,7 @@ public class AppDataRollbackHelperTest {
    }

    private static RollbackData createInProgressRollbackData(String packageName) {
        RollbackData data = new RollbackData(1, new File("/does/not/exist"), -1);
        RollbackData data = new RollbackData(1, new File("/does/not/exist"), -1, true);
        data.packages.add(new PackageRollbackInfo(
                new VersionedPackage(packageName, 1), new VersionedPackage(packageName, 1),
                new IntArray(), new ArrayList<>(), false));