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

Commit 05b5c6f2 authored by Al Sutton's avatar Al Sutton
Browse files

Fix issue where lock wallpaper settings was not being remembered.

If there was a lock wallpaper, and the user then sets the lock
screen to the same as the system wallpaper, the "-1" value for the
lock wallpaper ID (which represents 'use the same as the system
wallpaper') was not remembered. This caused a backup per-day to be
made for the wallpaper.

Fixes: 140995339
Test: atest WallpaperBackupAgentTests
Change-Id: Ia171d21e8c12755bdae418a52ca854a4bca3a695
parent 2a095b1f
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -153,6 +153,7 @@ public class WallpaperBackupAgent extends BackupAgent {
                Slog.v(TAG, "lockGen=" + lockGeneration + " : lockChanged=" + lockChanged);
                Slog.v(TAG, "sysEligble=" + sysEligible);
                Slog.v(TAG, "lockEligible=" + lockEligible);
                Slog.v(TAG, "hasLockWallpaper=" + hasLockWallpaper);
            }

            // only back up the wallpapers if we've been told they're eligible
@@ -174,6 +175,17 @@ public class WallpaperBackupAgent extends BackupAgent {
                prefs.edit().putInt(SYSTEM_GENERATION, sysGeneration).apply();
            }

            // If there's no lock wallpaper, then we have nothing to add to the backup.
            if (lockGeneration == -1) {
                if (lockChanged && lockImageStage.exists()) {
                    if (DEBUG) Slog.v(TAG, "Removed lock wallpaper; deleting");
                    lockImageStage.delete();
                }
                if (DEBUG) Slog.v(TAG, "No lock paper set, add nothing to backup");
                prefs.edit().putInt(LOCK_GENERATION, lockGeneration).apply();
                return;
            }

            // Don't try to store the lock image if we overran our quota last time
            if (lockEligible && hasLockWallpaper && mLockWallpaperFile.exists() && !mQuotaExceeded) {
                if (lockChanged || !lockImageStage.exists()) {
+77 −35
Original line number Diff line number Diff line
@@ -19,8 +19,13 @@ package com.android.wallpaperbackup.tests;
import static android.app.WallpaperManager.FLAG_LOCK;
import static android.app.WallpaperManager.FLAG_SYSTEM;

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

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@@ -40,6 +45,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

@@ -53,78 +59,109 @@ public class WallpaperBackupAgentTest {
    private static final String SYSTEM_GENERATION = "system_gen";
    private static final String LOCK_GENERATION = "lock_gen";

    private static final int TEST_SYSTEM_WALLPAPER_ID = 1;
    private static final int TEST_LOCK_WALLPAPER_ID = 2;

    @Mock private FullBackupDataOutput mOutput;
    @Mock private WallpaperManager mWallpaperManager;
    @Mock private SharedPreferences mSharedPreferences;
    @Mock private SharedPreferences.Editor mSharedPreferenceEditor;

    @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder();

    private ContextWithServiceOverrides mContext;
    private IsolatedWallpaperBackupAgent mWallpaperBackupAgent;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);

        when(mSharedPreferences.edit()).thenReturn(mSharedPreferenceEditor);
        when(mSharedPreferenceEditor.putInt(anyString(), anyInt()))
                .thenReturn(mSharedPreferenceEditor);
        doNothing().when(mSharedPreferenceEditor).apply();

        mContext = new ContextWithServiceOverrides(ApplicationProvider.getApplicationContext());
        mContext.injectSystemService(WallpaperManager.class, mWallpaperManager);
        mContext.setSharedPreferencesOverride(mSharedPreferences);

        mWallpaperBackupAgent = new IsolatedWallpaperBackupAgent(mTemporaryFolder.getRoot());
        mWallpaperBackupAgent.attach(mContext);
        mWallpaperBackupAgent.onCreate();
    }

    @Test
    public void testOnFullBackup_withNoChanges_onlyBacksUpEmptyFile() throws IOException {
        WallpaperBackupAgent wallpaperBackupAgent = new WallpaperBackupAgent();
        initialiseAgent(wallpaperBackupAgent);

        when(mWallpaperManager.getWallpaperIdForUser(eq(FLAG_SYSTEM), eq(UserHandle.USER_SYSTEM)))
                .thenReturn(1);
        when(mWallpaperManager.getWallpaperIdForUser(eq(FLAG_LOCK), eq(UserHandle.USER_SYSTEM)))
                .thenReturn(1);
        when(mSharedPreferences.getInt(eq(SYSTEM_GENERATION), eq(-1))).thenReturn(1);
        when(mSharedPreferences.getInt(eq(LOCK_GENERATION), eq(-1))).thenReturn(1);
        mockBackedUpState();
        mockCurrentWallpapers(TEST_SYSTEM_WALLPAPER_ID, TEST_LOCK_WALLPAPER_ID);

        wallpaperBackupAgent.onFullBackup(mOutput);
        mWallpaperBackupAgent.onFullBackup(mOutput);

        verify(mOutput); // Backup of empty file only
        assertThat(mWallpaperBackupAgent.mBackedUpFiles.size()).isEqualTo(1);
        assertThat(mWallpaperBackupAgent.mBackedUpFiles.get(0).getName()).isEqualTo("empty");
    }

    @Test
    public void testOnFullBackup_withOnlyChangedSystem_updatesTheSharedPreferences()
            throws IOException {
        // Create a system wallpaper file
        mTemporaryFolder.newFile("wallpaper_orig");
        // Create stageing file to simulate he wallpaper being ready to back up
        new File(mContext.getFilesDir(), "wallpaper-stage").createNewFile();
        mockSystemWallpaperReadyToBackUp();
        mockUnbackedUpState();
        mockCurrentWallpapers(TEST_SYSTEM_WALLPAPER_ID, TEST_LOCK_WALLPAPER_ID);

        WallpaperBackupAgent wallpaperBackupAgent =
                new IsolatedWallpaperBackupAgent(mTemporaryFolder.getRoot());
        initialiseAgent(wallpaperBackupAgent);
        mWallpaperBackupAgent.onFullBackup(mOutput);

        SharedPreferences.Editor preferenceEditor = mock(SharedPreferences.Editor.class);
        verify(mSharedPreferenceEditor).putInt(eq(SYSTEM_GENERATION), eq(TEST_SYSTEM_WALLPAPER_ID));
    }

    @Test
    public void testOnFullBackup_withLockChangedToMatchSystem_updatesTheSharedPreferences()
            throws IOException {
        mockBackedUpState();
        mockSystemWallpaperReadyToBackUp();
        mockCurrentWallpapers(TEST_SYSTEM_WALLPAPER_ID, -1);

        mWallpaperBackupAgent.onFullBackup(mOutput);

        InOrder inOrder = inOrder(mSharedPreferenceEditor);
        inOrder.verify(mSharedPreferenceEditor)
                .putInt(eq(SYSTEM_GENERATION), eq(TEST_SYSTEM_WALLPAPER_ID));
        inOrder.verify(mSharedPreferenceEditor).apply();
        inOrder.verify(mSharedPreferenceEditor).putInt(eq(LOCK_GENERATION), eq(-1));
        inOrder.verify(mSharedPreferenceEditor).apply();
    }

    private void mockUnbackedUpState() {
        mockCurrentWallpapers(TEST_SYSTEM_WALLPAPER_ID, TEST_LOCK_WALLPAPER_ID);
        when(mSharedPreferences.getInt(eq(SYSTEM_GENERATION), eq(-1))).thenReturn(-1);
        when(mSharedPreferences.getInt(eq(LOCK_GENERATION), eq(-1))).thenReturn(-1);
    }

    private void mockBackedUpState() {
        when(mSharedPreferences.getInt(eq(SYSTEM_GENERATION), eq(-1)))
                .thenReturn(TEST_SYSTEM_WALLPAPER_ID);
        when(mSharedPreferences.getInt(eq(LOCK_GENERATION), eq(-1)))
                .thenReturn(TEST_LOCK_WALLPAPER_ID);
    }

    private void mockCurrentWallpapers(int systemWallpaperId, int lockWallpaperId) {
        when(mWallpaperManager.getWallpaperIdForUser(eq(FLAG_SYSTEM), eq(UserHandle.USER_SYSTEM)))
                .thenReturn(2);
                .thenReturn(systemWallpaperId);
        when(mWallpaperManager.getWallpaperIdForUser(eq(FLAG_LOCK), eq(UserHandle.USER_SYSTEM)))
                .thenReturn(1);
                .thenReturn(lockWallpaperId);
        when(mWallpaperManager.isWallpaperBackupEligible(eq(FLAG_SYSTEM))).thenReturn(true);
        when(mWallpaperManager.isWallpaperBackupEligible(eq(FLAG_LOCK))).thenReturn(true);
        when(mSharedPreferences.getInt(eq(SYSTEM_GENERATION), eq(-1))).thenReturn(1);
        when(mSharedPreferences.getInt(eq(LOCK_GENERATION), eq(-1))).thenReturn(1);
        when(mSharedPreferences.edit()).thenReturn(preferenceEditor);
        when(preferenceEditor.putInt(eq(SYSTEM_GENERATION), eq(2))).thenReturn(preferenceEditor);

        wallpaperBackupAgent.onFullBackup(mOutput);

        verify(preferenceEditor).putInt(eq(SYSTEM_GENERATION), eq(2));
    }

    private void initialiseAgent(WallpaperBackupAgent agent) {
        agent.attach(mContext);
        agent.onCreate();
    private void mockSystemWallpaperReadyToBackUp() throws IOException {
        // Create a system wallpaper file
        mTemporaryFolder.newFile("wallpaper_orig");
        // Create staging file to simulate he wallpaper being ready to back up
        new File(mContext.getFilesDir(), "wallpaper-stage").createNewFile();
    }

    private static class IsolatedWallpaperBackupAgent extends WallpaperBackupAgent {
    private class IsolatedWallpaperBackupAgent extends WallpaperBackupAgent {
        File mWallpaperBaseDirectory;
        List<File> mBackedUpFiles = new ArrayList();
        List<File> mBackedUpFiles = new ArrayList<>();

        IsolatedWallpaperBackupAgent(File wallpaperBaseDirectory) {
            mWallpaperBaseDirectory = wallpaperBaseDirectory;
@@ -139,5 +176,10 @@ public class WallpaperBackupAgentTest {
        protected void backupFile(File file, FullBackupDataOutput data) {
            mBackedUpFiles.add(file);
        }

        @Override
        public SharedPreferences getSharedPreferences(File file, int mode) {
            return mSharedPreferences;
        }
    }
}