SystemBackupAgentpublic class SystemBackupAgent extends android.app.backup.BackupAgentHelper Backup agent for various system-managed data, currently just the system wallpaper |
Fields Summary |
---|
private static final String | TAG | private static final String | WALLPAPER_IMAGE_FILENAME | private static final String | WALLPAPER_INFO_FILENAME | private static final String | WALLPAPER_IMAGE_DIR | private static final String | WALLPAPER_IMAGE | private static final String | WALLPAPER_INFO_DIR | private static final String | WALLPAPER_INFO | private static final String | WALLPAPER_IMAGE_KEY | private static final String | WALLPAPER_INFO_KEY |
Methods Summary |
---|
private void | fullWallpaperBackup(android.app.backup.FullBackupDataOutput output)
// Back up the data files directly. We do them in this specific order --
// info file followed by image -- because then we need take no special
// steps during restore; the restore will happen properly when the individual
// files are restored piecemeal.
FullBackup.backupToTar(getPackageName(), FullBackup.ROOT_TREE_TOKEN, null,
WALLPAPER_INFO_DIR, WALLPAPER_INFO, output.getData());
FullBackup.backupToTar(getPackageName(), FullBackup.ROOT_TREE_TOKEN, null,
WALLPAPER_IMAGE_DIR, WALLPAPER_IMAGE, output.getData());
| public void | onBackup(android.os.ParcelFileDescriptor oldState, android.app.backup.BackupDataOutput data, android.os.ParcelFileDescriptor newState)
// We only back up the data under the current "wallpaper" schema with metadata
IWallpaperManager wallpaper = (IWallpaperManager)ServiceManager.getService(
Context.WALLPAPER_SERVICE);
String[] files = new String[] { WALLPAPER_IMAGE, WALLPAPER_INFO };
String[] keys = new String[] { WALLPAPER_IMAGE_KEY, WALLPAPER_INFO_KEY };
if (wallpaper != null) {
try {
final String wallpaperName = wallpaper.getName();
if (wallpaperName != null && wallpaperName.length() > 0) {
// When the wallpaper has a name, back up the info by itself.
// TODO: Don't rely on the innards of the service object like this!
// TODO: Send a delete for any stored wallpaper image in this case?
files = new String[] { WALLPAPER_INFO };
keys = new String[] { WALLPAPER_INFO_KEY };
}
} catch (RemoteException re) {
Slog.e(TAG, "Couldn't get wallpaper name\n" + re);
}
}
addHelper("wallpaper", new WallpaperBackupHelper(SystemBackupAgent.this, files, keys));
addHelper("recents", new RecentsBackupHelper(SystemBackupAgent.this));
super.onBackup(oldState, data, newState);
| public void | onFullBackup(android.app.backup.FullBackupDataOutput data)
// At present we back up only the wallpaper
fullWallpaperBackup(data);
| public void | onRestore(android.app.backup.BackupDataInput data, int appVersionCode, android.os.ParcelFileDescriptor newState)
// On restore, we also support a previous data schema "system_files"
addHelper("wallpaper", new WallpaperBackupHelper(SystemBackupAgent.this,
new String[] { WALLPAPER_IMAGE, WALLPAPER_INFO },
new String[] { WALLPAPER_IMAGE_KEY, WALLPAPER_INFO_KEY} ));
addHelper("system_files", new WallpaperBackupHelper(SystemBackupAgent.this,
new String[] { WALLPAPER_IMAGE },
new String[] { WALLPAPER_IMAGE_KEY} ));
addHelper("recents", new RecentsBackupHelper(SystemBackupAgent.this));
try {
super.onRestore(data, appVersionCode, newState);
IWallpaperManager wallpaper = (IWallpaperManager) ServiceManager.getService(
Context.WALLPAPER_SERVICE);
if (wallpaper != null) {
try {
wallpaper.settingsRestored();
} catch (RemoteException re) {
Slog.e(TAG, "Couldn't restore settings\n" + re);
}
}
} catch (IOException ex) {
// If there was a failure, delete everything for the wallpaper, this is too aggressive,
// but this is hopefully a rare failure.
Slog.d(TAG, "restore failed", ex);
(new File(WALLPAPER_IMAGE)).delete();
(new File(WALLPAPER_INFO)).delete();
}
| public void | onRestoreFile(android.os.ParcelFileDescriptor data, long size, int type, java.lang.String domain, java.lang.String path, long mode, long mtime)
Slog.i(TAG, "Restoring file domain=" + domain + " path=" + path);
// Bits to indicate postprocessing we may need to perform
boolean restoredWallpaper = false;
File outFile = null;
// Various domain+files we understand a priori
if (domain.equals(FullBackup.ROOT_TREE_TOKEN)) {
if (path.equals(WALLPAPER_INFO_FILENAME)) {
outFile = new File(WALLPAPER_INFO);
restoredWallpaper = true;
} else if (path.equals(WALLPAPER_IMAGE_FILENAME)) {
outFile = new File(WALLPAPER_IMAGE);
restoredWallpaper = true;
}
}
try {
if (outFile == null) {
Slog.w(TAG, "Skipping unrecognized system file: [ " + domain + " : " + path + " ]");
}
FullBackup.restoreFile(data, size, type, mode, mtime, outFile);
if (restoredWallpaper) {
IWallpaperManager wallpaper =
(IWallpaperManager)ServiceManager.getService(
Context.WALLPAPER_SERVICE);
if (wallpaper != null) {
try {
wallpaper.settingsRestored();
} catch (RemoteException re) {
Slog.e(TAG, "Couldn't restore settings\n" + re);
}
}
}
} catch (IOException e) {
if (restoredWallpaper) {
// Make sure we wind up in a good state
(new File(WALLPAPER_IMAGE)).delete();
(new File(WALLPAPER_INFO)).delete();
}
}
| public void | onRestoreFinished()
try {
ActivityManagerNative.getDefault().systemBackupRestored();
} catch (RemoteException e) {
// Not possible since this code is running in the system process.
}
|
|