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

Commit 0ee08f16 authored by Joël Stemmer's avatar Joël Stemmer
Browse files

Determine backup destination from RestoreSet transport flags on restore

The correct backup destination needs to be set to ensure the correct
include/exclude rules are applied during restore.

Also make sure to set the transport flags in the LocalTransport when the
cross-platform transfer parameter is enabled.

Flag: com.android.server.backup.enable_cross_platform_transfer
Bug: 432673356
Test: atest ActiveRestoreSessionTest
Test: manual testing

Change-Id: I16424a422f9aa31d85507abf929487d08970da10
parent 28b6de63
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);
    }
}