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

Commit 998fdaa6 authored by Bernardo Rufino's avatar Bernardo Rufino
Browse files

Binding on-demand #5: PerformUnifiedRestoreTask usage

Migrate restore flow and related.

Change-Id: Ib61863e401067d7d4a9669982be8b3d87af0caa2
Ref: http://go/br-binding-on-demand
Bug: 17140907
Test: adb shell bmgr restore <set> <package> and observed logs
Test: adb shell bmgr restore <set> and observed logs
Test: Backed-up and re-installed app, observing 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
Test: Looking into adding GTS/CTS for restore scenarios
parent 7742160e
Loading
Loading
Loading
Loading
+27 −11
Original line number Diff line number Diff line
@@ -3233,10 +3233,10 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
            skip = true;
        }

        // Do we have a transport to fetch data for us?
        IBackupTransport transport = mTransportManager.getCurrentTransportBinder();
        if (transport == null) {
            if (DEBUG) Slog.w(TAG, "No transport");
        TransportClient transportClient =
                mTransportManager.getCurrentTransportClient("BMS.restoreAtInstall()");
        if (transportClient == null) {
            if (DEBUG) Slog.w(TAG, "No transport client");
            skip = true;
        }

@@ -3253,16 +3253,26 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
                // The eventual message back into the Package Manager to run the post-install
                // steps for 'token' will be issued from the restore handling code.

                // This can throw and so *must* happen before the wakelock is acquired
                String dirName = transport.transportDirName();

                mWakelock.acquire();

                OnTaskFinishedListener listener = caller -> {
                        mTransportManager.disposeOfTransportClient(transportClient, caller);
                        mWakelock.release();
                };

                if (MORE_DEBUG) {
                    Slog.d(TAG, "Restore at install of " + packageName);
                }
                Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE);
                msg.obj = new RestoreParams(transport, dirName, null, null,
                        restoreSet, packageName, token);
                msg.obj =
                        RestoreParams.createForRestoreAtInstall(
                                transportClient,
                                /* observer */ null,
                                /* monitor */ null,
                                restoreSet,
                                packageName,
                                token,
                                listener);
                mBackupHandler.sendMessage(msg);
            } catch (Exception e) {
                // Calling into the transport broke; back off and proceed with the installation.
@@ -3272,8 +3282,14 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
        }

        if (skip) {
            // Auto-restore disabled or no way to attempt a restore; just tell the Package
            // Manager to proceed with the post-install handling for this package.
            // Auto-restore disabled or no way to attempt a restore

            if (transportClient != null) {
                mTransportManager.disposeOfTransportClient(
                        transportClient, "BMS.restoreAtInstall()");
            }

            // Tell the PackageManager to proceed with the post-install handling for this package.
            if (DEBUG) Slog.v(TAG, "Finishing install immediately");
            try {
                mPackageManagerBinder.finishPackageInstall(token, false);
+6 −0
Original line number Diff line number Diff line
@@ -308,6 +308,12 @@ public class TransportManager {
        }
    }

    public boolean isTransportRegistered(String transportName) {
        synchronized (mTransportLock) {
            return getRegisteredTransportEntryLocked(transportName) != null;
        }
    }

    /**
     * Returns a {@link TransportClient} for the current transport or null if not found.
     *
+18 −7
Original line number Diff line number Diff line
@@ -189,7 +189,7 @@ public class BackupHandler extends Handler {
                    }
                    task.execute();
                } catch (ClassCastException e) {
                    Slog.e(TAG, "Invalid backup task in flight, obj=" + msg.obj);
                    Slog.e(TAG, "Invalid backup/restore task in flight, obj=" + msg.obj);
                }
                break;
            }
@@ -229,10 +229,18 @@ public class BackupHandler extends Handler {
                RestoreParams params = (RestoreParams) msg.obj;
                Slog.d(TAG, "MSG_RUN_RESTORE observer=" + params.observer);

                PerformUnifiedRestoreTask task = new PerformUnifiedRestoreTask(backupManagerService,
                        params.transport,
                        params.observer, params.monitor, params.token, params.pkgInfo,
                        params.pmToken, params.isSystemRestore, params.filterSet);
                PerformUnifiedRestoreTask task =
                        new PerformUnifiedRestoreTask(
                                backupManagerService,
                                params.transportClient,
                                params.observer,
                                params.monitor,
                                params.token,
                                params.packageInfo,
                                params.pmToken,
                                params.isSystemRestore,
                                params.filterSet,
                                params.listener);

                synchronized (backupManagerService.getPendingRestores()) {
                    if (backupManagerService.isRestoreInProgress()) {
@@ -294,8 +302,11 @@ public class BackupHandler extends Handler {
                // Like other async operations, this is entered with the wakelock held
                RestoreSet[] sets = null;
                RestoreGetSetsParams params = (RestoreGetSetsParams) msg.obj;
                String callerLogString = "BH/MSG_RUN_GET_RESTORE_SETS";
                try {
                    sets = params.transport.getAvailableRestoreSets();
                    IBackupTransport transport =
                            params.transportClient.connectOrThrow(callerLogString);
                    sets = transport.getAvailableRestoreSets();
                    // cache the result in the active session
                    synchronized (params.session) {
                        params.session.mRestoreSets = sets;
@@ -320,7 +331,7 @@ public class BackupHandler extends Handler {
                    removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
                    sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT, TIMEOUT_RESTORE_INTERVAL);

                    backupManagerService.getWakelock().release();
                    params.listener.onFinished(callerLogString);
                }
                break;
            }
+2 −2
Original line number Diff line number Diff line
@@ -907,7 +907,7 @@ public class PerformBackupTask implements BackupRestoreTask {
            mStatus = BackupTransport.TRANSPORT_OK;
            long size = 0;
            try {
                TransportUtils.checkTransport(transport);
                TransportUtils.checkTransportNotNull(transport);
                size = mBackupDataName.length();
                if (size > 0) {
                    if (mStatus == BackupTransport.TRANSPORT_OK) {
@@ -997,7 +997,7 @@ public class PerformBackupTask implements BackupRestoreTask {
                }
                if (mAgentBinder != null) {
                    try {
                        TransportUtils.checkTransport(transport);
                        TransportUtils.checkTransportNotNull(transport);
                        long quota = transport.getBackupQuota(mCurrentPackage.packageName, false);
                        mAgentBinder.doQuotaExceeded(size, quota);
                    } catch (Exception e) {
+12 −8
Original line number Diff line number Diff line
@@ -20,20 +20,24 @@ import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IRestoreObserver;

import com.android.internal.backup.IBackupTransport;
import com.android.server.backup.internal.OnTaskFinishedListener;
import com.android.server.backup.restore.ActiveRestoreSession;
import com.android.server.backup.transport.TransportClient;

public class RestoreGetSetsParams {
    public final TransportClient transportClient;
    public final ActiveRestoreSession session;
    public final IRestoreObserver observer;
    public final IBackupManagerMonitor monitor;
    public final OnTaskFinishedListener listener;

    public IBackupTransport transport;
    public ActiveRestoreSession session;
    public IRestoreObserver observer;
    public IBackupManagerMonitor monitor;

    public RestoreGetSetsParams(IBackupTransport _transport, ActiveRestoreSession _session,
            IRestoreObserver _observer, IBackupManagerMonitor _monitor) {
        transport = _transport;
    public RestoreGetSetsParams(TransportClient _transportClient, ActiveRestoreSession _session,
            IRestoreObserver _observer, IBackupManagerMonitor _monitor,
            OnTaskFinishedListener _listener) {
        transportClient = _transportClient;
        session = _session;
        observer = _observer;
        monitor = _monitor;
        listener = _listener;
    }
}
Loading