summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ruslan Tkhakokhov <rthakohov@google.com> 2020-08-06 19:42:52 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-08-06 19:42:52 +0000
commit5d650722cb764e7427b8548c275990dc8bcb85c9 (patch)
tree13b5018f9264f736e1d3ef981f628a56b55c25dd
parent016f6e7bf5b96a589cba0a9f17b0a1e580c2046f (diff)
parent9bdd2f67192def131adf015b6f5adcc3b112c847 (diff)
Merge "[FSD2D] Add BackupManager API to start restore"
-rw-r--r--cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java5
-rw-r--r--core/java/android/app/backup/BackupManager.java31
-rw-r--r--core/java/android/app/backup/IBackupManager.aidl4
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerService.java11
-rw-r--r--services/backup/java/com/android/server/backup/UserBackupManagerService.java12
-rw-r--r--services/backup/java/com/android/server/backup/internal/BackupHandler.java3
-rw-r--r--services/backup/java/com/android/server/backup/params/RestoreParams.java30
-rw-r--r--services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java15
-rw-r--r--services/robotests/backup/src/com/android/server/backup/BackupManagerServiceRoboTest.java12
-rw-r--r--services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java8
10 files changed, 98 insertions, 33 deletions
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
index ed717c491467..4b7eda096e54 100644
--- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
+++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
@@ -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;
@@ -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;
@@ -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;
diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java
index b1a62bf42cc4..9b67587c4dcd 100644
--- a/core/java/android/app/backup/BackupManager.java
+++ b/core/java/android/app/backup/BackupManager.java
@@ -355,7 +355,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);
}
diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl
index 96b5dd593bbe..e177a74915ee 100644
--- a/core/java/android/app/backup/IBackupManager.aidl
+++ b/core/java/android/app/backup/IBackupManager.aidl
@@ -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
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 12e6e10d9047..186812bc15c7 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -1239,9 +1239,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;
}
/**
@@ -1250,13 +1251,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
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index 3ab81cbb313f..27a280a3e656 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -3973,7 +3973,8 @@ public class UserBackupManagerService {
restoreSet,
packageName,
token,
- listener);
+ listener,
+ mScheduledBackupEligibility);
mBackupHandler.sendMessage(msg);
} catch (Exception e) {
// Calling into the transport broke; back off and proceed with the installation.
@@ -4002,13 +4003,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;
@@ -4065,7 +4068,8 @@ public class UserBackupManagerService {
"Restore session requested but currently running backups"));
return null;
}
- mActiveRestoreSession = new ActiveRestoreSession(this, packageName, transport);
+ mActiveRestoreSession = new ActiveRestoreSession(this, packageName, transport,
+ getEligibilityRulesForOperation(operationType));
mBackupHandler.sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT,
mAgentTimeoutParameters.getRestoreAgentTimeoutMillis());
}
diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
index 1bb434950563..100dbae9f01d 100644
--- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java
+++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
@@ -305,8 +305,7 @@ public class BackupHandler extends Handler {
params.isSystemRestore,
params.filterSet,
params.listener,
- backupManagerService.getEligibilityRulesForOperation(
- OperationType.BACKUP));
+ params.backupEligibilityRules);
synchronized (backupManagerService.getPendingRestores()) {
if (backupManagerService.isRestoreInProgress()) {
diff --git a/services/backup/java/com/android/server/backup/params/RestoreParams.java b/services/backup/java/com/android/server/backup/params/RestoreParams.java
index a6fea6cc75a0..a08a1f8d5387 100644
--- a/services/backup/java/com/android/server/backup/params/RestoreParams.java
+++ b/services/backup/java/com/android/server/backup/params/RestoreParams.java
@@ -23,6 +23,7 @@ import android.content.pm.PackageInfo;
import com.android.server.backup.internal.OnTaskFinishedListener;
import com.android.server.backup.transport.TransportClient;
+import com.android.server.backup.utils.BackupEligibilityRules;
import java.util.Map;
import java.util.Set;
@@ -37,6 +38,7 @@ public class RestoreParams {
public final boolean isSystemRestore;
@Nullable public final String[] filterSet;
public final OnTaskFinishedListener listener;
+ public final BackupEligibilityRules backupEligibilityRules;
/**
* No kill after restore.
@@ -47,7 +49,8 @@ public class RestoreParams {
IBackupManagerMonitor monitor,
long token,
PackageInfo packageInfo,
- OnTaskFinishedListener listener) {
+ OnTaskFinishedListener listener,
+ BackupEligibilityRules eligibilityRules) {
return new RestoreParams(
transportClient,
observer,
@@ -57,7 +60,8 @@ public class RestoreParams {
/* pmToken */ 0,
/* isSystemRestore */ false,
/* filterSet */ null,
- listener);
+ listener,
+ eligibilityRules);
}
/**
@@ -70,7 +74,8 @@ public class RestoreParams {
long token,
String packageName,
int pmToken,
- OnTaskFinishedListener listener) {
+ OnTaskFinishedListener listener,
+ BackupEligibilityRules backupEligibilityRules) {
String[] filterSet = {packageName};
return new RestoreParams(
transportClient,
@@ -81,7 +86,8 @@ public class RestoreParams {
pmToken,
/* isSystemRestore */ false,
filterSet,
- listener);
+ listener,
+ backupEligibilityRules);
}
/**
@@ -92,7 +98,8 @@ public class RestoreParams {
IRestoreObserver observer,
IBackupManagerMonitor monitor,
long token,
- OnTaskFinishedListener listener) {
+ OnTaskFinishedListener listener,
+ BackupEligibilityRules backupEligibilityRules) {
return new RestoreParams(
transportClient,
observer,
@@ -102,7 +109,8 @@ public class RestoreParams {
/* pmToken */ 0,
/* isSystemRestore */ true,
/* filterSet */ null,
- listener);
+ listener,
+ backupEligibilityRules);
}
/**
@@ -115,7 +123,8 @@ public class RestoreParams {
long token,
String[] filterSet,
boolean isSystemRestore,
- OnTaskFinishedListener listener) {
+ OnTaskFinishedListener listener,
+ BackupEligibilityRules backupEligibilityRules) {
return new RestoreParams(
transportClient,
observer,
@@ -125,7 +134,8 @@ public class RestoreParams {
/* pmToken */ 0,
isSystemRestore,
filterSet,
- listener);
+ listener,
+ backupEligibilityRules);
}
private RestoreParams(
@@ -137,7 +147,8 @@ public class RestoreParams {
int pmToken,
boolean isSystemRestore,
@Nullable String[] filterSet,
- OnTaskFinishedListener listener) {
+ OnTaskFinishedListener listener,
+ BackupEligibilityRules backupEligibilityRules) {
this.transportClient = transportClient;
this.observer = observer;
this.monitor = monitor;
@@ -147,5 +158,6 @@ public class RestoreParams {
this.isSystemRestore = isSystemRestore;
this.filterSet = filterSet;
this.listener = listener;
+ this.backupEligibilityRules = backupEligibilityRules;
}
}
diff --git a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java
index 5a57cdc39402..3102b5f4a04d 100644
--- a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java
+++ b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java
@@ -42,6 +42,7 @@ import com.android.server.backup.internal.OnTaskFinishedListener;
import com.android.server.backup.params.RestoreGetSetsParams;
import com.android.server.backup.params.RestoreParams;
import com.android.server.backup.transport.TransportClient;
+import com.android.server.backup.utils.BackupEligibilityRules;
import java.util.function.BiFunction;
@@ -55,6 +56,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
private final String mTransportName;
private final UserBackupManagerService mBackupManagerService;
private final int mUserId;
+ private final BackupEligibilityRules mBackupEligibilityRules;
@Nullable private final String mPackageName;
public RestoreSet[] mRestoreSets = null;
boolean mEnded = false;
@@ -63,12 +65,14 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
public ActiveRestoreSession(
UserBackupManagerService backupManagerService,
@Nullable String packageName,
- String transportName) {
+ String transportName,
+ BackupEligibilityRules backupEligibilityRules) {
mBackupManagerService = backupManagerService;
mPackageName = packageName;
mTransportManager = backupManagerService.getTransportManager();
mTransportName = transportName;
mUserId = backupManagerService.getUserId();
+ mBackupEligibilityRules = backupEligibilityRules;
}
public void markTimedOut() {
@@ -178,7 +182,8 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
observer,
monitor,
token,
- listener),
+ listener,
+ mBackupEligibilityRules),
"RestoreSession.restoreAll()");
} finally {
Binder.restoreCallingIdentity(oldId);
@@ -271,7 +276,8 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
token,
packages,
/* isSystemRestore */ packages.length > 1,
- listener),
+ listener,
+ mBackupEligibilityRules),
"RestoreSession.restorePackages(" + packages.length + " packages)");
} finally {
Binder.restoreCallingIdentity(oldId);
@@ -363,7 +369,8 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
monitor,
token,
app,
- listener),
+ listener,
+ mBackupEligibilityRules),
"RestoreSession.restorePackage(" + packageName + ")");
} finally {
Binder.restoreCallingIdentity(oldId);
diff --git a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceRoboTest.java b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceRoboTest.java
index cd9b6aca72e0..cbebe6984794 100644
--- a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceRoboTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceRoboTest.java
@@ -1092,9 +1092,11 @@ public class BackupManagerServiceRoboTest {
registerUser(backupManagerService, mUserOneId, mUserOneService);
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
- backupManagerService.beginRestoreSession(mUserOneId, TEST_PACKAGE, TEST_TRANSPORT);
+ backupManagerService.beginRestoreSession(mUserOneId, TEST_PACKAGE, TEST_TRANSPORT,
+ OperationType.BACKUP);
- verify(mUserOneService).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT);
+ verify(mUserOneService).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT,
+ OperationType.BACKUP);
}
/** Test that the backup service does not route methods for non-registered users. */
@@ -1104,9 +1106,11 @@ public class BackupManagerServiceRoboTest {
registerUser(backupManagerService, mUserOneId, mUserOneService);
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
- backupManagerService.beginRestoreSession(mUserTwoId, TEST_PACKAGE, TEST_TRANSPORT);
+ backupManagerService.beginRestoreSession(mUserTwoId, TEST_PACKAGE, TEST_TRANSPORT,
+ OperationType.BACKUP);
- verify(mUserOneService, never()).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT);
+ verify(mUserOneService, never()).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT,
+ OperationType.BACKUP);
}
/** Test that the backup service routes methods correctly to the user that requests it. */
diff --git a/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java b/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
index 3fc421dfb6e9..5883c1cb5995 100644
--- a/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
@@ -57,6 +57,7 @@ import com.android.server.backup.internal.BackupHandler;
import com.android.server.backup.testing.TransportData;
import com.android.server.backup.testing.TransportTestUtils;
import com.android.server.backup.testing.TransportTestUtils.TransportMock;
+import com.android.server.backup.utils.BackupEligibilityRules;
import com.android.server.testing.shadows.ShadowApplicationPackageManager;
import com.android.server.testing.shadows.ShadowEventLog;
import com.android.server.testing.shadows.ShadowPerformUnifiedRestoreTask;
@@ -96,6 +97,7 @@ public class ActiveRestoreSessionTest {
@Mock private TransportManager mTransportManager;
@Mock private IRestoreObserver mObserver;
@Mock private IBackupManagerMonitor mMonitor;
+ @Mock private BackupEligibilityRules mBackupEligibilityRules;
private ShadowLooper mShadowBackupLooper;
private ShadowApplication mShadowApplication;
private UserBackupManagerService.BackupWakeLock mWakeLock;
@@ -576,7 +578,8 @@ public class ActiveRestoreSessionTest {
private IRestoreSession createActiveRestoreSession(
String packageName, TransportData transport) {
return new ActiveRestoreSession(
- mBackupManagerService, packageName, transport.transportName);
+ mBackupManagerService, packageName, transport.transportName,
+ mBackupEligibilityRules);
}
private IRestoreSession createActiveRestoreSessionWithRestoreSets(
@@ -584,7 +587,8 @@ public class ActiveRestoreSessionTest {
throws RemoteException {
ActiveRestoreSession restoreSession =
new ActiveRestoreSession(
- mBackupManagerService, packageName, transport.transportName);
+ mBackupManagerService, packageName, transport.transportName,
+ mBackupEligibilityRules);
restoreSession.setRestoreSets(restoreSets);
return restoreSession;
}