diff options
6 files changed, 156 insertions, 128 deletions
diff --git a/core/java/android/content/rollback/RollbackInfo.java b/core/java/android/content/rollback/RollbackInfo.java index 0cde6ba38099..9459ad366f76 100644 --- a/core/java/android/content/rollback/RollbackInfo.java +++ b/core/java/android/content/rollback/RollbackInfo.java @@ -17,12 +17,10 @@ package android.content.rollback; import android.annotation.SystemApi; -import android.content.pm.PackageInstaller; import android.content.pm.VersionedPackage; import android.os.Parcel; import android.os.Parcelable; -import java.util.Collections; import java.util.List; /** @@ -44,13 +42,7 @@ public final class RollbackInfo implements Parcelable { private final List<VersionedPackage> mCausePackages; private final boolean mIsStaged; - private final int mCommittedSessionId; - - /** @hide */ - public RollbackInfo(int rollbackId, List<PackageRollbackInfo> packages, boolean isStaged) { - this(rollbackId, packages, isStaged, Collections.emptyList(), - PackageInstaller.SessionInfo.INVALID_ID); - } + private int mCommittedSessionId; /** @hide */ public RollbackInfo(int rollbackId, List<PackageRollbackInfo> packages, boolean isStaged, @@ -101,6 +93,14 @@ public final class RollbackInfo implements Parcelable { } /** + * Sets the session ID for the committed rollback for staged rollbacks. + * @hide + */ + public void setCommittedSessionId(int sessionId) { + mCommittedSessionId = sessionId; + } + + /** * Gets the list of package versions that motivated this rollback. * As provided to {@link #commitRollback} when the rollback was committed. * This is only applicable for rollbacks that have been committed. diff --git a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java index e9ccea54fe99..36f18f05c23e 100644 --- a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java +++ b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java @@ -166,7 +166,7 @@ public class AppDataRollbackHelper { List<RollbackData> rd = new ArrayList<>(); for (RollbackData data : availableRollbacks) { - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { final IntArray pendingBackupUsers = info.getPendingBackups(); if (pendingBackupUsers != null) { final int idx = pendingBackupUsers.indexOf(userId); @@ -246,13 +246,13 @@ public class AppDataRollbackHelper { if (!pendingBackupPackages.isEmpty()) { for (RollbackData data : pendingBackups) { - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { final IntArray pendingBackupUsers = info.getPendingBackups(); final int idx = pendingBackupUsers.indexOf(userId); if (idx != -1) { try { long ceSnapshotInode = mInstaller.snapshotAppData(info.getPackageName(), - userId, data.rollbackId, Installer.FLAG_STORAGE_CE); + userId, data.info.getRollbackId(), Installer.FLAG_STORAGE_CE); info.putCeSnapshotInode(userId, ceSnapshotInode); pendingBackupUsers.remove(idx); } catch (InstallerException ie) { diff --git a/services/core/java/com/android/server/rollback/RollbackData.java b/services/core/java/com/android/server/rollback/RollbackData.java index fcd5297f1363..655bf4ab57a7 100644 --- a/services/core/java/com/android/server/rollback/RollbackData.java +++ b/services/core/java/com/android/server/rollback/RollbackData.java @@ -16,12 +16,11 @@ package com.android.server.rollback; -import android.content.rollback.PackageRollbackInfo; +import android.content.rollback.RollbackInfo; import java.io.File; import java.time.Instant; import java.util.ArrayList; -import java.util.List; /** * Information about a rollback available for a set of atomically installed @@ -29,14 +28,9 @@ import java.util.List; */ class RollbackData { /** - * A unique identifier for this rollback. + * The rollback info for this rollback. */ - public final int rollbackId; - - /** - * The per-package rollback information. - */ - public final List<PackageRollbackInfo> packages = new ArrayList<>(); + public final RollbackInfo info; /** * The directory where the rollback data is stored. @@ -69,24 +63,49 @@ class RollbackData { public int apkSessionId = -1; /** - * 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. + * True if we are expecting the package manager to call restoreUserData + * for this rollback because it has just been committed but the rollback + * has not yet been fully applied. */ // NOTE: All accesses to this field are from the RollbackManager handler thread. - public boolean inProgress = false; + public boolean restoreUserDataInProgress = false; - RollbackData(int rollbackId, File backupDir, int stagedSessionId, boolean isAvailable) { - this.rollbackId = rollbackId; + /** + * Constructs a new, empty RollbackData instance. + * + * @param rollbackId the id of the rollback. + * @param backupDir the directory where the rollback data is stored. + * @param stagedSessionId the session id if this is a staged rollback, -1 otherwise. + */ + RollbackData(int rollbackId, File backupDir, int stagedSessionId) { + this.info = new RollbackInfo(rollbackId, + /* packages */ new ArrayList<>(), + /* isStaged */ stagedSessionId != -1, + /* causePackages */ new ArrayList<>(), + /* committedSessionId */ -1); + this.backupDir = backupDir; + this.stagedSessionId = stagedSessionId; + this.isAvailable = (stagedSessionId == -1); + } + + /** + * Constructs a RollbackData instance with full rollback data information. + */ + RollbackData(RollbackInfo info, File backupDir, Instant timestamp, int stagedSessionId, + boolean isAvailable, int apkSessionId, boolean restoreUserDataInProgress) { + this.info = info; this.backupDir = backupDir; + this.timestamp = timestamp; this.stagedSessionId = stagedSessionId; this.isAvailable = isAvailable; + this.apkSessionId = apkSessionId; + this.restoreUserDataInProgress = restoreUserDataInProgress; } /** * Whether the rollback is for rollback of a staged install. */ public boolean isStaged() { - return stagedSessionId != -1; + return info.isStaged(); } } diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 88a5fb48ada4..52d441255da6 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -243,8 +243,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { for (int i = 0; i < mAvailableRollbacks.size(); ++i) { RollbackData data = mAvailableRollbacks.get(i); if (data.isAvailable) { - rollbacks.add(new RollbackInfo(data.rollbackId, - data.packages, data.isStaged())); + rollbacks.add(data.info); } } return new ParceledListSlice<>(rollbacks); @@ -297,12 +296,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { data.timestamp = data.timestamp.plusMillis(timeDifference); try { - mRollbackStore.saveAvailableRollback(data); + mRollbackStore.saveRollbackData(data); } catch (IOException ioe) { // TODO: figure out the right way to deal with this, especially if // it fails for some data and succeeds for others. - Log.e(TAG, "Unable to save rollback info for : " + data.rollbackId, - ioe); + Log.e(TAG, "Unable to save rollback info for : " + + data.info.getRollbackId(), ioe); } } @@ -335,7 +334,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { return; } - if (data.inProgress) { + if (data.restoreUserDataInProgress) { sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE, "Rollback for package is already in progress."); return; @@ -349,7 +348,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { // rollback racing with a roll-forward fix of a buggy package. // Figure out how to ensure we don't commit the rollback if // roll forward happens at the same time. - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { VersionedPackage installedVersion = getInstalledPackageVersion(info.getPackageName()); if (installedVersion == null) { // TODO: Test this case @@ -391,7 +390,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { int parentSessionId = packageInstaller.createSession(parentParams); PackageInstaller.Session parentSession = packageInstaller.openSession(parentSessionId); - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); // TODO: We can't get the installerPackageName for apex @@ -441,7 +440,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { getHandler().post(() -> { // We've now completed the rollback, so we mark it as no longer in // progress. - data.inProgress = false; + data.restoreUserDataInProgress = false; int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE); @@ -453,9 +452,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { return; } - addRecentlyExecutedRollback(new RollbackInfo( - data.rollbackId, data.packages, data.isStaged(), - causePackages, parentSessionId)); + data.info.setCommittedSessionId(parentSessionId); + data.info.getCausePackages().addAll(causePackages); + addRecentlyExecutedRollback(data.info); sendSuccess(statusReceiver); Intent broadcast = new Intent(Intent.ACTION_ROLLBACK_COMMITTED); @@ -469,7 +468,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } ); - data.inProgress = true; + data.restoreUserDataInProgress = true; parentSession.commit(receiver.getIntentSender()); } catch (IOException e) { Log.e(TAG, "Rollback failed", e); @@ -510,7 +509,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { Iterator<RollbackData> iter = mAvailableRollbacks.iterator(); while (iter.hasNext()) { RollbackData data = iter.next(); - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { if (info.getPackageName().equals(packageName)) { iter.remove(); deleteRollback(data); @@ -537,9 +536,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { for (RollbackData rd : changed) { try { - mRollbackStore.saveAvailableRollback(rd); + mRollbackStore.saveRollbackData(rd); } catch (IOException ioe) { - Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe); + Log.e(TAG, "Unable to save rollback info for : " + + rd.info.getRollbackId(), ioe); } } @@ -575,7 +575,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { synchronized (mLock) { ensureRollbackDataLoadedLocked(); for (RollbackData data : mAvailableRollbacks) { - if (data.stagedSessionId != -1) { + if (!data.isAvailable && data.isStaged()) { staged.add(data); } } @@ -591,10 +591,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { data.isAvailable = true; } try { - mRollbackStore.saveAvailableRollback(data); + mRollbackStore.saveRollbackData(data); } catch (IOException ioe) { Log.e(TAG, "Unable to save rollback info for : " - + data.rollbackId, ioe); + + data.info.getRollbackId(), ioe); } } else if (session.isStagedSessionFailed()) { // TODO: Do we need to remove this from @@ -641,7 +641,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { private void loadAllRollbackDataLocked() { mAvailableRollbacks = mRollbackStore.loadAvailableRollbacks(); for (RollbackData data : mAvailableRollbacks) { - mAllocatedRollbackIds.put(data.rollbackId, true); + mAllocatedRollbackIds.put(data.info.getRollbackId(), true); } mRecentlyExecutedRollbacks = mRollbackStore.loadRecentlyExecutedRollbacks(); @@ -665,7 +665,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { Iterator<RollbackData> iter = mAvailableRollbacks.iterator(); while (iter.hasNext()) { RollbackData data = iter.next(); - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { if (info.getPackageName().equals(packageName) && !packageVersionsEqual( info.getVersionRolledBackFrom(), @@ -897,18 +897,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { return false; } String packageName = newPackage.packageName; - for (PackageRollbackInfo info : rd.packages) { + for (PackageRollbackInfo info : rd.info.getPackages()) { if (info.getPackageName().equals(packageName)) { info.getInstalledUsers().addAll(IntArray.wrap(installedUsers)); - mAppDataRollbackHelper.snapshotAppData(rd.rollbackId, info); + mAppDataRollbackHelper.snapshotAppData(rd.info.getRollbackId(), info); try { - mRollbackStore.saveAvailableRollback(rd); + mRollbackStore.saveRollbackData(rd); } catch (IOException ioe) { // TODO: Hopefully this is okay because we will try // again to save the rollback when the staged session // is applied. Just so long as the device doesn't // reboot before then. - Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe); + Log.e(TAG, "Unable to save rollback info for : " + + rd.info.getRollbackId(), ioe); } return true; } @@ -989,14 +990,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { if (data == null) { int rollbackId = allocateRollbackIdLocked(); if (session.isStaged()) { - data = mRollbackStore.createPendingStagedRollback(rollbackId, - parentSessionId); + data = mRollbackStore.createStagedRollback(rollbackId, parentSessionId); } else { - data = mRollbackStore.createAvailableRollback(rollbackId); + data = mRollbackStore.createNonStagedRollback(rollbackId); } mPendingRollbacks.put(parentSessionId, data); } - data.packages.add(info); + data.info.getPackages().add(info); } } catch (IOException e) { Log.e(TAG, "Unable to create rollback for " + packageName, e); @@ -1004,7 +1004,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } if (snapshotUserData && !isApex) { - mAppDataRollbackHelper.snapshotAppData(data.rollbackId, info); + mAppDataRollbackHelper.snapshotAppData(data.info.getRollbackId(), info); } try { @@ -1044,7 +1044,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { return; } - if (!rollbackData.inProgress) { + if (!rollbackData.restoreUserDataInProgress) { Log.e(TAG, "Request to restore userData for: " + packageName + ", but no rollback in progress."); return; @@ -1053,12 +1053,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { for (int userId : userIds) { final PackageRollbackInfo info = getPackageRollbackInfo(rollbackData, packageName); final boolean changedRollbackData = mAppDataRollbackHelper.restoreAppData( - rollbackData.rollbackId, info, userId, appId, seInfo); + rollbackData.info.getRollbackId(), info, userId, appId, seInfo); // We've updated metadata about this rollback, so save it to flash. if (changedRollbackData) { try { - mRollbackStore.saveAvailableRollback(rollbackData); + mRollbackStore.saveRollbackData(rollbackData); } catch (IOException ioe) { // TODO(narayan): What is the right thing to do here ? This isn't a fatal // error, since it will only result in us trying to restore data again, @@ -1137,9 +1137,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { if (rd != null) { try { - mRollbackStore.saveAvailableRollback(rd); + mRollbackStore.saveRollbackData(rd); } catch (IOException ioe) { - Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe); + Log.e(TAG, "Unable to save rollback info for : " + + rd.info.getRollbackId(), ioe); } } }); @@ -1212,7 +1213,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { try { data.timestamp = Instant.now(); - mRollbackStore.saveAvailableRollback(data); + mRollbackStore.saveRollbackData(data); synchronized (mLock) { // Note: There is a small window of time between when // the session has been committed by the package @@ -1233,8 +1234,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { // After enabling and commiting any rollback, observe packages and // prepare to rollback if packages crashes too frequently. List<String> packages = new ArrayList<>(); - for (int i = 0; i < data.packages.size(); i++) { - packages.add(data.packages.get(i).getPackageName()); + for (int i = 0; i < data.info.getPackages().size(); i++) { + packages.add(data.info.getPackages().get(i).getPackageName()); } mPackageHealthObserver.startObservingHealth(packages, mRollbackLifetimeDurationInMillis); @@ -1307,7 +1308,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { ensureRollbackDataLoadedLocked(); for (int i = 0; i < mAvailableRollbacks.size(); ++i) { RollbackData data = mAvailableRollbacks.get(i); - if (data.isAvailable && data.rollbackId == rollbackId) { + if (data.isAvailable && data.info.getRollbackId() == rollbackId) { return data; } } @@ -1322,7 +1323,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { */ private static PackageRollbackInfo getPackageRollbackInfo(RollbackData data, String packageName) { - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { if (info.getPackageName().equals(packageName)) { return info; } @@ -1347,14 +1348,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } private void deleteRollback(RollbackData rollbackData) { - for (PackageRollbackInfo info : rollbackData.packages) { + for (PackageRollbackInfo info : rollbackData.info.getPackages()) { IntArray installedUsers = info.getInstalledUsers(); for (int i = 0; i < installedUsers.size(); i++) { int userId = installedUsers.get(i); - mAppDataRollbackHelper.destroyAppDataSnapshot(rollbackData.rollbackId, info, - userId); + mAppDataRollbackHelper.destroyAppDataSnapshot(rollbackData.info.getRollbackId(), + info, userId); } } - mRollbackStore.deleteAvailableRollback(rollbackData); + mRollbackStore.deleteRollbackData(rollbackData); } } diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java index bb4e89eca5da..ecdb2ccd872b 100644 --- a/services/core/java/com/android/server/rollback/RollbackStore.java +++ b/services/core/java/com/android/server/rollback/RollbackStore.java @@ -183,6 +183,25 @@ class RollbackStore { return ceSnapshotInodes; } + private static JSONObject rollbackInfoToJson(RollbackInfo rollback) throws JSONException { + JSONObject json = new JSONObject(); + json.put("rollbackId", rollback.getRollbackId()); + json.put("packages", toJson(rollback.getPackages())); + json.put("isStaged", rollback.isStaged()); + json.put("causePackages", versionedPackagesToJson(rollback.getCausePackages())); + json.put("committedSessionId", rollback.getCommittedSessionId()); + return json; + } + + private static RollbackInfo rollbackInfoFromJson(JSONObject json) throws JSONException { + return new RollbackInfo( + json.getInt("rollbackId"), + packageRollbackInfosFromJson(json.getJSONArray("packages")), + json.getBoolean("isStaged"), + versionedPackagesFromJson(json.getJSONArray("causePackages")), + json.getInt("committedSessionId")); + } + /** * Reads the list of recently executed rollbacks from persistent storage. */ @@ -197,17 +216,7 @@ class RollbackStore { JSONObject object = new JSONObject(jsonString); JSONArray array = object.getJSONArray("recentlyExecuted"); for (int i = 0; i < array.length(); ++i) { - JSONObject element = array.getJSONObject(i); - int rollbackId = element.getInt("rollbackId"); - List<PackageRollbackInfo> packages = packageRollbackInfosFromJson( - element.getJSONArray("packages")); - boolean isStaged = element.getBoolean("isStaged"); - List<VersionedPackage> causePackages = versionedPackagesFromJson( - element.getJSONArray("causePackages")); - int committedSessionId = element.getInt("committedSessionId"); - RollbackInfo rollback = new RollbackInfo(rollbackId, packages, isStaged, - causePackages, committedSessionId); - recentlyExecutedRollbacks.add(rollback); + recentlyExecutedRollbacks.add(rollbackInfoFromJson(array.getJSONObject(i))); } } catch (IOException | JSONException e) { // TODO: What to do here? Surely we shouldn't just forget about @@ -220,17 +229,22 @@ class RollbackStore { } /** - * Creates a new RollbackData instance with backupDir assigned. + * Creates a new RollbackData instance for a non-staged rollback with + * backupDir assigned. */ - RollbackData createAvailableRollback(int rollbackId) throws IOException { + RollbackData createNonStagedRollback(int rollbackId) throws IOException { File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId)); - return new RollbackData(rollbackId, backupDir, -1, true); + return new RollbackData(rollbackId, backupDir, -1); } - RollbackData createPendingStagedRollback(int rollbackId, int stagedSessionId) + /** + * Creates a new RollbackData instance for a staged rollback with + * backupDir assigned. + */ + RollbackData createStagedRollback(int rollbackId, int stagedSessionId) throws IOException { File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId)); - return new RollbackData(rollbackId, backupDir, stagedSessionId, false); + return new RollbackData(rollbackId, backupDir, stagedSessionId); } /** @@ -263,17 +277,17 @@ class RollbackStore { } /** - * Writes the metadata for an available rollback to persistent storage. + * Saves the rollback data to persistent storage. */ - void saveAvailableRollback(RollbackData data) throws IOException { + void saveRollbackData(RollbackData data) throws IOException { try { JSONObject dataJson = new JSONObject(); - dataJson.put("rollbackId", data.rollbackId); - dataJson.put("packages", toJson(data.packages)); + dataJson.put("info", rollbackInfoToJson(data.info)); dataJson.put("timestamp", data.timestamp.toString()); dataJson.put("stagedSessionId", data.stagedSessionId); dataJson.put("isAvailable", data.isAvailable); dataJson.put("apkSessionId", data.apkSessionId); + dataJson.put("restoreUserDataInProgress", data.restoreUserDataInProgress); PrintWriter pw = new PrintWriter(new File(data.backupDir, "rollback.json")); pw.println(dataJson.toString()); @@ -284,10 +298,9 @@ class RollbackStore { } /** - * Removes all persistant storage associated with the given available - * rollback. + * Removes all persistant storage associated with the given rollback data. */ - void deleteAvailableRollback(RollbackData data) { + void deleteRollbackData(RollbackData data) { removeFile(data.backupDir); } @@ -302,13 +315,7 @@ class RollbackStore { for (int i = 0; i < recentlyExecutedRollbacks.size(); ++i) { RollbackInfo rollback = recentlyExecutedRollbacks.get(i); - JSONObject element = new JSONObject(); - element.put("rollbackId", rollback.getRollbackId()); - element.put("packages", toJson(rollback.getPackages())); - element.put("isStaged", rollback.isStaged()); - element.put("causePackages", versionedPackagesToJson(rollback.getCausePackages())); - element.put("committedSessionId", rollback.getCommittedSessionId()); - array.put(element); + array.put(rollbackInfoToJson(rollback)); } PrintWriter pw = new PrintWriter(mRecentlyExecutedRollbacksFile); @@ -324,40 +331,39 @@ class RollbackStore { * Reads the metadata for a rollback from the given directory. * @throws IOException in case of error reading the data. */ - private RollbackData loadRollbackData(File backupDir) throws IOException { + private static RollbackData loadRollbackData(File backupDir) throws IOException { try { File rollbackJsonFile = new File(backupDir, "rollback.json"); JSONObject dataJson = new JSONObject( IoUtils.readFileAsString(rollbackJsonFile.getAbsolutePath())); - int rollbackId = dataJson.getInt("rollbackId"); - int stagedSessionId = dataJson.getInt("stagedSessionId"); - boolean isAvailable = dataJson.getBoolean("isAvailable"); - RollbackData data = new RollbackData(rollbackId, backupDir, - stagedSessionId, isAvailable); - data.packages.addAll(packageRollbackInfosFromJson(dataJson.getJSONArray("packages"))); - data.timestamp = Instant.parse(dataJson.getString("timestamp")); - data.apkSessionId = dataJson.getInt("apkSessionId"); - return data; + return new RollbackData( + rollbackInfoFromJson(dataJson.getJSONObject("info")), + backupDir, + Instant.parse(dataJson.getString("timestamp")), + dataJson.getInt("stagedSessionId"), + dataJson.getBoolean("isAvailable"), + dataJson.getInt("apkSessionId"), + dataJson.getBoolean("restoreUserDataInProgress")); } catch (JSONException | DateTimeParseException e) { throw new IOException(e); } } - private JSONObject toJson(VersionedPackage pkg) throws JSONException { + private static JSONObject toJson(VersionedPackage pkg) throws JSONException { JSONObject json = new JSONObject(); json.put("packageName", pkg.getPackageName()); json.put("longVersionCode", pkg.getLongVersionCode()); return json; } - private VersionedPackage versionedPackageFromJson(JSONObject json) throws JSONException { + private static VersionedPackage versionedPackageFromJson(JSONObject json) throws JSONException { String packageName = json.getString("packageName"); long longVersionCode = json.getLong("longVersionCode"); return new VersionedPackage(packageName, longVersionCode); } - private JSONObject toJson(PackageRollbackInfo info) throws JSONException { + private static JSONObject toJson(PackageRollbackInfo info) throws JSONException { JSONObject json = new JSONObject(); json.put("versionRolledBackFrom", toJson(info.getVersionRolledBackFrom())); json.put("versionRolledBackTo", toJson(info.getVersionRolledBackTo())); @@ -376,7 +382,8 @@ class RollbackStore { return json; } - private PackageRollbackInfo packageRollbackInfoFromJson(JSONObject json) throws JSONException { + private static PackageRollbackInfo packageRollbackInfoFromJson(JSONObject json) + throws JSONException { VersionedPackage versionRolledBackFrom = versionedPackageFromJson( json.getJSONObject("versionRolledBackFrom")); VersionedPackage versionRolledBackTo = versionedPackageFromJson( @@ -397,7 +404,7 @@ class RollbackStore { pendingBackups, pendingRestores, isApex, installedUsers, ceSnapshotInodes); } - private JSONArray versionedPackagesToJson(List<VersionedPackage> packages) + private static JSONArray versionedPackagesToJson(List<VersionedPackage> packages) throws JSONException { JSONArray json = new JSONArray(); for (VersionedPackage pkg : packages) { @@ -406,7 +413,8 @@ class RollbackStore { return json; } - private List<VersionedPackage> versionedPackagesFromJson(JSONArray json) throws JSONException { + private static List<VersionedPackage> versionedPackagesFromJson(JSONArray json) + throws JSONException { List<VersionedPackage> packages = new ArrayList<>(); for (int i = 0; i < json.length(); ++i) { packages.add(versionedPackageFromJson(json.getJSONObject(i))); @@ -414,7 +422,7 @@ class RollbackStore { return packages; } - private JSONArray toJson(List<PackageRollbackInfo> infos) throws JSONException { + private static JSONArray toJson(List<PackageRollbackInfo> infos) throws JSONException { JSONArray json = new JSONArray(); for (PackageRollbackInfo info : infos) { json.put(toJson(info)); @@ -422,7 +430,7 @@ class RollbackStore { return json; } - private List<PackageRollbackInfo> packageRollbackInfosFromJson(JSONArray json) + private static List<PackageRollbackInfo> packageRollbackInfosFromJson(JSONArray json) throws JSONException { List<PackageRollbackInfo> infos = new ArrayList<>(); for (int i = 0; i < json.length(); ++i) { 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 d848b2dc75fe..fc7ccc576abb 100644 --- a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java @@ -236,20 +236,20 @@ public class AppDataRollbackHelperTest { wasRecentlyRestored.getPendingRestores().add( new RestoreInfo(73 /* userId */, 239 /* appId*/, "seInfo")); - RollbackData dataWithPendingBackup = new RollbackData(101, new File("/does/not/exist"), -1, - true); - dataWithPendingBackup.packages.add(pendingBackup); + RollbackData dataWithPendingBackup = new RollbackData(101, new File("/does/not/exist"), -1); + dataWithPendingBackup.info.getPackages().add(pendingBackup); RollbackData dataWithRecentRestore = new RollbackData(17239, new File("/does/not/exist"), - -1, true); - dataWithRecentRestore.packages.add(wasRecentlyRestored); + -1); + dataWithRecentRestore.info.getPackages().add(wasRecentlyRestored); RollbackData dataForDifferentUser = new RollbackData(17239, new File("/does/not/exist"), - -1, true); - dataForDifferentUser.packages.add(ignoredInfo); + -1); + dataForDifferentUser.info.getPackages().add(ignoredInfo); RollbackInfo rollbackInfo = new RollbackInfo(17239, - Arrays.asList(pendingRestore, wasRecentlyRestored), false); + Arrays.asList(pendingRestore, wasRecentlyRestored), false, + new ArrayList<>(), -1); List<RollbackData> changed = helper.commitPendingBackupAndRestoreForUser(37, Arrays.asList(dataWithPendingBackup, dataWithRecentRestore, dataForDifferentUser), |