Loading cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +3 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.commands.bmgr; import android.annotation.IntDef; import android.annotation.UserIdInt; import android.app.backup.BackupManager; import android.app.backup.BackupManager.OperationType; import android.app.backup.BackupManagerMonitor; import android.app.backup.BackupProgress; import android.app.backup.BackupTransport; Loading Loading @@ -666,7 +667,7 @@ public class Bmgr { // The rest of the 'list' options work with a restore session on the current transport try { mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null); mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null, OperationType.BACKUP); if (mRestore == null) { System.err.println(BMGR_ERR_NO_RESTORESESSION_FOR_USER + userId); return; Loading Loading @@ -821,7 +822,7 @@ public class Bmgr { try { boolean didRestore = false; mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null); mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null, OperationType.BACKUP); if (mRestore == null) { System.err.println(BMGR_ERR_NO_RESTORESESSION_FOR_USER + userId); return; Loading core/java/android/app/backup/BackupManager.java +58 −3 Original line number Diff line number Diff line Loading @@ -361,7 +361,36 @@ public class BackupManager { try { // All packages, current transport IRestoreSession binder = sService.beginRestoreSessionForUser(mContext.getUserId(), null, null); sService.beginRestoreSessionForUser(mContext.getUserId(), null, null, OperationType.BACKUP); if (binder != null) { session = new RestoreSession(mContext, binder); } } catch (RemoteException e) { Log.e(TAG, "beginRestoreSession() couldn't connect"); } } return session; } /** * Begin the process of restoring data from backup. See the * {@link android.app.backup.RestoreSession} class for documentation on that process. * * @param operationType Type of the operation, see {@link OperationType} * * @hide */ @RequiresPermission(android.Manifest.permission.BACKUP) public RestoreSession beginRestoreSession(@OperationType int operationType) { RestoreSession session = null; checkServiceBinder(); if (sService != null) { try { // All packages, current transport IRestoreSession binder = sService.beginRestoreSessionForUser(mContext.getUserId(), null, null, operationType); if (binder != null) { session = new RestoreSession(mContext, binder); } Loading Loading @@ -772,7 +801,7 @@ public class BackupManager { @SystemApi @RequiresPermission(android.Manifest.permission.BACKUP) public int requestBackup(String[] packages, BackupObserver observer) { return requestBackup(packages, observer, null, 0); return requestBackup(packages, observer, null, 0, OperationType.BACKUP); } /** Loading @@ -797,6 +826,31 @@ public class BackupManager { @RequiresPermission(android.Manifest.permission.BACKUP) public int requestBackup(String[] packages, BackupObserver observer, 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(); if (sService != null) { try { Loading @@ -806,7 +860,8 @@ public class BackupManager { BackupManagerMonitorWrapper monitorWrapper = monitor == null ? null : new BackupManagerMonitorWrapper(monitor); return sService.requestBackup(packages, observerWrapper, monitorWrapper, flags); return sService.requestBackup(packages, observerWrapper, monitorWrapper, flags, operationType); } catch (RemoteException e) { Log.e(TAG, "requestBackup() couldn't connect"); } Loading core/java/android/app/backup/IBackupManager.aidl +4 −2 Original line number Diff line number Diff line Loading @@ -547,9 +547,11 @@ interface IBackupManager { * set can be restored. * @param transportID The name of the transport to use for the restore operation. * May be null, in which case the current active transport is used. * @param operationType Type of the operation, see {@link BackupManager#OperationType} * @return An interface to the restore session, or null on error. */ IRestoreSession beginRestoreSessionForUser(int userId, String packageName, String transportID); IRestoreSession beginRestoreSessionForUser(int userId, String packageName, String transportID, int operationType); /** * Notify the backup manager that a BackupAgent has completed the operation Loading Loading @@ -678,7 +680,7 @@ interface IBackupManager { * {@link android.app.backup.IBackupManager.requestBackupForUser} for the calling user id. */ 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 Loading services/backup/java/com/android/server/backup/BackupManagerService.java +14 −9 Original line number Diff line number Diff line Loading @@ -1245,9 +1245,10 @@ public class BackupManagerService extends IBackupManager.Stub { @Override public IRestoreSession beginRestoreSessionForUser( int userId, String packageName, String transportID) throws RemoteException { int userId, String packageName, String transportID, @OperationType int operationType) throws RemoteException { return isUserReadyForBackup(userId) ? beginRestoreSession(userId, packageName, transportID) : null; ? beginRestoreSession(userId, packageName, transportID, operationType) : null; } /** Loading @@ -1256,13 +1257,15 @@ public class BackupManagerService extends IBackupManager.Stub { */ @Nullable public IRestoreSession beginRestoreSession( @UserIdInt int userId, String packageName, String transportName) { @UserIdInt int userId, String packageName, String transportName, @OperationType int operationType) { UserBackupManagerService userBackupManagerService = getServiceForUserIfCallerHasPermission(userId, "beginRestoreSession()"); return userBackupManagerService == null ? null : userBackupManagerService.beginRestoreSession(packageName, transportName); : userBackupManagerService.beginRestoreSession(packageName, transportName, operationType); } @Override Loading Loading @@ -1347,15 +1350,15 @@ public class BackupManagerService extends IBackupManager.Stub { if (!isUserReadyForBackup(userId)) { return BackupManager.ERROR_BACKUP_NOT_ALLOWED; } return requestBackup(userId, packages, observer, monitor, flags); return requestBackup(userId, packages, observer, monitor, flags, OperationType.BACKUP); } @Override public int requestBackup(String[] packages, IBackupObserver observer, IBackupManagerMonitor monitor, int flags) IBackupManagerMonitor monitor, int flags, @OperationType int operationType) throws RemoteException { return requestBackup(binderGetCallingUserId(), packages, observer, monitor, flags); observer, monitor, flags, operationType); } /** Loading @@ -1367,13 +1370,15 @@ public class BackupManagerService extends IBackupManager.Stub { String[] packages, IBackupObserver observer, IBackupManagerMonitor monitor, int flags) { int flags, @OperationType int operationType) { UserBackupManagerService userBackupManagerService = getServiceForUserIfCallerHasPermission(userId, "requestBackup()"); return userBackupManagerService == null ? BackupManager.ERROR_BACKUP_NOT_ALLOWED : userBackupManagerService.requestBackup(packages, observer, monitor, flags); : userBackupManagerService.requestBackup(packages, observer, monitor, flags, operationType); } @Override Loading services/backup/java/com/android/server/backup/UserBackupManagerService.java +15 −36 Original line number Diff line number Diff line Loading @@ -127,7 +127,6 @@ import com.android.server.backup.params.RestoreParams; import com.android.server.backup.restore.ActiveRestoreSession; import com.android.server.backup.restore.PerformUnifiedRestoreTask; import com.android.server.backup.transport.TransportClient; import com.android.server.backup.transport.TransportNotAvailableException; import com.android.server.backup.transport.TransportNotRegisteredException; import com.android.server.backup.utils.BackupEligibilityRules; import com.android.server.backup.utils.BackupManagerMonitorUtils; Loading Loading @@ -1861,10 +1860,19 @@ public class UserBackupManagerService { /** * Requests a backup for the inputted {@code packages} with a specified {@link * IBackupManagerMonitor} and {@link OperationType}. * IBackupManagerMonitor}. */ public int requestBackup(String[] packages, IBackupObserver observer, 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"); if (packages == null || packages.length < 1) { Loading Loading @@ -1895,16 +1903,13 @@ public class UserBackupManagerService { final TransportClient transportClient; final String transportDirName; int operationType; try { transportDirName = mTransportManager.getTransportDirName( mTransportManager.getCurrentTransportName()); transportClient = mTransportManager.getCurrentTransportClientOrThrow("BMS.requestBackup()"); operationType = getOperationTypeFromTransport(transportClient); } catch (TransportNotRegisteredException | TransportNotAvailableException | RemoteException e) { } catch (TransportNotRegisteredException e) { BackupObserverUtils.sendBackupFinished(observer, BackupManager.ERROR_TRANSPORT_ABORTED); monitor = BackupManagerMonitorUtils.monitorEvent(monitor, BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_IS_NULL, Loading Loading @@ -4019,13 +4024,15 @@ public class UserBackupManagerService { } /** Hand off a restore session. */ public IRestoreSession beginRestoreSession(String packageName, String transport) { public IRestoreSession beginRestoreSession(String packageName, String transport, @OperationType int operationType) { if (DEBUG) { Slog.v( TAG, addUserIdToLogMessage( mUserId, "beginRestoreSession: pkg=" + packageName + " transport=" + transport)); "beginRestoreSession: pkg=" + packageName + " transport=" + transport + "operationType=" + operationType)); } boolean needPermission = true; Loading Loading @@ -4066,17 +4073,6 @@ public class UserBackupManagerService { } } int operationType; try { operationType = getOperationTypeFromTransport( mTransportManager.getTransportClientOrThrow(transport, /* caller */ "BMS.beginRestoreSession")); } catch (TransportNotAvailableException | TransportNotRegisteredException | RemoteException e) { Slog.w(TAG, "Failed to get operation type from transport: " + e); return null; } synchronized (this) { if (mActiveRestoreSession != null) { Slog.i( Loading Loading @@ -4360,23 +4356,6 @@ public class UserBackupManagerService { } } @VisibleForTesting @OperationType int getOperationTypeFromTransport(TransportClient transportClient) throws TransportNotAvailableException, RemoteException { long oldCallingId = Binder.clearCallingIdentity(); try { IBackupTransport transport = transportClient.connectOrThrow( /* caller */ "BMS.getOperationTypeFromTransport"); if ((transport.getTransportFlags() & BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { return OperationType.MIGRATION; } else { return OperationType.BACKUP; } } finally { Binder.restoreCallingIdentity(oldCallingId); } } private static String addUserIdToLogMessage(int userId, String message) { return "[UserID:" + userId + "] " + message; } Loading Loading
cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +3 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.commands.bmgr; import android.annotation.IntDef; import android.annotation.UserIdInt; import android.app.backup.BackupManager; import android.app.backup.BackupManager.OperationType; import android.app.backup.BackupManagerMonitor; import android.app.backup.BackupProgress; import android.app.backup.BackupTransport; Loading Loading @@ -666,7 +667,7 @@ public class Bmgr { // The rest of the 'list' options work with a restore session on the current transport try { mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null); mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null, OperationType.BACKUP); if (mRestore == null) { System.err.println(BMGR_ERR_NO_RESTORESESSION_FOR_USER + userId); return; Loading Loading @@ -821,7 +822,7 @@ public class Bmgr { try { boolean didRestore = false; mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null); mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null, OperationType.BACKUP); if (mRestore == null) { System.err.println(BMGR_ERR_NO_RESTORESESSION_FOR_USER + userId); return; Loading
core/java/android/app/backup/BackupManager.java +58 −3 Original line number Diff line number Diff line Loading @@ -361,7 +361,36 @@ public class BackupManager { try { // All packages, current transport IRestoreSession binder = sService.beginRestoreSessionForUser(mContext.getUserId(), null, null); sService.beginRestoreSessionForUser(mContext.getUserId(), null, null, OperationType.BACKUP); if (binder != null) { session = new RestoreSession(mContext, binder); } } catch (RemoteException e) { Log.e(TAG, "beginRestoreSession() couldn't connect"); } } return session; } /** * Begin the process of restoring data from backup. See the * {@link android.app.backup.RestoreSession} class for documentation on that process. * * @param operationType Type of the operation, see {@link OperationType} * * @hide */ @RequiresPermission(android.Manifest.permission.BACKUP) public RestoreSession beginRestoreSession(@OperationType int operationType) { RestoreSession session = null; checkServiceBinder(); if (sService != null) { try { // All packages, current transport IRestoreSession binder = sService.beginRestoreSessionForUser(mContext.getUserId(), null, null, operationType); if (binder != null) { session = new RestoreSession(mContext, binder); } Loading Loading @@ -772,7 +801,7 @@ public class BackupManager { @SystemApi @RequiresPermission(android.Manifest.permission.BACKUP) public int requestBackup(String[] packages, BackupObserver observer) { return requestBackup(packages, observer, null, 0); return requestBackup(packages, observer, null, 0, OperationType.BACKUP); } /** Loading @@ -797,6 +826,31 @@ public class BackupManager { @RequiresPermission(android.Manifest.permission.BACKUP) public int requestBackup(String[] packages, BackupObserver observer, 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(); if (sService != null) { try { Loading @@ -806,7 +860,8 @@ public class BackupManager { BackupManagerMonitorWrapper monitorWrapper = monitor == null ? null : new BackupManagerMonitorWrapper(monitor); return sService.requestBackup(packages, observerWrapper, monitorWrapper, flags); return sService.requestBackup(packages, observerWrapper, monitorWrapper, flags, operationType); } catch (RemoteException e) { Log.e(TAG, "requestBackup() couldn't connect"); } Loading
core/java/android/app/backup/IBackupManager.aidl +4 −2 Original line number Diff line number Diff line Loading @@ -547,9 +547,11 @@ interface IBackupManager { * set can be restored. * @param transportID The name of the transport to use for the restore operation. * May be null, in which case the current active transport is used. * @param operationType Type of the operation, see {@link BackupManager#OperationType} * @return An interface to the restore session, or null on error. */ IRestoreSession beginRestoreSessionForUser(int userId, String packageName, String transportID); IRestoreSession beginRestoreSessionForUser(int userId, String packageName, String transportID, int operationType); /** * Notify the backup manager that a BackupAgent has completed the operation Loading Loading @@ -678,7 +680,7 @@ interface IBackupManager { * {@link android.app.backup.IBackupManager.requestBackupForUser} for the calling user id. */ 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 Loading
services/backup/java/com/android/server/backup/BackupManagerService.java +14 −9 Original line number Diff line number Diff line Loading @@ -1245,9 +1245,10 @@ public class BackupManagerService extends IBackupManager.Stub { @Override public IRestoreSession beginRestoreSessionForUser( int userId, String packageName, String transportID) throws RemoteException { int userId, String packageName, String transportID, @OperationType int operationType) throws RemoteException { return isUserReadyForBackup(userId) ? beginRestoreSession(userId, packageName, transportID) : null; ? beginRestoreSession(userId, packageName, transportID, operationType) : null; } /** Loading @@ -1256,13 +1257,15 @@ public class BackupManagerService extends IBackupManager.Stub { */ @Nullable public IRestoreSession beginRestoreSession( @UserIdInt int userId, String packageName, String transportName) { @UserIdInt int userId, String packageName, String transportName, @OperationType int operationType) { UserBackupManagerService userBackupManagerService = getServiceForUserIfCallerHasPermission(userId, "beginRestoreSession()"); return userBackupManagerService == null ? null : userBackupManagerService.beginRestoreSession(packageName, transportName); : userBackupManagerService.beginRestoreSession(packageName, transportName, operationType); } @Override Loading Loading @@ -1347,15 +1350,15 @@ public class BackupManagerService extends IBackupManager.Stub { if (!isUserReadyForBackup(userId)) { return BackupManager.ERROR_BACKUP_NOT_ALLOWED; } return requestBackup(userId, packages, observer, monitor, flags); return requestBackup(userId, packages, observer, monitor, flags, OperationType.BACKUP); } @Override public int requestBackup(String[] packages, IBackupObserver observer, IBackupManagerMonitor monitor, int flags) IBackupManagerMonitor monitor, int flags, @OperationType int operationType) throws RemoteException { return requestBackup(binderGetCallingUserId(), packages, observer, monitor, flags); observer, monitor, flags, operationType); } /** Loading @@ -1367,13 +1370,15 @@ public class BackupManagerService extends IBackupManager.Stub { String[] packages, IBackupObserver observer, IBackupManagerMonitor monitor, int flags) { int flags, @OperationType int operationType) { UserBackupManagerService userBackupManagerService = getServiceForUserIfCallerHasPermission(userId, "requestBackup()"); return userBackupManagerService == null ? BackupManager.ERROR_BACKUP_NOT_ALLOWED : userBackupManagerService.requestBackup(packages, observer, monitor, flags); : userBackupManagerService.requestBackup(packages, observer, monitor, flags, operationType); } @Override Loading
services/backup/java/com/android/server/backup/UserBackupManagerService.java +15 −36 Original line number Diff line number Diff line Loading @@ -127,7 +127,6 @@ import com.android.server.backup.params.RestoreParams; import com.android.server.backup.restore.ActiveRestoreSession; import com.android.server.backup.restore.PerformUnifiedRestoreTask; import com.android.server.backup.transport.TransportClient; import com.android.server.backup.transport.TransportNotAvailableException; import com.android.server.backup.transport.TransportNotRegisteredException; import com.android.server.backup.utils.BackupEligibilityRules; import com.android.server.backup.utils.BackupManagerMonitorUtils; Loading Loading @@ -1861,10 +1860,19 @@ public class UserBackupManagerService { /** * Requests a backup for the inputted {@code packages} with a specified {@link * IBackupManagerMonitor} and {@link OperationType}. * IBackupManagerMonitor}. */ public int requestBackup(String[] packages, IBackupObserver observer, 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"); if (packages == null || packages.length < 1) { Loading Loading @@ -1895,16 +1903,13 @@ public class UserBackupManagerService { final TransportClient transportClient; final String transportDirName; int operationType; try { transportDirName = mTransportManager.getTransportDirName( mTransportManager.getCurrentTransportName()); transportClient = mTransportManager.getCurrentTransportClientOrThrow("BMS.requestBackup()"); operationType = getOperationTypeFromTransport(transportClient); } catch (TransportNotRegisteredException | TransportNotAvailableException | RemoteException e) { } catch (TransportNotRegisteredException e) { BackupObserverUtils.sendBackupFinished(observer, BackupManager.ERROR_TRANSPORT_ABORTED); monitor = BackupManagerMonitorUtils.monitorEvent(monitor, BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_IS_NULL, Loading Loading @@ -4019,13 +4024,15 @@ public class UserBackupManagerService { } /** Hand off a restore session. */ public IRestoreSession beginRestoreSession(String packageName, String transport) { public IRestoreSession beginRestoreSession(String packageName, String transport, @OperationType int operationType) { if (DEBUG) { Slog.v( TAG, addUserIdToLogMessage( mUserId, "beginRestoreSession: pkg=" + packageName + " transport=" + transport)); "beginRestoreSession: pkg=" + packageName + " transport=" + transport + "operationType=" + operationType)); } boolean needPermission = true; Loading Loading @@ -4066,17 +4073,6 @@ public class UserBackupManagerService { } } int operationType; try { operationType = getOperationTypeFromTransport( mTransportManager.getTransportClientOrThrow(transport, /* caller */ "BMS.beginRestoreSession")); } catch (TransportNotAvailableException | TransportNotRegisteredException | RemoteException e) { Slog.w(TAG, "Failed to get operation type from transport: " + e); return null; } synchronized (this) { if (mActiveRestoreSession != null) { Slog.i( Loading Loading @@ -4360,23 +4356,6 @@ public class UserBackupManagerService { } } @VisibleForTesting @OperationType int getOperationTypeFromTransport(TransportClient transportClient) throws TransportNotAvailableException, RemoteException { long oldCallingId = Binder.clearCallingIdentity(); try { IBackupTransport transport = transportClient.connectOrThrow( /* caller */ "BMS.getOperationTypeFromTransport"); if ((transport.getTransportFlags() & BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { return OperationType.MIGRATION; } else { return OperationType.BACKUP; } } finally { Binder.restoreCallingIdentity(oldCallingId); } } private static String addUserIdToLogMessage(int userId, String message) { return "[UserID:" + userId + "] " + message; } Loading