diff --git a/services/core/java/com/android/server/rollback/RollbackData.java b/services/core/java/com/android/server/rollback/RollbackData.java index 80d3c8358bea3..f45666574ed78 100644 --- a/services/core/java/com/android/server/rollback/RollbackData.java +++ b/services/core/java/com/android/server/rollback/RollbackData.java @@ -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; } /** diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 85287ef9e6645..438e47964c5e7 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -221,7 +221,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { List 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 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; } } diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java index ff516902a5b35..1e45ba2e495cf 100644 --- a/services/core/java/com/android/server/rollback/RollbackStore.java +++ b/services/core/java/com/android/server/rollback/RollbackStore.java @@ -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; diff --git a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java index f1e6bc25dabfb..43e3eb0193b1f 100644 --- a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java @@ -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));