summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/IBackupAgent.aidl6
-rw-r--r--core/java/android/app/backup/BackupAgent.java6
-rw-r--r--core/java/android/app/backup/BackupManagerMonitor.java8
-rw-r--r--services/backup/java/com/android/server/backup/UserBackupManagerService.java4
-rw-r--r--services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java12
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/backup/UserBackupManagerServiceTest.java4
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java77
7 files changed, 98 insertions, 19 deletions
diff --git a/core/java/android/app/IBackupAgent.aidl b/core/java/android/app/IBackupAgent.aidl
index c5e536f4ba6d..ff0872695926 100644
--- a/core/java/android/app/IBackupAgent.aidl
+++ b/core/java/android/app/IBackupAgent.aidl
@@ -208,6 +208,12 @@ oneway interface IBackupAgent {
in AndroidFuture<List<BackupRestoreEventLogger.DataTypeResult>> resultsFuture);
/**
+ * Provides the operation type (backup or restore) the agent is created for. See
+ * {@link android.app.backup.BackupAnnotations.OperationType}.
+ */
+ void getOperationType(in AndroidFuture<int> operationTypeFuture);
+
+ /**
* Clears the logs accumulated by the BackupAgent during a backup or restore operation.
*/
void clearBackupRestoreEventLogger();
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java
index 3eaa8daca7d1..0b8d1dfccc07 100644
--- a/core/java/android/app/backup/BackupAgent.java
+++ b/core/java/android/app/backup/BackupAgent.java
@@ -1353,6 +1353,12 @@ public abstract class BackupAgent extends ContextWrapper {
}
@Override
+ public void getOperationType(
+ AndroidFuture<Integer> in) {
+ in.complete(mLogger == null ? OperationType.UNKNOWN : mLogger.getOperationType());
+ }
+
+ @Override
public void clearBackupRestoreEventLogger() {
final long ident = Binder.clearCallingIdentity();
try {
diff --git a/core/java/android/app/backup/BackupManagerMonitor.java b/core/java/android/app/backup/BackupManagerMonitor.java
index d134ca27b354..f73366b6af0c 100644
--- a/core/java/android/app/backup/BackupManagerMonitor.java
+++ b/core/java/android/app/backup/BackupManagerMonitor.java
@@ -17,6 +17,7 @@
package android.app.backup;
import android.annotation.SystemApi;
+import android.app.backup.BackupAnnotations.OperationType;
import android.os.Bundle;
/**
@@ -136,6 +137,13 @@ public class BackupManagerMonitor {
public static final String EXTRA_LOG_AGENT_LOGGING_RESULTS =
"android.app.backup.extra.LOG_AGENT_LOGGING_RESULTS";
+ /**
+ * The operation type this log is associated with. See {@link OperationType}.
+ *
+ * @hide
+ */
+ public static final String EXTRA_LOG_OPERATION_TYPE = "android.app.backup.extra.OPERATION_TYPE";
+
// TODO complete this list with all log messages. And document properly.
public static final int LOG_EVENT_ID_FULL_BACKUP_CANCEL = 4;
public static final int LOG_EVENT_ID_ILLEGAL_KEY = 5;
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index 7261709d7b8d..995e557d8176 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -46,6 +46,7 @@ import android.app.IActivityManager;
import android.app.IBackupAgent;
import android.app.PendingIntent;
import android.app.backup.BackupAgent;
+import android.app.backup.BackupAnnotations;
import android.app.backup.BackupAnnotations.BackupDestination;
import android.app.backup.BackupManager;
import android.app.backup.BackupManagerMonitor;
@@ -3066,7 +3067,8 @@ public class UserBackupManagerService {
/* caller */ "BMS.reportDelayedRestoreResult");
IBackupManagerMonitor monitor = transportClient.getBackupManagerMonitor();
- BackupManagerMonitorUtils.sendAgentLoggingResults(monitor, packageInfo, results);
+ BackupManagerMonitorUtils.sendAgentLoggingResults(monitor, packageInfo, results,
+ BackupAnnotations.OperationType.RESTORE);
} catch (NameNotFoundException | TransportNotAvailableException
| TransportNotRegisteredException | RemoteException e) {
Slog.w(TAG, "Failed to send delayed restore logs: " + e);
diff --git a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java
index 57ad89b0a482..439b83687b8f 100644
--- a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java
@@ -18,6 +18,7 @@ package com.android.server.backup.utils;
import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_AGENT_LOGGING_RESULTS;
import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_NAME;
+import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE;
import static android.app.backup.BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT;
import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_AGENT_LOGGING_RESULTS;
@@ -27,6 +28,7 @@ import static com.android.server.backup.BackupManagerService.TAG;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.IBackupAgent;
+import android.app.backup.BackupAnnotations.OperationType;
import android.app.backup.BackupManagerMonitor;
import android.app.backup.BackupRestoreEventLogger.DataTypeResult;
import android.app.backup.IBackupManagerMonitor;
@@ -122,9 +124,13 @@ public class BackupManagerMonitorUtils {
try {
AndroidFuture<List<DataTypeResult>> resultsFuture =
new AndroidFuture<>();
+ AndroidFuture<Integer> operationTypeFuture = new AndroidFuture<>();
agent.getLoggerResults(resultsFuture);
+ agent.getOperationType(operationTypeFuture);
return sendAgentLoggingResults(monitor, pkg,
- resultsFuture.get(AGENT_LOGGER_RESULTS_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS));
+ resultsFuture.get(AGENT_LOGGER_RESULTS_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS),
+ operationTypeFuture.get(AGENT_LOGGER_RESULTS_TIMEOUT_MILLIS,
+ TimeUnit.MILLISECONDS));
} catch (TimeoutException e) {
Slog.w(TAG, "Timeout while waiting to retrieve logging results from agent", e);
} catch (Exception e) {
@@ -134,10 +140,12 @@ public class BackupManagerMonitorUtils {
}
public static IBackupManagerMonitor sendAgentLoggingResults(
- @NonNull IBackupManagerMonitor monitor, PackageInfo pkg, List<DataTypeResult> results) {
+ @NonNull IBackupManagerMonitor monitor, PackageInfo pkg, List<DataTypeResult> results,
+ @OperationType int operationType) {
Bundle loggerResultsBundle = new Bundle();
loggerResultsBundle.putParcelableList(
EXTRA_LOG_AGENT_LOGGING_RESULTS, results);
+ loggerResultsBundle.putInt(EXTRA_LOG_OPERATION_TYPE, operationType);
return monitorEvent(
monitor,
LOG_EVENT_ID_AGENT_LOGGING_RESULTS,
diff --git a/services/tests/mockingservicestests/src/com/android/server/backup/UserBackupManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/backup/UserBackupManagerServiceTest.java
index 3480af62e6c4..dc1c6d57dfdb 100644
--- a/services/tests/mockingservicestests/src/com/android/server/backup/UserBackupManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/backup/UserBackupManagerServiceTest.java
@@ -31,6 +31,7 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.when;
import android.app.backup.BackupAgent;
+import android.app.backup.BackupAnnotations;
import android.app.backup.BackupAnnotations.BackupDestination;
import android.app.backup.BackupRestoreEventLogger.DataTypeResult;
import android.app.backup.IBackupManagerMonitor;
@@ -246,7 +247,8 @@ public class UserBackupManagerServiceTest {
mService.reportDelayedRestoreResult(TEST_PACKAGE, results);
verify(() -> BackupManagerMonitorUtils.sendAgentLoggingResults(
- eq(mBackupManagerMonitor), eq(packageInfo), eq(results)));
+ eq(mBackupManagerMonitor), eq(packageInfo), eq(results), eq(
+ BackupAnnotations.OperationType.RESTORE)));
}
private static PackageInfo getPackageInfo(String packageName) {
diff --git a/services/tests/mockingservicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java b/services/tests/mockingservicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java
index 87ade963e121..093ad3cc7bb3 100644
--- a/services/tests/mockingservicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java
@@ -21,6 +21,7 @@ import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_ID;
import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION;
import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_NAME;
import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_VERSION;
+import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE;
import static android.app.backup.BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT;
import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_AGENT_LOGGING_RESULTS;
@@ -33,6 +34,8 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.app.IBackupAgent;
+import android.app.backup.BackupAnnotations;
+import android.app.backup.BackupAnnotations.OperationType;
import android.app.backup.BackupManagerMonitor;
import android.app.backup.BackupRestoreEventLogger;
import android.app.backup.IBackupManagerMonitor;
@@ -155,50 +158,94 @@ public class BackupManagerMonitorUtilsTest {
}
@Test
- public void monitorAgentLoggingResults_fillsBundleCorrectly() throws Exception {
+ public void monitorAgentLoggingResults_onBackup_fillsBundleCorrectly() throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test.package";
// Mock an agent that returns a logging result.
+ IBackupAgent agent = setUpLoggingAgentForOperation(OperationType.BACKUP);
+
+ IBackupManagerMonitor monitor =
+ BackupManagerMonitorUtils.monitorAgentLoggingResults(
+ mMonitorMock, packageInfo, agent);
+
+ assertCorrectBundleSentToMonitor(monitor, OperationType.BACKUP);
+ }
+
+ @Test
+ public void monitorAgentLoggingResults_onRestore_fillsBundleCorrectly() throws Exception {
+ PackageInfo packageInfo = new PackageInfo();
+ packageInfo.packageName = "test.package";
+ // Mock an agent that returns a logging result.
+ IBackupAgent agent = setUpLoggingAgentForOperation(OperationType.RESTORE);
+
+ IBackupManagerMonitor monitor =
+ BackupManagerMonitorUtils.monitorAgentLoggingResults(
+ mMonitorMock, packageInfo, agent);
+
+ assertCorrectBundleSentToMonitor(monitor, OperationType.RESTORE);
+ }
+
+ private IBackupAgent setUpLoggingAgentForOperation(@OperationType int operationType)
+ throws Exception {
IBackupAgent agent = spy(IBackupAgent.class);
List<BackupRestoreEventLogger.DataTypeResult> loggingResults = new ArrayList<>();
loggingResults.add(new BackupRestoreEventLogger.DataTypeResult("testLoggingResult"));
doAnswer(
- invocation -> {
- AndroidFuture<List<BackupRestoreEventLogger.DataTypeResult>> in =
- invocation.getArgument(0);
- in.complete(loggingResults);
- return null;
- })
+ invocation -> {
+ AndroidFuture<List<BackupRestoreEventLogger.DataTypeResult>> in =
+ invocation.getArgument(0);
+ in.complete(loggingResults);
+ return null;
+ })
.when(agent)
.getLoggerResults(any());
+ doAnswer(
+ invocation -> {
+ AndroidFuture<Integer> in = invocation.getArgument(0);
+ in.complete(operationType);
+ return null;
+ })
+ .when(agent)
+ .getOperationType(any());
+ return agent;
+ }
- IBackupManagerMonitor monitor =
- BackupManagerMonitorUtils.monitorAgentLoggingResults(
- mMonitorMock, packageInfo, agent);
+ @Test
+ public void sendAgentLoggingResults_onBackup_fillsBundleCorrectly() throws Exception {
+ PackageInfo packageInfo = new PackageInfo();
+ packageInfo.packageName = "test.package";
+ List<BackupRestoreEventLogger.DataTypeResult> loggingResults = new ArrayList<>();
+ loggingResults.add(new BackupRestoreEventLogger.DataTypeResult("testLoggingResult"));
+
+ IBackupManagerMonitor monitor = BackupManagerMonitorUtils.sendAgentLoggingResults(
+ mMonitorMock, packageInfo, loggingResults, OperationType.BACKUP);
- assertCorrectBundleSentToMonitor(monitor);
+ assertCorrectBundleSentToMonitor(monitor, OperationType.BACKUP);
}
@Test
- public void sendAgentLoggingResults_fillsBundleCorrectly() throws Exception {
+ public void sendAgentLoggingResults_onRestore_fillsBundleCorrectly() throws Exception {
PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = "test.package";
List<BackupRestoreEventLogger.DataTypeResult> loggingResults = new ArrayList<>();
loggingResults.add(new BackupRestoreEventLogger.DataTypeResult("testLoggingResult"));
IBackupManagerMonitor monitor = BackupManagerMonitorUtils.sendAgentLoggingResults(
- mMonitorMock, packageInfo, loggingResults);
+ mMonitorMock, packageInfo, loggingResults, OperationType.RESTORE);
- assertCorrectBundleSentToMonitor(monitor);
+ assertCorrectBundleSentToMonitor(monitor, OperationType.RESTORE);
}
- private void assertCorrectBundleSentToMonitor(IBackupManagerMonitor monitor) throws Exception {
+ private void assertCorrectBundleSentToMonitor(IBackupManagerMonitor monitor,
+ @OperationType int operationType) throws Exception {
assertThat(monitor).isEqualTo(mMonitorMock);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
verify(mMonitorMock).onEvent(bundleCaptor.capture());
Bundle eventBundle = bundleCaptor.getValue();
+ assertThat(eventBundle.getInt(EXTRA_LOG_OPERATION_TYPE))
+ .isEqualTo(operationType);
assertThat(eventBundle.getInt(EXTRA_LOG_EVENT_ID))
.isEqualTo(LOG_EVENT_ID_AGENT_LOGGING_RESULTS);
assertThat(eventBundle.getInt(EXTRA_LOG_EVENT_CATEGORY))