Merge "Add delayed restore logging to WallpaperBackupAgent" into udc-dev

This commit is contained in:
Niamh Walsh
2023-05-10 16:09:02 +00:00
committed by Android (Google) Code Review
3 changed files with 122 additions and 3 deletions

View File

@@ -111,6 +111,7 @@ public class WallpaperBackupAgent extends BackupAgent {
private WallpaperManager mWallpaperManager; private WallpaperManager mWallpaperManager;
private WallpaperEventLogger mEventLogger; private WallpaperEventLogger mEventLogger;
private BackupManager mBackupManager;
private boolean mSystemHasLiveComponent; private boolean mSystemHasLiveComponent;
private boolean mLockHasLiveComponent; private boolean mLockHasLiveComponent;
@@ -129,8 +130,8 @@ public class WallpaperBackupAgent extends BackupAgent {
Slog.v(TAG, "quota file " + mQuotaFile.getPath() + " exists=" + mQuotaExceeded); Slog.v(TAG, "quota file " + mQuotaFile.getPath() + " exists=" + mQuotaExceeded);
} }
BackupManager backupManager = new BackupManager(getApplicationContext()); mBackupManager = new BackupManager(getBaseContext());
mEventLogger = new WallpaperEventLogger(backupManager, /* wallpaperAgent */ this); mEventLogger = new WallpaperEventLogger(mBackupManager, /* wallpaperAgent */ this);
} }
@Override @Override
@@ -564,21 +565,44 @@ public class WallpaperBackupAgent extends BackupAgent {
if (!isDeviceInRestore()) { if (!isDeviceInRestore()) {
// We don't want to reapply the wallpaper outside a restore. // We don't want to reapply the wallpaper outside a restore.
unregister(); 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; return;
} }
if (componentName.getPackageName().equals(packageName)) { if (componentName.getPackageName().equals(packageName)) {
Slog.d(TAG, "Applying component " + componentName); 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) { if (applyToLock) {
try { try {
mWallpaperManager.clear(FLAG_LOCK); mWallpaperManager.clear(FLAG_LOCK);
logger.onLockLiveWallpaperRestored(componentName);
} catch (IOException e) { } catch (IOException e) {
Slog.w(TAG, "Failed to apply live wallpaper to lock screen: " + 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. // We're only expecting to restore the wallpaper component once.
unregister(); unregister();
mBackupManager.reportDelayedRestoreResult(logger.getBackupRestoreLogger());
} }
} }
}; };
@@ -599,4 +623,9 @@ public class WallpaperBackupAgent extends BackupAgent {
return false; return false;
} }
} }
@VisibleForTesting
void setBackupManagerForTesting(BackupManager backupManager) {
mBackupManager = backupManager;
}
} }

View File

@@ -61,6 +61,10 @@ public class WallpaperEventLogger {
static final String ERROR_NO_WALLPAPER = "no_wallpaper"; static final String ERROR_NO_WALLPAPER = "no_wallpaper";
@BackupRestoreError @BackupRestoreError
static final String ERROR_QUOTA_EXCEEDED = "quota_exceeded"; 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; private final BackupRestoreEventLogger mLogger;
@@ -70,6 +74,14 @@ public class WallpaperEventLogger {
mLogger = backupManager.getBackupRestoreEventLogger(/* backupAgent */ wallpaperAgent); mLogger = backupManager.getBackupRestoreEventLogger(/* backupAgent */ wallpaperAgent);
} }
WallpaperEventLogger(BackupRestoreEventLogger logger) {
mLogger = logger;
}
BackupRestoreEventLogger getBackupRestoreLogger() {
return mLogger;
}
void onSystemImageWallpaperBackedUp() { void onSystemImageWallpaperBackedUp() {
logBackupSuccessInternal(WALLPAPER_IMG_SYSTEM, /* liveComponentWallpaperInfo */ null); logBackupSuccessInternal(WALLPAPER_IMG_SYSTEM, /* liveComponentWallpaperInfo */ null);
} }

View File

@@ -47,6 +47,8 @@ import static org.mockito.Mockito.when;
import android.app.WallpaperInfo; import android.app.WallpaperInfo;
import android.app.WallpaperManager; import android.app.WallpaperManager;
import android.app.backup.BackupAnnotations; 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.BackupRestoreEventLogger.DataTypeResult;
import android.app.backup.FullBackupDataOutput; import android.app.backup.FullBackupDataOutput;
import android.content.ComponentName; import android.content.ComponentName;
@@ -101,6 +103,8 @@ public class WallpaperBackupAgentTest {
private WallpaperManager mWallpaperManager; private WallpaperManager mWallpaperManager;
@Mock @Mock
private Context mMockContext; private Context mMockContext;
@Mock
private BackupManager mBackupManager;
@Rule @Rule
public TemporaryFolder mTemporaryFolder = new TemporaryFolder(); public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
@@ -714,6 +718,80 @@ public class WallpaperBackupAgentTest {
assertThat(lock.getErrors()).containsKey(RuntimeException.class.getName()); 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) { private void mockCurrentWallpaperIds(int systemWallpaperId, int lockWallpaperId) {
when(mWallpaperManager.getWallpaperId(eq(FLAG_SYSTEM))).thenReturn(systemWallpaperId); when(mWallpaperManager.getWallpaperId(eq(FLAG_SYSTEM))).thenReturn(systemWallpaperId);
when(mWallpaperManager.getWallpaperId(eq(FLAG_LOCK))).thenReturn(lockWallpaperId); when(mWallpaperManager.getWallpaperId(eq(FLAG_LOCK))).thenReturn(lockWallpaperId);