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

Commit 3a2a01e8 authored by Niamh Walsh's avatar Niamh Walsh
Browse files

Add delayed restore logging to WallpaperBackupAgent

Bug: 268471749
Test: atest WallpaperBackupAgentTest WallpaperEventLoggerTest WallpaperBackupAgentTest and manual (http://go/paste/4594573572571136)
Change-Id: Icf01c4eaa87251fae79719e2e143c1242cac56f0
parent ac8d23d9
Loading
Loading
Loading
Loading
+32 −3
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@ public class WallpaperBackupAgent extends BackupAgent {

    private WallpaperManager mWallpaperManager;
    private WallpaperEventLogger mEventLogger;
    private BackupManager mBackupManager;

    private boolean mSystemHasLiveComponent;
    private boolean mLockHasLiveComponent;
@@ -129,8 +130,8 @@ public class WallpaperBackupAgent extends BackupAgent {
            Slog.v(TAG, "quota file " + mQuotaFile.getPath() + " exists=" + mQuotaExceeded);
        }

        BackupManager backupManager = new BackupManager(getApplicationContext());
        mEventLogger = new WallpaperEventLogger(backupManager, /* wallpaperAgent */ this);
        mBackupManager = new BackupManager(getBaseContext());
        mEventLogger = new WallpaperEventLogger(mBackupManager, /* wallpaperAgent */ this);
    }

    @Override
@@ -564,21 +565,44 @@ public class WallpaperBackupAgent extends BackupAgent {
                if (!isDeviceInRestore()) {
                    // We don't want to reapply the wallpaper outside a restore.
                    unregister();

                    // We have finished restore and not succeeded, so let's log that as an error.
                    WallpaperEventLogger logger = new WallpaperEventLogger(
                            mBackupManager.getDelayedRestoreLogger());
                    logger.onSystemLiveWallpaperRestoreFailed(
                            WallpaperEventLogger.ERROR_LIVE_PACKAGE_NOT_INSTALLED);
                    if (applyToLock) {
                        logger.onLockLiveWallpaperRestoreFailed(
                                WallpaperEventLogger.ERROR_LIVE_PACKAGE_NOT_INSTALLED);
                    }
                    mBackupManager.reportDelayedRestoreResult(logger.getBackupRestoreLogger());

                    return;
                }

                if (componentName.getPackageName().equals(packageName)) {
                    Slog.d(TAG, "Applying component " + componentName);
                    mWallpaperManager.setWallpaperComponent(componentName);
                    boolean sysResult = mWallpaperManager.setWallpaperComponent(componentName);
                    WallpaperEventLogger logger = new WallpaperEventLogger(
                            mBackupManager.getDelayedRestoreLogger());
                    if (sysResult) {
                        logger.onSystemLiveWallpaperRestored(componentName);
                    } else {
                        logger.onSystemLiveWallpaperRestoreFailed(
                                WallpaperEventLogger.ERROR_SET_COMPONENT_EXCEPTION);
                    }
                    if (applyToLock) {
                        try {
                            mWallpaperManager.clear(FLAG_LOCK);
                            logger.onLockLiveWallpaperRestored(componentName);
                        } catch (IOException e) {
                            Slog.w(TAG, "Failed to apply live wallpaper to lock screen: " + e);
                            logger.onLockLiveWallpaperRestoreFailed(e.getClass().getName());
                        }
                    }
                    // We're only expecting to restore the wallpaper component once.
                    unregister();
                    mBackupManager.reportDelayedRestoreResult(logger.getBackupRestoreLogger());
                }
            }
        };
@@ -599,4 +623,9 @@ public class WallpaperBackupAgent extends BackupAgent {
            return false;
        }
    }

    @VisibleForTesting
    void setBackupManagerForTesting(BackupManager backupManager) {
        mBackupManager = backupManager;
    }
}
 No newline at end of file
+12 −0
Original line number Diff line number Diff line
@@ -61,6 +61,10 @@ public class WallpaperEventLogger {
    static final String ERROR_NO_WALLPAPER = "no_wallpaper";
    @BackupRestoreError
    static final String ERROR_QUOTA_EXCEEDED = "quota_exceeded";
    @BackupRestoreError
    static final String ERROR_SET_COMPONENT_EXCEPTION = "exception_in_set_component";
    @BackupRestoreError
    static final String ERROR_LIVE_PACKAGE_NOT_INSTALLED = "live_pkg_not_installed_in_restore";

    private final BackupRestoreEventLogger mLogger;

@@ -70,6 +74,14 @@ public class WallpaperEventLogger {
        mLogger = backupManager.getBackupRestoreEventLogger(/* backupAgent */ wallpaperAgent);
    }

    WallpaperEventLogger(BackupRestoreEventLogger logger) {
        mLogger = logger;
    }

    BackupRestoreEventLogger getBackupRestoreLogger() {
        return mLogger;
    }

    void onSystemImageWallpaperBackedUp() {
        logBackupSuccessInternal(WALLPAPER_IMG_SYSTEM, /* liveComponentWallpaperInfo */ null);
    }
+78 −0
Original line number Diff line number Diff line
@@ -47,6 +47,8 @@ import static org.mockito.Mockito.when;
import android.app.WallpaperInfo;
import android.app.WallpaperManager;
import android.app.backup.BackupAnnotations;
import android.app.backup.BackupManager;
import android.app.backup.BackupRestoreEventLogger;
import android.app.backup.BackupRestoreEventLogger.DataTypeResult;
import android.app.backup.FullBackupDataOutput;
import android.content.ComponentName;
@@ -101,6 +103,8 @@ public class WallpaperBackupAgentTest {
    private WallpaperManager mWallpaperManager;
    @Mock
    private Context mMockContext;
    @Mock
    private BackupManager mBackupManager;

    @Rule
    public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
@@ -714,6 +718,80 @@ public class WallpaperBackupAgentTest {
        assertThat(lock.getErrors()).containsKey(RuntimeException.class.getName());
    }

    @Test
    public void testUpdateWallpaperComponent_delayedRestore_logsSuccess() throws Exception {
        mWallpaperBackupAgent.mIsDeviceInRestore = true;
        when(mWallpaperManager.setWallpaperComponent(any())).thenReturn(true);
        BackupRestoreEventLogger logger = new BackupRestoreEventLogger(
                BackupAnnotations.OperationType.RESTORE);
        when(mBackupManager.getDelayedRestoreLogger()).thenReturn(logger);
        mWallpaperBackupAgent.setBackupManagerForTesting(mBackupManager);

        mWallpaperBackupAgent.updateWallpaperComponent(mWallpaperComponent,
                /* applyToLock */ true);
        // Imitate wallpaper component installation.
        mWallpaperBackupAgent.mWallpaperPackageMonitor.onPackageAdded(TEST_WALLPAPER_PACKAGE,
                /* uid */0);

        DataTypeResult system = getLoggingResult(WALLPAPER_LIVE_SYSTEM, logger.getLoggingResults());
        DataTypeResult lock = getLoggingResult(WALLPAPER_LIVE_LOCK, logger.getLoggingResults());
        assertThat(system).isNotNull();
        assertThat(system.getSuccessCount()).isEqualTo(1);
        assertThat(lock).isNotNull();
        assertThat(lock.getSuccessCount()).isEqualTo(1);
    }


    @Test
    public void testUpdateWallpaperComponent_delayedRestoreFails_logsFailure() throws Exception {
        mWallpaperBackupAgent.mIsDeviceInRestore = true;
        when(mWallpaperManager.setWallpaperComponent(any())).thenReturn(false);
        BackupRestoreEventLogger logger = new BackupRestoreEventLogger(
                BackupAnnotations.OperationType.RESTORE);
        when(mBackupManager.getDelayedRestoreLogger()).thenReturn(logger);
        mWallpaperBackupAgent.setBackupManagerForTesting(mBackupManager);

        mWallpaperBackupAgent.updateWallpaperComponent(mWallpaperComponent,
                /* applyToLock */ true);
        // Imitate wallpaper component installation.
        mWallpaperBackupAgent.mWallpaperPackageMonitor.onPackageAdded(TEST_WALLPAPER_PACKAGE,
                /* uid */0);

        DataTypeResult system = getLoggingResult(WALLPAPER_LIVE_SYSTEM, logger.getLoggingResults());
        assertThat(system).isNotNull();
        assertThat(system.getFailCount()).isEqualTo(1);
        assertThat(system.getErrors()).containsKey(
                WallpaperEventLogger.ERROR_SET_COMPONENT_EXCEPTION);
    }

    @Test
    public void testUpdateWallpaperComponent_delayedRestore_packageNotInstalled_logsFailure()
            throws Exception {
        mWallpaperBackupAgent.mIsDeviceInRestore = false;
        BackupRestoreEventLogger logger = new BackupRestoreEventLogger(
                BackupAnnotations.OperationType.RESTORE);
        when(mBackupManager.getDelayedRestoreLogger()).thenReturn(logger);
        mWallpaperBackupAgent.setBackupManagerForTesting(mBackupManager);

        mWallpaperBackupAgent.updateWallpaperComponent(mWallpaperComponent,
                /* applyToLock */ true);

        // Imitate wallpaper component installation.
        mWallpaperBackupAgent.mWallpaperPackageMonitor.onPackageAdded(TEST_WALLPAPER_PACKAGE,
                /* uid */0);

        DataTypeResult system = getLoggingResult(WALLPAPER_LIVE_SYSTEM, logger.getLoggingResults());
        DataTypeResult lock = getLoggingResult(WALLPAPER_LIVE_LOCK, logger.getLoggingResults());
        assertThat(system).isNotNull();
        assertThat(system.getFailCount()).isEqualTo(1);
        assertThat(system.getErrors()).containsKey(
                WallpaperEventLogger.ERROR_LIVE_PACKAGE_NOT_INSTALLED);
        assertThat(lock).isNotNull();
        assertThat(lock.getFailCount()).isEqualTo(1);
        assertThat(lock.getErrors()).containsKey(
                WallpaperEventLogger.ERROR_LIVE_PACKAGE_NOT_INSTALLED);
    }

    private void mockCurrentWallpaperIds(int systemWallpaperId, int lockWallpaperId) {
        when(mWallpaperManager.getWallpaperId(eq(FLAG_SYSTEM))).thenReturn(systemWallpaperId);
        when(mWallpaperManager.getWallpaperId(eq(FLAG_LOCK))).thenReturn(lockWallpaperId);