Merge "Get OperationType from transport" into sc-dev

This commit is contained in:
Ruslan Tkhakokhov
2021-02-11 13:10:33 +00:00
committed by Android (Google) Code Review
7 changed files with 89 additions and 117 deletions

View File

@@ -19,7 +19,6 @@ 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;
@@ -667,7 +666,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, OperationType.BACKUP);
mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null);
if (mRestore == null) {
System.err.println(BMGR_ERR_NO_RESTORESESSION_FOR_USER + userId);
return;
@@ -822,7 +821,7 @@ public class Bmgr {
try {
boolean didRestore = false;
mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null, OperationType.BACKUP);
mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null);
if (mRestore == null) {
System.err.println(BMGR_ERR_NO_RESTORESESSION_FOR_USER + userId);
return;

View File

@@ -361,36 +361,7 @@ public class BackupManager {
try {
// All packages, current transport
IRestoreSession binder =
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);
sService.beginRestoreSessionForUser(mContext.getUserId(), null, null);
if (binder != null) {
session = new RestoreSession(mContext, binder);
}
@@ -801,7 +772,7 @@ public class BackupManager {
@SystemApi
@RequiresPermission(android.Manifest.permission.BACKUP)
public int requestBackup(String[] packages, BackupObserver observer) {
return requestBackup(packages, observer, null, 0, OperationType.BACKUP);
return requestBackup(packages, observer, null, 0);
}
/**
@@ -826,31 +797,6 @@ 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 {
@@ -860,8 +806,7 @@ public class BackupManager {
BackupManagerMonitorWrapper monitorWrapper = monitor == null
? null
: new BackupManagerMonitorWrapper(monitor);
return sService.requestBackup(packages, observerWrapper, monitorWrapper, flags,
operationType);
return sService.requestBackup(packages, observerWrapper, monitorWrapper, flags);
} catch (RemoteException e) {
Log.e(TAG, "requestBackup() couldn't connect");
}

View File

@@ -547,11 +547,9 @@ 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,
int operationType);
IRestoreSession beginRestoreSessionForUser(int userId, String packageName, String transportID);
/**
* Notify the backup manager that a BackupAgent has completed the operation
@@ -680,7 +678,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 operationType);
int flags);
/**
* Cancel all running backups. After this call returns, no currently running backups will

View File

@@ -1245,10 +1245,9 @@ public class BackupManagerService extends IBackupManager.Stub {
@Override
public IRestoreSession beginRestoreSessionForUser(
int userId, String packageName, String transportID,
@OperationType int operationType) throws RemoteException {
int userId, String packageName, String transportID) throws RemoteException {
return isUserReadyForBackup(userId)
? beginRestoreSession(userId, packageName, transportID, operationType) : null;
? beginRestoreSession(userId, packageName, transportID) : null;
}
/**
@@ -1257,15 +1256,13 @@ public class BackupManagerService extends IBackupManager.Stub {
*/
@Nullable
public IRestoreSession beginRestoreSession(
@UserIdInt int userId, String packageName, String transportName,
@OperationType int operationType) {
@UserIdInt int userId, String packageName, String transportName) {
UserBackupManagerService userBackupManagerService =
getServiceForUserIfCallerHasPermission(userId, "beginRestoreSession()");
return userBackupManagerService == null
? null
: userBackupManagerService.beginRestoreSession(packageName, transportName,
operationType);
: userBackupManagerService.beginRestoreSession(packageName, transportName);
}
@Override
@@ -1350,15 +1347,15 @@ public class BackupManagerService extends IBackupManager.Stub {
if (!isUserReadyForBackup(userId)) {
return BackupManager.ERROR_BACKUP_NOT_ALLOWED;
}
return requestBackup(userId, packages, observer, monitor, flags, OperationType.BACKUP);
return requestBackup(userId, packages, observer, monitor, flags);
}
@Override
public int requestBackup(String[] packages, IBackupObserver observer,
IBackupManagerMonitor monitor, int flags, @OperationType int operationType)
IBackupManagerMonitor monitor, int flags)
throws RemoteException {
return requestBackup(binderGetCallingUserId(), packages,
observer, monitor, flags, operationType);
observer, monitor, flags);
}
/**
@@ -1370,15 +1367,13 @@ public class BackupManagerService extends IBackupManager.Stub {
String[] packages,
IBackupObserver observer,
IBackupManagerMonitor monitor,
int flags,
@OperationType int operationType) {
int flags) {
UserBackupManagerService userBackupManagerService =
getServiceForUserIfCallerHasPermission(userId, "requestBackup()");
return userBackupManagerService == null
? BackupManager.ERROR_BACKUP_NOT_ALLOWED
: userBackupManagerService.requestBackup(packages, observer, monitor, flags,
operationType);
: userBackupManagerService.requestBackup(packages, observer, monitor, flags);
}
@Override

View File

@@ -127,6 +127,7 @@ 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;
@@ -1858,21 +1859,12 @@ public class UserBackupManagerService {
return requestBackup(packages, observer, null, flags);
}
/**
* Requests a backup for the inputted {@code packages} with a specified {@link
* 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) {
IBackupManagerMonitor monitor, int flags) {
mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "requestBackup");
if (packages == null || packages.length < 1) {
@@ -1903,13 +1895,16 @@ public class UserBackupManagerService {
final TransportClient transportClient;
final String transportDirName;
int operationType;
try {
transportDirName =
mTransportManager.getTransportDirName(
mTransportManager.getCurrentTransportName());
transportClient =
mTransportManager.getCurrentTransportClientOrThrow("BMS.requestBackup()");
} catch (TransportNotRegisteredException e) {
operationType = getOperationTypeFromTransport(transportClient);
} catch (TransportNotRegisteredException | TransportNotAvailableException
| RemoteException e) {
BackupObserverUtils.sendBackupFinished(observer, BackupManager.ERROR_TRANSPORT_ABORTED);
monitor = BackupManagerMonitorUtils.monitorEvent(monitor,
BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_IS_NULL,
@@ -4024,15 +4019,13 @@ public class UserBackupManagerService {
}
/** Hand off a restore session. */
public IRestoreSession beginRestoreSession(String packageName, String transport,
@OperationType int operationType) {
public IRestoreSession beginRestoreSession(String packageName, String transport) {
if (DEBUG) {
Slog.v(
TAG,
addUserIdToLogMessage(
mUserId,
"beginRestoreSession: pkg=" + packageName + " transport=" + transport
+ "operationType=" + operationType));
"beginRestoreSession: pkg=" + packageName + " transport=" + transport));
}
boolean needPermission = true;
@@ -4073,6 +4066,17 @@ 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(
@@ -4356,6 +4360,23 @@ 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;
}

View File

@@ -38,7 +38,6 @@ import static org.testng.Assert.expectThrows;
import android.annotation.UserIdInt;
import android.app.Application;
import android.app.backup.BackupManager.OperationType;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupObserver;
import android.app.backup.IFullBackupRestoreObserver;
@@ -874,8 +873,7 @@ public class BackupManagerServiceRoboTest {
SecurityException.class,
() ->
backupManagerService.requestBackup(
mUserTwoId, packages, observer, monitor, 0,
OperationType.BACKUP));
mUserTwoId, packages, observer, monitor, 0));
}
/**
@@ -893,11 +891,9 @@ public class BackupManagerServiceRoboTest {
IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class);
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true);
backupManagerService.requestBackup(mUserTwoId, packages, observer, monitor, /* flags */ 0,
OperationType.BACKUP);
backupManagerService.requestBackup(mUserTwoId, packages, observer, monitor, /* flags */ 0);
verify(mUserTwoService).requestBackup(packages, observer, monitor, /* flags */ 0,
OperationType.BACKUP);
verify(mUserTwoService).requestBackup(packages, observer, monitor, /* flags */ 0);
}
/** Test that the backup service routes methods correctly to the user that requests it. */
@@ -910,11 +906,9 @@ public class BackupManagerServiceRoboTest {
IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class);
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.requestBackup(mUserOneId, packages, observer, monitor, /* flags */ 0,
OperationType.BACKUP);
backupManagerService.requestBackup(mUserOneId, packages, observer, monitor, /* flags */ 0);
verify(mUserOneService).requestBackup(packages, observer, monitor, /* flags */ 0,
OperationType.BACKUP);
verify(mUserOneService).requestBackup(packages, observer, monitor, /* flags */ 0);
}
/** Test that the backup service routes methods correctly to the user that requests it. */
@@ -927,11 +921,9 @@ public class BackupManagerServiceRoboTest {
IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class);
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.requestBackup(mUserTwoId, packages, observer, monitor, /* flags */ 0,
OperationType.BACKUP);
backupManagerService.requestBackup(mUserTwoId, packages, observer, monitor, /* flags */ 0);
verify(mUserOneService, never()).requestBackup(packages, observer, monitor, /* flags */ 0,
OperationType.BACKUP);
verify(mUserOneService, never()).requestBackup(packages, observer, monitor, /* flags */ 0);
}
/**
@@ -1092,11 +1084,9 @@ public class BackupManagerServiceRoboTest {
registerUser(backupManagerService, mUserOneId, mUserOneService);
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.beginRestoreSession(mUserOneId, TEST_PACKAGE, TEST_TRANSPORT,
OperationType.BACKUP);
backupManagerService.beginRestoreSession(mUserOneId, TEST_PACKAGE, TEST_TRANSPORT);
verify(mUserOneService).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT,
OperationType.BACKUP);
verify(mUserOneService).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT);
}
/** Test that the backup service does not route methods for non-registered users. */
@@ -1106,11 +1096,9 @@ public class BackupManagerServiceRoboTest {
registerUser(backupManagerService, mUserOneId, mUserOneService);
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.beginRestoreSession(mUserTwoId, TEST_PACKAGE, TEST_TRANSPORT,
OperationType.BACKUP);
backupManagerService.beginRestoreSession(mUserTwoId, TEST_PACKAGE, TEST_TRANSPORT);
verify(mUserOneService, never()).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT,
OperationType.BACKUP);
verify(mUserOneService, never()).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT);
}
/** Test that the backup service routes methods correctly to the user that requests it. */

View File

@@ -23,6 +23,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import android.app.backup.BackupAgent;
import android.app.backup.BackupManager.OperationType;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupObserver;
@@ -30,6 +31,7 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import com.android.internal.backup.IBackupTransport;
import android.platform.test.annotations.Presubmit;
import androidx.test.runner.AndroidJUnit4;
@@ -56,6 +58,7 @@ public class UserBackupManagerServiceTest {
@Mock IBackupObserver mBackupObserver;
@Mock PackageManager mPackageManager;
@Mock TransportClient mTransportClient;
@Mock IBackupTransport mBackupTransport;
@Mock BackupEligibilityRules mBackupEligibilityRules;
@@ -132,6 +135,29 @@ public class UserBackupManagerServiceTest {
assertThat(params.mBackupEligibilityRules).isEqualTo(mBackupEligibilityRules);
}
@Test
public void testGetOperationTypeFromTransport_returnsMigrationForMigrationTransport()
throws Exception {
when(mTransportClient.connectOrThrow(any())).thenReturn(mBackupTransport);
when(mBackupTransport.getTransportFlags()).thenReturn(
BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER);
int operationType = mService.getOperationTypeFromTransport(mTransportClient);
assertThat(operationType).isEqualTo(OperationType.MIGRATION);
}
@Test
public void testGetOperationTypeFromTransport_returnsBackupByDefault()
throws Exception {
when(mTransportClient.connectOrThrow(any())).thenReturn(mBackupTransport);
when(mBackupTransport.getTransportFlags()).thenReturn(0);
int operationType = mService.getOperationTypeFromTransport(mTransportClient);
assertThat(operationType).isEqualTo(OperationType.BACKUP);
}
private static PackageInfo getPackageInfo(String packageName) {
PackageInfo packageInfo = new PackageInfo();
packageInfo.applicationInfo = new ApplicationInfo();