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

Commit eac151f3 authored by Joël Stemmer's avatar Joël Stemmer Committed by Android (Google) Code Review
Browse files

Merge "Determine backup destination from RestoreSet transport flags on restore" into main

parents 6aad4069 0ee08f16
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.localtransport;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.backup.BackupAgent;
import android.app.backup.BackupAgent.BackupTransportFlags;
import android.app.backup.BackupAnnotations;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
@@ -662,8 +663,13 @@ public class LocalTransport extends BackupTransport {
                mParameters.isDeviceTransfer()
                        ? DEVICE_NAME_FOR_D2D_RESTORE_SET
                        : DEFAULT_DEVICE_NAME_FOR_RESTORE_SET;
        @BackupTransportFlags int transportFlags = 0;
        if (Flags.enableCrossPlatformTransfer() && mParameters.isCrossPlatformTransferIos()) {
            transportFlags |= BackupAgent.FLAG_CROSS_PLATFORM_DATA_TRANSFER_IOS;
        }
        for (int i = 0; i < available.length; i++) {
            available[i] = new RestoreSet("Local disk image", deviceName, existing[i]);
            available[i] =
                    new RestoreSet("Local disk image", deviceName, existing[i], transportFlags);
        }
        return available;
    }
+6 −0
Original line number Diff line number Diff line
@@ -319,6 +319,12 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
                DEVICE_NAME_FOR_D2D_SET.equals(restoreSet.device)
                        ? BackupDestination.DEVICE_TRANSFER
                        : BackupDestination.CLOUD;
        if (Flags.enableCrossPlatformTransfer()
                && ((restoreSet.backupTransportFlags
                                & BackupAgent.FLAG_CROSS_PLATFORM_DATA_TRANSFER_IOS)
                        != 0)) {
            backupDestination = BackupDestination.CROSS_PLATFORM_TRANSFER;
        }

        if (!Flags.enableSkippingRestoreLaunchedApps()) {
            return mBackupManagerService.getEligibilityRulesForOperation(backupDestination);
+8 −2
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.app.ApplicationThreadConstants;
import android.app.IBackupAgent;
import android.app.backup.BackupAgent;
import android.app.backup.BackupAnnotations;
import android.app.backup.BackupAnnotations.BackupDestination;
import android.app.backup.BackupManagerMonitor;
import android.app.backup.FullBackup;
import android.app.backup.IBackupManagerMonitor;
@@ -800,11 +801,16 @@ public class FullRestoreEngine extends RestoreEngine {
    }

    private boolean isRestorableFile(FileMetadata info) {
        if (mBackupEligibilityRules.getBackupDestination()
                == BackupAnnotations.BackupDestination.DEVICE_TRANSFER) {
        if (mBackupEligibilityRules.getBackupDestination() == BackupDestination.DEVICE_TRANSFER) {
            // Everything is eligible for device-to-device migration.
            return true;
        } else if (Flags.enableCrossPlatformTransfer()
                && mBackupEligibilityRules.getBackupDestination()
                        == BackupDestination.CROSS_PLATFORM_TRANSFER) {
            // Everything is eligible for cross platform transfers.
            return true;
        }

        if (FullBackup.CACHE_TREE_TOKEN.equals(info.domain)) {
            if (DEBUG) {
                Slog.i(TAG, "Dropping cache file path " + info.path);
+40 −8
Original line number Diff line number Diff line
@@ -18,17 +18,20 @@ package com.android.server.backup.restore;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;

import android.app.backup.BackupAgent;
import android.app.backup.BackupAnnotations.BackupDestination;
import android.app.backup.RestoreSet;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.os.UserManager;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.platform.test.flag.junit.SetFlagsRule;

@@ -57,8 +60,8 @@ public class ActiveRestoreSessionTest {
    private ApplicationInfo mTestApp;

    @Mock private UserBackupManagerService mBackupManagerService;
    @Mock private BackupEligibilityRules mBackupEligibilityRules;
    @Mock private Context mContext;
    @Mock private PackageManager mPackageManager;
    @Mock private PackageManagerInternal mPackageManagerInternal;
    @Mock private TransportManager mTransportManager;
    @Mock private UserManager mUserManager;
@@ -76,11 +79,18 @@ public class ActiveRestoreSessionTest {
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(/* testClass */ this);
        when(mBackupEligibilityRules.isAppEligibleForRestore(any())).thenReturn(true);
        when(mBackupManagerService.getEligibilityRulesForOperation(anyInt()))
                .thenReturn(mBackupEligibilityRules);
        when(mBackupManagerService.getTransportManager()).thenReturn(mTransportManager);
        when(mBackupManagerService.getContext()).thenReturn(mContext);
        when(mBackupManagerService.getEligibilityRulesForOperation(anyInt()))
                .thenAnswer(
                        invocation -> {
                            return new BackupEligibilityRules(
                                    mPackageManager,
                                    mPackageManagerInternal,
                                    0,
                                    mContext,
                                    invocation.getArgument(0));
                        });
        when(mContext.getSystemService(eq(UserManager.class))).thenReturn(mUserManager);
        when(LocalServices.getService(PackageManagerInternal.class))
                .thenReturn(mPackageManagerInternal);
@@ -90,14 +100,19 @@ public class ActiveRestoreSessionTest {
                        mBackupManagerService,
                        /* packageName */ null,
                        /* transportName */ "",
                        mBackupEligibilityRules);
                        new BackupEligibilityRules(
                                mPackageManager,
                                mPackageManagerInternal,
                                0,
                                mContext,
                                BackupDestination.CLOUD));
        mTestApp = new ApplicationInfo();
        mTestApp.packageName = TEST_APP_NAME;
    }

    @Test
    @EnableFlags({Flags.FLAG_ENABLE_SKIPPING_RESTORE_LAUNCHED_APPS})
    public void testGetBackupEligibilityRules_skipRestoreFlagOn_skipsLaunchedAppRestore() {
        mFlagsRule.enableFlags(Flags.FLAG_ENABLE_SKIPPING_RESTORE_LAUNCHED_APPS);
        RestoreSet restoreSet =
                new RestoreSet(
                        /* name */ null,
@@ -114,8 +129,8 @@ public class ActiveRestoreSessionTest {
    }

    @Test
    @DisableFlags({Flags.FLAG_ENABLE_SKIPPING_RESTORE_LAUNCHED_APPS})
    public void testGetBackupEligibilityRules_skipRestoreFlagOff_allowsAppRestore() {
        mFlagsRule.disableFlags(Flags.FLAG_ENABLE_SKIPPING_RESTORE_LAUNCHED_APPS);
        RestoreSet restoreSet =
                new RestoreSet(
                        /* name */ null,
@@ -130,4 +145,21 @@ public class ActiveRestoreSessionTest {

        assertThat(eligibilityRules.isAppEligibleForRestore(mTestApp)).isTrue();
    }

    @Test
    @EnableFlags({Flags.FLAG_ENABLE_CROSS_PLATFORM_TRANSFER})
    public void testGetBackupEligibilityRules_crossPlatformTransfer_hasCorrectDestination() {
        RestoreSet restoreSet =
                new RestoreSet(
                        /* name= */ null,
                        /* device= */ "D2D",
                        /* token= */ 1,
                        BackupAgent.FLAG_CROSS_PLATFORM_DATA_TRANSFER_IOS);

        BackupEligibilityRules eligibilityRules =
                mRestoreSession.getBackupEligibilityRules(restoreSet);

        assertThat(eligibilityRules.getBackupDestination())
                .isEqualTo(BackupDestination.CROSS_PLATFORM_TRANSFER);
    }
}