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

Commit d403e908 authored by Ruslan Tkhakokhov's avatar Ruslan Tkhakokhov Committed by Android (Google) Code Review
Browse files

Merge "Add APIs to log B&R events during delayed restore"

parents 6ef8e62b 033b9645
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1496,11 +1496,13 @@ package android.app.backup {
    method @RequiresPermission(android.Manifest.permission.BACKUP) public android.content.Intent getDataManagementIntent(String);
    method @Nullable @RequiresPermission(android.Manifest.permission.BACKUP) public CharSequence getDataManagementIntentLabel(@NonNull String);
    method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.BACKUP) public String getDataManagementLabel(@NonNull String);
    method @NonNull public android.app.backup.BackupRestoreEventLogger getDelayedRestoreLogger();
    method @RequiresPermission(android.Manifest.permission.BACKUP) public String getDestinationString(String);
    method @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isAppEligibleForBackup(String);
    method @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isBackupEnabled();
    method @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isBackupServiceActive(android.os.UserHandle);
    method @RequiresPermission(android.Manifest.permission.BACKUP) public String[] listAllTransports();
    method @NonNull public void reportDelayedRestoreResult(@NonNull android.app.backup.BackupRestoreEventLogger);
    method @RequiresPermission(android.Manifest.permission.BACKUP) public int requestBackup(String[], android.app.backup.BackupObserver);
    method @RequiresPermission(android.Manifest.permission.BACKUP) public int requestBackup(String[], android.app.backup.BackupObserver, android.app.backup.BackupManagerMonitor, int);
    method @Deprecated public int requestRestore(android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor);
+37 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.app.backup.BackupAnnotations.OperationType;
import android.app.compat.CompatChanges;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter;
@@ -1041,6 +1042,42 @@ public class BackupManager {
        return backupAgent.getBackupRestoreEventLogger();
    }

    /**
     * Get an instance of {@link BackupRestoreEventLogger} to report B&R related events during a
     * delayed restore operation.
     *
     * @return an instance of {@link BackupRestoreEventLogger}.
     *
     * @hide
     */
    @NonNull
    @SystemApi
    public BackupRestoreEventLogger getDelayedRestoreLogger() {
        return new BackupRestoreEventLogger(OperationType.RESTORE);
    }

    /**
     * Report B&R related events following a delayed restore operation.
     *
     * @param logger an instance of {@link BackupRestoreEventLogger} to which the corresponding
     *               events have been logged.
     *
     * @hide
     */
    @NonNull
    @SystemApi
    public void reportDelayedRestoreResult(@NonNull BackupRestoreEventLogger logger) {
        checkServiceBinder();
        if (sService != null) {
            try {
                sService.reportDelayedRestoreResult(mContext.getPackageName(),
                        logger.getLoggingResults());
            } catch (RemoteException e) {
                Log.w(TAG, "reportDelayedRestoreResult() couldn't connect");
            }
        }
    }

    /*
     * We wrap incoming binder calls with a private class implementation that
     * redirects them into main-thread actions.  This serializes the backup
+3 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.app.backup;

import android.app.backup.BackupRestoreEventLogger.DataTypeResult;
import android.app.backup.IBackupObserver;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IFullBackupRestoreObserver;
@@ -722,4 +723,6 @@ interface IBackupManager {
     * that have been excluded will be passed to the agent to make it aware of the exclusions.
     */
    void excludeKeysFromRestore(String packageName, in List<String> keys);

    void reportDelayedRestoreResult(in String packageName, in List<DataTypeResult> results);
}
+7 −0
Original line number Diff line number Diff line
@@ -83,6 +83,13 @@ public class BackupManagerTest {
                () -> mBackupManager.getBackupRestoreEventLogger(agent));
    }

    @Test
    public void testGetDelayedRestoreLogger_returnsRestoreLogger() {
        BackupRestoreEventLogger logger = mBackupManager.getDelayedRestoreLogger();

        assertThat(logger.getOperationType()).isEqualTo(OperationType.RESTORE);
    }

    private static BackupAgent getTestAgent() {
        return new BackupAgent() {
            @Override
+18 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
import android.app.backup.BackupManager;
import android.app.backup.BackupRestoreEventLogger;
import android.app.backup.BackupRestoreEventLogger.DataTypeResult;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupObserver;
@@ -1556,6 +1558,22 @@ public class BackupManagerService extends IBackupManager.Stub {
        }
    }

    public void reportDelayedRestoreResult(String packageName, List<DataTypeResult> results) {
        int userId = Binder.getCallingUserHandle().getIdentifier();
        if (!isUserReadyForBackup(userId)) {
            Slog.w(TAG, "Returning from reportDelayedRestoreResult as backup for user" + userId +
                    " is not initialized yet");
            return;
        }
        UserBackupManagerService userBackupManagerService =
                getServiceForUserIfCallerHasPermission(userId,
                        /* caller */ "reportDelayedRestoreResult()");

        if (userBackupManagerService != null) {
            userBackupManagerService.reportDelayedRestoreResult(packageName, results);
        }
    }

    /**
     * Returns the {@link UserBackupManagerService} instance for the specified user {@code userId}.
     * If the user is not registered with the service (either the user is locked or not eligible for
Loading