Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f93a0918 authored by Bernardo Rufino's avatar Bernardo Rufino
Browse files

Binding on-demand #4: PerformClearTask usage

Migeate the clear flow.

Change-Id: Id268f772ae0f7a88b3e060c9597d777e0b73121a
Ref: http://go/br-binding-on-demand
Bug: 17140907
Test: adb shell bmgr wipe <transport> <package> and observed logs
Test: gts-tradefed run commandAndExit gts-dev -m GtsBackupTestCases
Test: gts-tradefed run commandAndExit gts-dev -m GtsBackupHostTestCases
Test: cts-tradefed run commandAndExit cts-dev -m CtsBackupTestCases
parent 7742160e
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -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);
            }
+7 −2
Original line number Diff line number Diff line
@@ -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;
            }

+26 −18
Original line number Diff line number Diff line
@@ -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 {
            if (transport != null) {
                try {
                    // TODO - need to handle failures
                mTransport.finishBackup();
                    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();
        }
    }
}
+11 −6
Original line number Diff line number Diff line
@@ -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;
    }
}
+3 −4
Original line number Diff line number Diff line
@@ -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;
    }
}