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

Commit 2f2e13c1 authored by Ruslan Tkhakokhov's avatar Ruslan Tkhakokhov
Browse files

Add BackupManager API to start migration

Add an override of BackupManager#requestBackup where type of the
operation (a regular backup or a migration) can be specified.

Bug: 160407842
Test: atest UserBackupManagerServiceTest
Change-Id: Ia54fa26b040c3ec3612672585561794ff831afef
parent 2e5a1c22
Loading
Loading
Loading
Loading
+28 −2
Original line number Original line Diff line number Diff line
@@ -752,7 +752,7 @@ public class BackupManager {
    @SystemApi
    @SystemApi
    @RequiresPermission(android.Manifest.permission.BACKUP)
    @RequiresPermission(android.Manifest.permission.BACKUP)
    public int requestBackup(String[] packages, BackupObserver observer) {
    public int requestBackup(String[] packages, BackupObserver observer) {
        return requestBackup(packages, observer, null, 0);
        return requestBackup(packages, observer, null, 0, OperationType.BACKUP);
    }
    }


    /**
    /**
@@ -777,6 +777,31 @@ public class BackupManager {
    @RequiresPermission(android.Manifest.permission.BACKUP)
    @RequiresPermission(android.Manifest.permission.BACKUP)
    public int requestBackup(String[] packages, BackupObserver observer,
    public int requestBackup(String[] packages, BackupObserver observer,
            BackupManagerMonitor monitor, int flags) {
            BackupManagerMonitor monitor, int flags) {
        return requestBackup(packages, observer, monitor, flags, OperationType.BACKUP);
    }

    /**
     * Request an immediate backup, providing an observer to which results of the backup operation
     * will be published. The Android backup system will decide for each package whether it will
     * be full app data backup or key/value-pair-based backup.
     *
     * <p>If this method returns {@link BackupManager#SUCCESS}, the OS will attempt to backup all
     * provided packages using the remote transport.
     *
     * @param packages List of package names to backup.
     * @param observer The {@link BackupObserver} to receive callbacks during the backup
     *                 operation. Could be {@code null}.
     * @param monitor  The {@link BackupManagerMonitorWrapper} to receive callbacks of important
     *                 events during the backup operation. Could be {@code null}.
     * @param flags    {@link #FLAG_NON_INCREMENTAL_BACKUP}.
     * @param operationType {@link OperationType}
     * @return {@link BackupManager#SUCCESS} on success; nonzero on error.
     * @throws IllegalArgumentException on null or empty {@code packages} param.
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.BACKUP)
    public int requestBackup(String[] packages, BackupObserver observer,
            BackupManagerMonitor monitor, int flags, @OperationType int operationType) {
        checkServiceBinder();
        checkServiceBinder();
        if (sService != null) {
        if (sService != null) {
            try {
            try {
@@ -786,7 +811,8 @@ public class BackupManager {
                BackupManagerMonitorWrapper monitorWrapper = monitor == null
                BackupManagerMonitorWrapper monitorWrapper = monitor == null
                        ? null
                        ? null
                        : new BackupManagerMonitorWrapper(monitor);
                        : new BackupManagerMonitorWrapper(monitor);
                return sService.requestBackup(packages, observerWrapper, monitorWrapper, flags);
                return sService.requestBackup(packages, observerWrapper, monitorWrapper, flags,
                        operationType);
            } catch (RemoteException e) {
            } catch (RemoteException e) {
                Log.e(TAG, "requestBackup() couldn't connect");
                Log.e(TAG, "requestBackup() couldn't connect");
            }
            }
+1 −1
Original line number Original line Diff line number Diff line
@@ -678,7 +678,7 @@ interface IBackupManager {
     * {@link android.app.backup.IBackupManager.requestBackupForUser} for the calling user id.
     * {@link android.app.backup.IBackupManager.requestBackupForUser} for the calling user id.
     */
     */
    int requestBackup(in String[] packages, IBackupObserver observer, IBackupManagerMonitor monitor,
    int requestBackup(in String[] packages, IBackupObserver observer, IBackupManagerMonitor monitor,
        int flags);
        int flags, int operationType);


    /**
    /**
     * Cancel all running backups. After this call returns, no currently running backups will
     * Cancel all running backups. After this call returns, no currently running backups will
+10 −6
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManager;
import android.app.backup.BackupManager;
import android.app.backup.BackupManager;
import android.app.backup.BackupManager.OperationType;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupObserver;
import android.app.backup.IBackupObserver;
@@ -1338,14 +1339,15 @@ public class BackupManagerService extends IBackupManager.Stub {
        if (!isUserReadyForBackup(userId)) {
        if (!isUserReadyForBackup(userId)) {
            return BackupManager.ERROR_BACKUP_NOT_ALLOWED;
            return BackupManager.ERROR_BACKUP_NOT_ALLOWED;
        }
        }
        return requestBackup(userId, packages, observer, monitor, flags);
        return requestBackup(userId, packages, observer, monitor, flags, OperationType.BACKUP);
    }
    }


    @Override
    @Override
    public int requestBackup(String[] packages, IBackupObserver observer,
    public int requestBackup(String[] packages, IBackupObserver observer,
            IBackupManagerMonitor monitor, int flags) throws RemoteException {
            IBackupManagerMonitor monitor, int flags, @OperationType int operationType)
        return requestBackupForUser(binderGetCallingUserId(), packages,
            throws RemoteException {
                observer, monitor, flags);
        return requestBackup(binderGetCallingUserId(), packages,
                observer, monitor, flags, operationType);
    }
    }


    /**
    /**
@@ -1357,13 +1359,15 @@ public class BackupManagerService extends IBackupManager.Stub {
            String[] packages,
            String[] packages,
            IBackupObserver observer,
            IBackupObserver observer,
            IBackupManagerMonitor monitor,
            IBackupManagerMonitor monitor,
            int flags) {
            int flags,
            @OperationType int operationType) {
        UserBackupManagerService userBackupManagerService =
        UserBackupManagerService userBackupManagerService =
                getServiceForUserIfCallerHasPermission(userId, "requestBackup()");
                getServiceForUserIfCallerHasPermission(userId, "requestBackup()");


        return userBackupManagerService == null
        return userBackupManagerService == null
                ? BackupManager.ERROR_BACKUP_NOT_ALLOWED
                ? BackupManager.ERROR_BACKUP_NOT_ALLOWED
                : userBackupManagerService.requestBackup(packages, observer, monitor, flags);
                : userBackupManagerService.requestBackup(packages, observer, monitor, flags,
                        operationType);
    }
    }


    @Override
    @Override
+42 −9
Original line number Original line Diff line number Diff line
@@ -47,6 +47,7 @@ import android.app.IBackupAgent;
import android.app.PendingIntent;
import android.app.PendingIntent;
import android.app.backup.BackupAgent;
import android.app.backup.BackupAgent;
import android.app.backup.BackupManager;
import android.app.backup.BackupManager;
import android.app.backup.BackupManager.OperationType;
import android.app.backup.BackupManagerMonitor;
import android.app.backup.BackupManagerMonitor;
import android.app.backup.FullBackup;
import android.app.backup.FullBackup;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupManager;
@@ -535,11 +536,12 @@ public class UserBackupManagerService {
    }
    }


    @VisibleForTesting
    @VisibleForTesting
    UserBackupManagerService(Context context) {
    UserBackupManagerService(Context context, PackageManager packageManager) {
        mContext = context;
        mContext = context;


        mUserId = 0;
        mUserId = 0;
        mRegisterTransportsRequestedTime = 0;
        mRegisterTransportsRequestedTime = 0;
        mPackageManager = packageManager;


        mBaseStateDir = null;
        mBaseStateDir = null;
        mDataDir = null;
        mDataDir = null;
@@ -550,7 +552,6 @@ public class UserBackupManagerService {
        mRunInitIntent = null;
        mRunInitIntent = null;
        mAgentTimeoutParameters = null;
        mAgentTimeoutParameters = null;
        mTransportManager = null;
        mTransportManager = null;
        mPackageManager = null;
        mActivityManagerInternal = null;
        mActivityManagerInternal = null;
        mAlarmManager = null;
        mAlarmManager = null;
        mConstants = null;
        mConstants = null;
@@ -1825,6 +1826,15 @@ public class UserBackupManagerService {
     */
     */
    public int requestBackup(String[] packages, IBackupObserver observer,
    public int requestBackup(String[] packages, IBackupObserver observer,
            IBackupManagerMonitor monitor, int flags) {
            IBackupManagerMonitor monitor, int flags) {
        return requestBackup(packages, observer, monitor, flags, OperationType.BACKUP);
    }

    /**
     * Requests a backup for the inputted {@code packages} with a specified {@link
     * IBackupManagerMonitor} and {@link OperationType}.
     */
    public int requestBackup(String[] packages, IBackupObserver observer,
            IBackupManagerMonitor monitor, int flags, @OperationType int operationType) {
        mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "requestBackup");
        mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "requestBackup");


        if (packages == null || packages.length < 1) {
        if (packages == null || packages.length < 1) {
@@ -1872,6 +1882,18 @@ public class UserBackupManagerService {
        OnTaskFinishedListener listener =
        OnTaskFinishedListener listener =
                caller -> mTransportManager.disposeOfTransportClient(transportClient, caller);
                caller -> mTransportManager.disposeOfTransportClient(transportClient, caller);


        Message msg = mBackupHandler.obtainMessage(MSG_REQUEST_BACKUP);
        msg.obj = getRequestBackupParams(packages, observer, monitor, flags, operationType,
                transportClient, transportDirName, listener);
        mBackupHandler.sendMessage(msg);
        return BackupManager.SUCCESS;
    }

    @VisibleForTesting
    BackupParams getRequestBackupParams(String[] packages, IBackupObserver observer,
            IBackupManagerMonitor monitor, int flags, @OperationType int operationType,
            TransportClient transportClient, String transportDirName,
            OnTaskFinishedListener listener) {
        ArrayList<String> fullBackupList = new ArrayList<>();
        ArrayList<String> fullBackupList = new ArrayList<>();
        ArrayList<String> kvBackupList = new ArrayList<>();
        ArrayList<String> kvBackupList = new ArrayList<>();
        for (String packageName : packages) {
        for (String packageName : packages) {
@@ -1882,12 +1904,13 @@ public class UserBackupManagerService {
            try {
            try {
                PackageInfo packageInfo = mPackageManager.getPackageInfoAsUser(packageName,
                PackageInfo packageInfo = mPackageManager.getPackageInfoAsUser(packageName,
                        PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
                        PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
                if (!AppBackupUtils.appIsEligibleForBackup(packageInfo.applicationInfo, mUserId)) {
                if (!appIsEligibleForBackup(packageInfo.applicationInfo, mUserId,
                        operationType)) {
                    BackupObserverUtils.sendBackupOnPackageResult(observer, packageName,
                    BackupObserverUtils.sendBackupOnPackageResult(observer, packageName,
                            BackupManager.ERROR_BACKUP_NOT_ALLOWED);
                            BackupManager.ERROR_BACKUP_NOT_ALLOWED);
                    continue;
                    continue;
                }
                }
                if (AppBackupUtils.appGetsFullBackup(packageInfo)) {
                if (appGetsFullBackup(packageInfo, operationType)) {
                    fullBackupList.add(packageInfo.packageName);
                    fullBackupList.add(packageInfo.packageName);
                } else {
                } else {
                    kvBackupList.add(packageInfo.packageName);
                    kvBackupList.add(packageInfo.packageName);
@@ -1897,6 +1920,7 @@ public class UserBackupManagerService {
                        BackupManager.ERROR_PACKAGE_NOT_FOUND);
                        BackupManager.ERROR_PACKAGE_NOT_FOUND);
            }
            }
        }
        }

        EventLog.writeEvent(EventLogTags.BACKUP_REQUESTED, packages.length, kvBackupList.size(),
        EventLog.writeEvent(EventLogTags.BACKUP_REQUESTED, packages.length, kvBackupList.size(),
                fullBackupList.size());
                fullBackupList.size());
        if (MORE_DEBUG) {
        if (MORE_DEBUG) {
@@ -1915,11 +1939,20 @@ public class UserBackupManagerService {


        boolean nonIncrementalBackup = (flags & BackupManager.FLAG_NON_INCREMENTAL_BACKUP) != 0;
        boolean nonIncrementalBackup = (flags & BackupManager.FLAG_NON_INCREMENTAL_BACKUP) != 0;


        Message msg = mBackupHandler.obtainMessage(MSG_REQUEST_BACKUP);
        return new BackupParams(transportClient, transportDirName, kvBackupList, fullBackupList,
        msg.obj = new BackupParams(transportClient, transportDirName, kvBackupList, fullBackupList,
                observer, monitor, listener, /* userInitiated */ true, nonIncrementalBackup,
                observer, monitor, listener, true, nonIncrementalBackup);
                operationType);
        mBackupHandler.sendMessage(msg);
    }
        return BackupManager.SUCCESS;

    @VisibleForTesting
    boolean appIsEligibleForBackup(ApplicationInfo applicationInfo, int userId,
            @OperationType int operationType) {
        return AppBackupUtils.appIsEligibleForBackup(applicationInfo, userId, operationType);
    }

    @VisibleForTesting
    boolean appGetsFullBackup(PackageInfo packageInfo, @OperationType int operationType) {
        return AppBackupUtils.appGetsFullBackup(packageInfo, operationType);
    }
    }


    /** Cancel all running backups. */
    /** Cancel all running backups. */
+4 −1
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.server.backup.params;
package com.android.server.backup.params;


import android.app.backup.BackupManager.OperationType;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupObserver;
import android.app.backup.IBackupObserver;


@@ -35,11 +36,12 @@ public class BackupParams {
    public OnTaskFinishedListener listener;
    public OnTaskFinishedListener listener;
    public boolean userInitiated;
    public boolean userInitiated;
    public boolean nonIncrementalBackup;
    public boolean nonIncrementalBackup;
    @OperationType public int operationType;


    public BackupParams(TransportClient transportClient, String dirName,
    public BackupParams(TransportClient transportClient, String dirName,
            ArrayList<String> kvPackages, ArrayList<String> fullPackages, IBackupObserver observer,
            ArrayList<String> kvPackages, ArrayList<String> fullPackages, IBackupObserver observer,
            IBackupManagerMonitor monitor, OnTaskFinishedListener listener, boolean userInitiated,
            IBackupManagerMonitor monitor, OnTaskFinishedListener listener, boolean userInitiated,
            boolean nonIncrementalBackup) {
            boolean nonIncrementalBackup, int operationType) {
        this.transportClient = transportClient;
        this.transportClient = transportClient;
        this.dirName = dirName;
        this.dirName = dirName;
        this.kvPackages = kvPackages;
        this.kvPackages = kvPackages;
@@ -49,5 +51,6 @@ public class BackupParams {
        this.listener = listener;
        this.listener = listener;
        this.userInitiated = userInitiated;
        this.userInitiated = userInitiated;
        this.nonIncrementalBackup = nonIncrementalBackup;
        this.nonIncrementalBackup = nonIncrementalBackup;
        this.operationType = operationType;
    }
    }
}
}
Loading