API to tell the transport to cancel a full backup in progress
Bug 16524520
Change-Id: If2cbffd3c8a03bf4eb7b11ff1ae784c437e27e7f
diff --git a/core/java/android/app/backup/BackupTransport.java b/core/java/android/app/backup/BackupTransport.java
index dc3bbc0..6adc2e0 100644
--- a/core/java/android/app/backup/BackupTransport.java
+++ b/core/java/android/app/backup/BackupTransport.java
@@ -405,6 +405,25 @@
return BackupTransport.TRANSPORT_ERROR;
}
+ /**
+ * Tells the transport to cancel the currently-ongoing full backup operation. This
+ * will happen between {@link #performFullBackup()} and {@link #finishBackup()}
+ * if the OS needs to abort the backup operation for any reason, such as a crash in
+ * the application undergoing backup.
+ *
+ * <p>When it receives this call, the transport should discard any partial archive
+ * that it has stored so far. If possible it should also roll back to the previous
+ * known-good archive in its datastore.
+ *
+ * <p>If the transport receives this callback, it will <em>not</em> receive a
+ * call to {@link #finishBackup()}. It needs to tear down any ongoing backup state
+ * here.
+ */
+ public void cancelFullBackup() {
+ throw new UnsupportedOperationException(
+ "Transport cancelFullBackup() not implemented");
+ }
+
// ------------------------------------------------------------------------------------
// Full restore interfaces
diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java
index 97e1102..d8dffe0 100644
--- a/core/java/com/android/internal/backup/LocalTransport.java
+++ b/core/java/com/android/internal/backup/LocalTransport.java
@@ -273,11 +273,15 @@
@Override
public int finishBackup() {
- if (DEBUG) Log.v(TAG, "finishBackup()");
+ if (DEBUG) Log.v(TAG, "finishBackup() of " + mFullTargetPackage);
+ return tearDownFullBackup();
+ }
+
+ // ------------------------------------------------------------------------------------
+ // Full backup handling
+
+ private int tearDownFullBackup() {
if (mSocket != null) {
- if (DEBUG) {
- Log.v(TAG, "Concluding full backup of " + mFullTargetPackage);
- }
try {
mFullBackupOutputStream.flush();
mFullBackupOutputStream.close();
@@ -286,7 +290,7 @@
mSocket.close();
} catch (IOException e) {
if (DEBUG) {
- Log.w(TAG, "Exception caught in finishBackup()", e);
+ Log.w(TAG, "Exception caught in tearDownFullBackup()", e);
}
return TRANSPORT_ERROR;
} finally {
@@ -296,8 +300,9 @@
return TRANSPORT_OK;
}
- // ------------------------------------------------------------------------------------
- // Full backup handling
+ private File tarballFile(String pkgName) {
+ return new File(mCurrentSetFullDir, pkgName);
+ }
@Override
public long requestFullBackupTime() {
@@ -329,7 +334,7 @@
mFullTargetPackage = targetPackage.packageName;
FileOutputStream tarstream;
try {
- File tarball = new File(mCurrentSetFullDir, mFullTargetPackage);
+ File tarball = tarballFile(mFullTargetPackage);
tarstream = new FileOutputStream(tarball);
} catch (FileNotFoundException e) {
return TRANSPORT_ERROR;
@@ -368,6 +373,19 @@
return TRANSPORT_OK;
}
+ // For now we can't roll back, so just tear everything down.
+ @Override
+ public void cancelFullBackup() {
+ if (DEBUG) {
+ Log.i(TAG, "Canceling full backup of " + mFullTargetPackage);
+ }
+ File archive = tarballFile(mFullTargetPackage);
+ tearDownFullBackup();
+ if (archive.exists()) {
+ archive.delete();
+ }
+ }
+
// ------------------------------------------------------------------------------------
// Restore handling
static final long[] POSSIBLE_SETS = { 2, 3, 4, 5, 6, 7, 8, 9 };