diff --git a/core/java/android/app/backup/BackupTransport.java b/core/java/android/app/backup/BackupTransport.java index 6adc2e0b9af81..6cfabf0eb981b 100644 --- a/core/java/android/app/backup/BackupTransport.java +++ b/core/java/android/app/backup/BackupTransport.java @@ -589,6 +589,11 @@ public class BackupTransport { return BackupTransport.this.sendBackupData(numBytes); } + @Override + public void cancelFullBackup() throws RemoteException { + BackupTransport.this.cancelFullBackup(); + } + @Override public int getNextFullRestoreDataChunk(ParcelFileDescriptor socket) { return BackupTransport.this.getNextFullRestoreDataChunk(socket); diff --git a/core/java/com/android/internal/backup/IBackupTransport.aidl b/core/java/com/android/internal/backup/IBackupTransport.aidl index 36de52b2ed4e7..6158a7b733ac6 100644 --- a/core/java/com/android/internal/backup/IBackupTransport.aidl +++ b/core/java/com/android/internal/backup/IBackupTransport.aidl @@ -239,6 +239,7 @@ interface IBackupTransport { long requestFullBackupTime(); int performFullBackup(in PackageInfo targetPackage, in ParcelFileDescriptor socket); int sendBackupData(int numBytes); + void cancelFullBackup(); // full restore stuff diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 77b14ac18742f..b2d1b717b527d 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -3745,28 +3745,25 @@ public class BackupManagerService extends IBackupManager.Stub { } } while (nRead > 0 && result == BackupTransport.TRANSPORT_OK); - int finishResult; - + // If we've lost our running criteria, tell the transport to cancel + // and roll back this (partial) backup payload; otherwise tell it + // that we've reached the clean finish state. if (!mKeepRunning.get()) { result = BackupTransport.TRANSPORT_ERROR; - // TODO: tell the transport to abort the backup - Slog.w(TAG, "TODO: tell transport to halt & roll back"); + transport.cancelFullBackup(); + } else { + // If we were otherwise in a good state, now interpret the final + // result based on what finishBackup() returns. If we're in a + // failure case already, preserve that result and ignore whatever + // finishBackup() reports. + final int finishResult = transport.finishBackup(); + if (result == BackupTransport.TRANSPORT_OK) { + result = finishResult; + } } - // In all cases we need to give the transport its finish callback - finishResult = transport.finishBackup(); - if (MORE_DEBUG) { - Slog.i(TAG, "Done trying to send backup data: result=" - + result + " finishResult=" + finishResult); - } - - // If we were otherwise in a good state, now interpret the final - // result based on what finishBackup() returned. If we're in a - // failure case already, preserve that result and ignore whatever - // finishBackup() reported. - if (result == BackupTransport.TRANSPORT_OK) { - result = finishResult; + Slog.i(TAG, "Done trying to send backup data: result=" + result); } if (result != BackupTransport.TRANSPORT_OK) {