Merge "Make BackupTransport more resilient" into tm-dev am: a3a657350a am: a63b81a35c
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18321342 Change-Id: I4979c265e3b6260ab0c246a11f964ecbe0ca2f1b Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -665,184 +665,292 @@ public class BackupTransport {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void name(AndroidFuture<String> resultFuture) throws RemoteException {
|
public void name(AndroidFuture<String> resultFuture) throws RemoteException {
|
||||||
String result = BackupTransport.this.name();
|
try {
|
||||||
resultFuture.complete(result);
|
String result = BackupTransport.this.name();
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configurationIntent(AndroidFuture<Intent> resultFuture)
|
public void configurationIntent(AndroidFuture<Intent> resultFuture)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
Intent result = BackupTransport.this.configurationIntent();
|
try {
|
||||||
resultFuture.complete(result);
|
Intent result = BackupTransport.this.configurationIntent();
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void currentDestinationString(AndroidFuture<String> resultFuture)
|
public void currentDestinationString(AndroidFuture<String> resultFuture)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
String result = BackupTransport.this.currentDestinationString();
|
try {
|
||||||
resultFuture.complete(result);
|
String result = BackupTransport.this.currentDestinationString();
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dataManagementIntent(AndroidFuture<Intent> resultFuture)
|
public void dataManagementIntent(AndroidFuture<Intent> resultFuture)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
Intent result = BackupTransport.this.dataManagementIntent();
|
try {
|
||||||
resultFuture.complete(result);
|
Intent result = BackupTransport.this.dataManagementIntent();
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dataManagementIntentLabel(AndroidFuture<CharSequence> resultFuture)
|
public void dataManagementIntentLabel(AndroidFuture<CharSequence> resultFuture)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
CharSequence result = BackupTransport.this.dataManagementIntentLabel();
|
try {
|
||||||
resultFuture.complete(result);
|
CharSequence result = BackupTransport.this.dataManagementIntentLabel();
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void transportDirName(AndroidFuture<String> resultFuture) throws RemoteException {
|
public void transportDirName(AndroidFuture<String> resultFuture) throws RemoteException {
|
||||||
String result = BackupTransport.this.transportDirName();
|
try {
|
||||||
resultFuture.complete(result);
|
String result = BackupTransport.this.transportDirName();
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void requestBackupTime(AndroidFuture<Long> resultFuture) throws RemoteException {
|
public void requestBackupTime(AndroidFuture<Long> resultFuture) throws RemoteException {
|
||||||
long result = BackupTransport.this.requestBackupTime();
|
try {
|
||||||
resultFuture.complete(result);
|
long result = BackupTransport.this.requestBackupTime();
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initializeDevice(ITransportStatusCallback callback) throws RemoteException {
|
public void initializeDevice(ITransportStatusCallback callback) throws RemoteException {
|
||||||
int result = BackupTransport.this.initializeDevice();
|
try {
|
||||||
callback.onOperationCompleteWithStatus(result);
|
int result = BackupTransport.this.initializeDevice();
|
||||||
|
callback.onOperationCompleteWithStatus(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void performBackup(PackageInfo packageInfo, ParcelFileDescriptor inFd, int flags,
|
public void performBackup(PackageInfo packageInfo, ParcelFileDescriptor inFd, int flags,
|
||||||
ITransportStatusCallback callback) throws RemoteException {
|
ITransportStatusCallback callback) throws RemoteException {
|
||||||
int result = BackupTransport.this.performBackup(packageInfo, inFd, flags);
|
try {
|
||||||
callback.onOperationCompleteWithStatus(result);
|
int result = BackupTransport.this.performBackup(packageInfo, inFd, flags);
|
||||||
|
callback.onOperationCompleteWithStatus(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clearBackupData(PackageInfo packageInfo, ITransportStatusCallback callback)
|
public void clearBackupData(PackageInfo packageInfo, ITransportStatusCallback callback)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
int result = BackupTransport.this.clearBackupData(packageInfo);
|
try {
|
||||||
callback.onOperationCompleteWithStatus(result);
|
int result = BackupTransport.this.clearBackupData(packageInfo);
|
||||||
|
callback.onOperationCompleteWithStatus(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void finishBackup(ITransportStatusCallback callback) throws RemoteException {
|
public void finishBackup(ITransportStatusCallback callback) throws RemoteException {
|
||||||
int result = BackupTransport.this.finishBackup();
|
try {
|
||||||
callback.onOperationCompleteWithStatus(result);
|
int result = BackupTransport.this.finishBackup();
|
||||||
|
callback.onOperationCompleteWithStatus(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getAvailableRestoreSets(AndroidFuture<List<RestoreSet>> resultFuture)
|
public void getAvailableRestoreSets(AndroidFuture<List<RestoreSet>> resultFuture)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
RestoreSet[] result = BackupTransport.this.getAvailableRestoreSets();
|
try {
|
||||||
resultFuture.complete(Arrays.asList(result));
|
RestoreSet[] result = BackupTransport.this.getAvailableRestoreSets();
|
||||||
|
resultFuture.complete(Arrays.asList(result));
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getCurrentRestoreSet(AndroidFuture<Long> resultFuture)
|
public void getCurrentRestoreSet(AndroidFuture<Long> resultFuture)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
long result = BackupTransport.this.getCurrentRestoreSet();
|
try {
|
||||||
resultFuture.complete(result);
|
long result = BackupTransport.this.getCurrentRestoreSet();
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startRestore(long token, PackageInfo[] packages,
|
public void startRestore(long token, PackageInfo[] packages,
|
||||||
ITransportStatusCallback callback) throws RemoteException {
|
ITransportStatusCallback callback) throws RemoteException {
|
||||||
int result = BackupTransport.this.startRestore(token, packages);
|
try {
|
||||||
callback.onOperationCompleteWithStatus(result);
|
int result = BackupTransport.this.startRestore(token, packages);
|
||||||
|
callback.onOperationCompleteWithStatus(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void nextRestorePackage(AndroidFuture<RestoreDescription> resultFuture)
|
public void nextRestorePackage(AndroidFuture<RestoreDescription> resultFuture)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
RestoreDescription result = BackupTransport.this.nextRestorePackage();
|
try {
|
||||||
resultFuture.complete(result);
|
RestoreDescription result = BackupTransport.this.nextRestorePackage();
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getRestoreData(ParcelFileDescriptor outFd,
|
public void getRestoreData(ParcelFileDescriptor outFd,
|
||||||
ITransportStatusCallback callback) throws RemoteException {
|
ITransportStatusCallback callback) throws RemoteException {
|
||||||
int result = BackupTransport.this.getRestoreData(outFd);
|
try {
|
||||||
callback.onOperationCompleteWithStatus(result);
|
int result = BackupTransport.this.getRestoreData(outFd);
|
||||||
|
callback.onOperationCompleteWithStatus(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void finishRestore(ITransportStatusCallback callback)
|
public void finishRestore(ITransportStatusCallback callback)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
BackupTransport.this.finishRestore();
|
try {
|
||||||
callback.onOperationComplete();
|
BackupTransport.this.finishRestore();
|
||||||
|
callback.onOperationComplete();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void requestFullBackupTime(AndroidFuture<Long> resultFuture)
|
public void requestFullBackupTime(AndroidFuture<Long> resultFuture)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
long result = BackupTransport.this.requestFullBackupTime();
|
try {
|
||||||
resultFuture.complete(result);
|
long result = BackupTransport.this.requestFullBackupTime();
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void performFullBackup(PackageInfo targetPackage, ParcelFileDescriptor socket,
|
public void performFullBackup(PackageInfo targetPackage, ParcelFileDescriptor socket,
|
||||||
int flags, ITransportStatusCallback callback) throws RemoteException {
|
int flags, ITransportStatusCallback callback) throws RemoteException {
|
||||||
int result = BackupTransport.this.performFullBackup(targetPackage, socket, flags);
|
try {
|
||||||
callback.onOperationCompleteWithStatus(result);
|
int result = BackupTransport.this.performFullBackup(targetPackage, socket, flags);
|
||||||
|
callback.onOperationCompleteWithStatus(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void checkFullBackupSize(long size, ITransportStatusCallback callback)
|
public void checkFullBackupSize(long size, ITransportStatusCallback callback)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
int result = BackupTransport.this.checkFullBackupSize(size);
|
try {
|
||||||
callback.onOperationCompleteWithStatus(result);
|
int result = BackupTransport.this.checkFullBackupSize(size);
|
||||||
|
callback.onOperationCompleteWithStatus(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendBackupData(int numBytes, ITransportStatusCallback callback)
|
public void sendBackupData(int numBytes, ITransportStatusCallback callback)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
int result = BackupTransport.this.sendBackupData(numBytes);
|
try {
|
||||||
callback.onOperationCompleteWithStatus(result);
|
int result = BackupTransport.this.sendBackupData(numBytes);
|
||||||
|
callback.onOperationCompleteWithStatus(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cancelFullBackup(ITransportStatusCallback callback) throws RemoteException {
|
public void cancelFullBackup(ITransportStatusCallback callback) throws RemoteException {
|
||||||
BackupTransport.this.cancelFullBackup();
|
try {
|
||||||
callback.onOperationComplete();
|
BackupTransport.this.cancelFullBackup();
|
||||||
|
callback.onOperationComplete();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void isAppEligibleForBackup(PackageInfo targetPackage, boolean isFullBackup,
|
public void isAppEligibleForBackup(PackageInfo targetPackage, boolean isFullBackup,
|
||||||
AndroidFuture<Boolean> resultFuture) throws RemoteException {
|
AndroidFuture<Boolean> resultFuture) throws RemoteException {
|
||||||
boolean result = BackupTransport.this.isAppEligibleForBackup(targetPackage,
|
try {
|
||||||
isFullBackup);
|
boolean result = BackupTransport.this.isAppEligibleForBackup(targetPackage,
|
||||||
resultFuture.complete(result);
|
isFullBackup);
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getBackupQuota(String packageName, boolean isFullBackup,
|
public void getBackupQuota(String packageName, boolean isFullBackup,
|
||||||
AndroidFuture<Long> resultFuture) throws RemoteException {
|
AndroidFuture<Long> resultFuture) throws RemoteException {
|
||||||
long result = BackupTransport.this.getBackupQuota(packageName, isFullBackup);
|
try {
|
||||||
resultFuture.complete(result);
|
long result = BackupTransport.this.getBackupQuota(packageName, isFullBackup);
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getTransportFlags(AndroidFuture<Integer> resultFuture) throws RemoteException {
|
public void getTransportFlags(AndroidFuture<Integer> resultFuture) throws RemoteException {
|
||||||
int result = BackupTransport.this.getTransportFlags();
|
try {
|
||||||
resultFuture.complete(result);
|
int result = BackupTransport.this.getTransportFlags();
|
||||||
|
resultFuture.complete(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
resultFuture.cancel(/* mayInterruptIfRunning */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getNextFullRestoreDataChunk(ParcelFileDescriptor socket,
|
public void getNextFullRestoreDataChunk(ParcelFileDescriptor socket,
|
||||||
ITransportStatusCallback callback) throws RemoteException {
|
ITransportStatusCallback callback) throws RemoteException {
|
||||||
int result = BackupTransport.this.getNextFullRestoreDataChunk(socket);
|
try {
|
||||||
callback.onOperationCompleteWithStatus(result);
|
int result = BackupTransport.this.getNextFullRestoreDataChunk(socket);
|
||||||
|
callback.onOperationCompleteWithStatus(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void abortFullRestore(ITransportStatusCallback callback) throws RemoteException {
|
public void abortFullRestore(ITransportStatusCallback callback) throws RemoteException {
|
||||||
int result = BackupTransport.this.abortFullRestore();
|
try {
|
||||||
callback.onOperationCompleteWithStatus(result);
|
int result = BackupTransport.this.abortFullRestore();
|
||||||
|
callback.onOperationCompleteWithStatus(result);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import com.android.internal.backup.ITransportStatusCallback;
|
|||||||
|
|
||||||
public class TransportStatusCallback extends ITransportStatusCallback.Stub {
|
public class TransportStatusCallback extends ITransportStatusCallback.Stub {
|
||||||
private static final String TAG = "TransportStatusCallback";
|
private static final String TAG = "TransportStatusCallback";
|
||||||
private static final int TIMEOUT_MILLIS = 600 * 1000; // 10 minutes.
|
private static final int TIMEOUT_MILLIS = 300 * 1000; // 5 minutes.
|
||||||
private static final int OPERATION_STATUS_DEFAULT = 0;
|
private static final int OPERATION_STATUS_DEFAULT = 0;
|
||||||
|
|
||||||
private final int mOperationTimeout;
|
private final int mOperationTimeout;
|
||||||
|
|||||||
Reference in New Issue
Block a user