diff options
5 files changed, 58 insertions, 36 deletions
diff --git a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java index 3eaee9a40b99..bd0d853ce698 100644 --- a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java @@ -2389,19 +2389,24 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter if (MORE_DEBUG) Slog.v(TAG, "Found the app - running clear process"); mBackupHandler.removeMessages(MSG_RETRY_CLEAR); synchronized (mQueueLock) { - final IBackupTransport transport = - mTransportManager.getTransportBinder(transportName); - if (transport == null) { - // transport is currently unavailable -- make sure to retry + TransportClient transportClient = + mTransportManager + .getTransportClient(transportName, "BMS.clearBackupData()"); + if (transportClient == null) { + // transport is currently unregistered -- make sure to retry Message msg = mBackupHandler.obtainMessage(MSG_RETRY_CLEAR, new ClearRetryParams(transportName, packageName)); mBackupHandler.sendMessageDelayed(msg, TRANSPORT_RETRY_INTERVAL); return; } long oldId = Binder.clearCallingIdentity(); + OnTaskFinishedListener listener = + caller -> + mTransportManager.disposeOfTransportClient(transportClient, caller); mWakelock.acquire(); - Message msg = mBackupHandler.obtainMessage(MSG_RUN_CLEAR, - new ClearParams(transport, info)); + Message msg = mBackupHandler.obtainMessage( + MSG_RUN_CLEAR, + new ClearParams(transportClient, info, listener)); mBackupHandler.sendMessage(msg); Binder.restoreCallingIdentity(oldId); } diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java index 9011b95cf614..477724de2c4d 100644 --- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java +++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java @@ -268,8 +268,13 @@ public class BackupHandler extends Handler { case MSG_RUN_CLEAR: { ClearParams params = (ClearParams) msg.obj; - (new PerformClearTask(backupManagerService, params.transport, - params.packageInfo)).run(); + Runnable task = + new PerformClearTask( + backupManagerService, + params.transportClient, + params.packageInfo, + params.listener); + task.run(); break; } diff --git a/services/backup/java/com/android/server/backup/internal/PerformClearTask.java b/services/backup/java/com/android/server/backup/internal/PerformClearTask.java index 7af01eac9683..84ca59b583e0 100644 --- a/services/backup/java/com/android/server/backup/internal/PerformClearTask.java +++ b/services/backup/java/com/android/server/backup/internal/PerformClearTask.java @@ -23,46 +23,54 @@ import android.util.Slog; import com.android.internal.backup.IBackupTransport; import com.android.server.backup.RefactoredBackupManagerService; +import com.android.server.backup.transport.TransportClient; import java.io.File; public class PerformClearTask implements Runnable { - - private RefactoredBackupManagerService backupManagerService; - IBackupTransport mTransport; - PackageInfo mPackage; + private final RefactoredBackupManagerService mBackupManagerService; + private final TransportClient mTransportClient; + private final PackageInfo mPackage; + private final OnTaskFinishedListener mListener; PerformClearTask(RefactoredBackupManagerService backupManagerService, - IBackupTransport transport, PackageInfo packageInfo) { - this.backupManagerService = backupManagerService; - mTransport = transport; + TransportClient transportClient, PackageInfo packageInfo, + OnTaskFinishedListener listener) { + mBackupManagerService = backupManagerService; + mTransportClient = transportClient; mPackage = packageInfo; + mListener = listener; } public void run() { + String callerLogString = "PerformClearTask.run()"; + IBackupTransport transport = null; try { // Clear the on-device backup state to ensure a full backup next time - File stateDir = new File(backupManagerService.getBaseStateDir(), - mTransport.transportDirName()); + File stateDir = new File(mBackupManagerService.getBaseStateDir(), + mTransportClient.getTransportDirName()); File stateFile = new File(stateDir, mPackage.packageName); stateFile.delete(); + transport = mTransportClient.connectOrThrow(callerLogString); // Tell the transport to remove all the persistent storage for the app // TODO - need to handle failures - mTransport.clearBackupData(mPackage); + transport.clearBackupData(mPackage); } catch (Exception e) { Slog.e(TAG, "Transport threw clearing data for " + mPackage + ": " + e.getMessage()); } finally { - try { - // TODO - need to handle failures - mTransport.finishBackup(); - } catch (Exception e) { - // Nothing we can do here, alas - Slog.e(TAG, "Unable to mark clear operation finished: " + e.getMessage()); + if (transport != null) { + try { + // TODO - need to handle failures + transport.finishBackup(); + } catch (Exception e) { + // Nothing we can do here, alas + Slog.e(TAG, "Unable to mark clear operation finished: " + e.getMessage()); + } } - + mListener.onFinished(callerLogString); // Last but not least, release the cpu - backupManagerService.getWakelock().release(); + mBackupManagerService.getWakelock().release(); } } } diff --git a/services/backup/java/com/android/server/backup/params/ClearParams.java b/services/backup/java/com/android/server/backup/params/ClearParams.java index d744efce521a..dc3bba007443 100644 --- a/services/backup/java/com/android/server/backup/params/ClearParams.java +++ b/services/backup/java/com/android/server/backup/params/ClearParams.java @@ -18,15 +18,20 @@ package com.android.server.backup.params; import android.content.pm.PackageInfo; -import com.android.internal.backup.IBackupTransport; +import com.android.server.backup.internal.OnTaskFinishedListener; +import com.android.server.backup.transport.TransportClient; public class ClearParams { - - public IBackupTransport transport; + public TransportClient transportClient; public PackageInfo packageInfo; + public OnTaskFinishedListener listener; - public ClearParams(IBackupTransport _transport, PackageInfo _info) { - transport = _transport; - packageInfo = _info; + public ClearParams( + TransportClient transportClient, + PackageInfo packageInfo, + OnTaskFinishedListener listener) { + this.transportClient = transportClient; + this.packageInfo = packageInfo; + this.listener = listener; } } diff --git a/services/backup/java/com/android/server/backup/params/ClearRetryParams.java b/services/backup/java/com/android/server/backup/params/ClearRetryParams.java index fcf66e40162e..41b564106b55 100644 --- a/services/backup/java/com/android/server/backup/params/ClearRetryParams.java +++ b/services/backup/java/com/android/server/backup/params/ClearRetryParams.java @@ -17,12 +17,11 @@ package com.android.server.backup.params; public class ClearRetryParams { - public String transportName; public String packageName; - public ClearRetryParams(String transport, String pkg) { - transportName = transport; - packageName = pkg; + public ClearRetryParams(String transportName, String packageName) { + this.transportName = transportName; + this.packageName = packageName; } } |