WallpaperBackupHelperpublic class WallpaperBackupHelper extends FileBackupHelperBase implements BackupHelperHelper for backing up / restoring wallpapers. Basically an AbsoluteFileBackupHelper,
but with logic for deciding what to do with restored wallpaper images. |
Fields Summary |
---|
private static final String | TAG | private static final boolean | DEBUG | private static final boolean | REJECT_OUTSIZED_RESTORE | private static final double | MAX_HEIGHT_RATIO | private static final double | MIN_HEIGHT_RATIO | public static final String | WALLPAPER_IMAGE | public static final String | WALLPAPER_INFO | public static final String | WALLPAPER_IMAGE_KEY | public static final String | WALLPAPER_INFO_KEY | private static final String | STAGE_FILE | android.content.Context | mContext | String[] | mFiles | String[] | mKeys | double | mDesiredMinWidth | double | mDesiredMinHeight |
Constructors Summary |
---|
public WallpaperBackupHelper(android.content.Context context, String[] files, String[] keys)Construct a helper for backing up / restoring the files at the given absolute locations
within the file system.
super(context);
mContext = context;
mFiles = files;
mKeys = keys;
final WindowManager wm =
(WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
final WallpaperManager wpm =
(WallpaperManager) context.getSystemService(Context.WALLPAPER_SERVICE);
final Display d = wm.getDefaultDisplay();
final Point size = new Point();
d.getSize(size);
mDesiredMinWidth = Math.min(size.x, size.y);
mDesiredMinHeight = (double) wpm.getDesiredMinimumHeight();
if (mDesiredMinHeight <= 0) {
mDesiredMinHeight = size.y;
}
if (DEBUG) {
Slog.d(TAG, "dmW=" + mDesiredMinWidth + " dmH=" + mDesiredMinHeight);
}
|
Methods Summary |
---|
public void | performBackup(android.os.ParcelFileDescriptor oldState, BackupDataOutput data, android.os.ParcelFileDescriptor newState)Based on oldState, determine which of the files from the application's data directory
need to be backed up, write them to the data stream, and fill in newState with the
state as it exists now.
performBackup_checked(oldState, data, newState, mFiles, mKeys);
| public void | restoreEntity(BackupDataInputStream data)Restore one absolute file entity from the restore stream. If we're restoring the
magic wallpaper file, take specific action to determine whether it is suitable for
the current device.
final String key = data.getKey();
if (isKeyInList(key, mKeys)) {
if (key.equals(WALLPAPER_IMAGE_KEY)) {
// restore the file to the stage for inspection
File f = new File(STAGE_FILE);
if (writeFile(f, data)) {
// Preflight the restored image's dimensions without loading it
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(STAGE_FILE, options);
if (DEBUG) Slog.d(TAG, "Restoring wallpaper image w=" + options.outWidth
+ " h=" + options.outHeight);
if (REJECT_OUTSIZED_RESTORE) {
// We accept any wallpaper that is at least as wide as our preference
// (i.e. wide enough to fill the screen), and is within a comfortable
// factor of the target height, to avoid significant clipping/scaling/
// letterboxing. At this point we know that mDesiredMinWidth is the
// smallest dimension, regardless of current orientation, so we can
// safely require that the candidate's width and height both exceed
// that hard minimum.
final double heightRatio = mDesiredMinHeight / options.outHeight;
if (options.outWidth < mDesiredMinWidth
|| options.outHeight < mDesiredMinWidth
|| heightRatio >= MAX_HEIGHT_RATIO
|| heightRatio <= MIN_HEIGHT_RATIO) {
// Not wide enough for the screen, or too short/tall to be a good fit
// for the height of the screen, broken image file, or the system's
// desires for wallpaper size are in a bad state. Probably one of the
// first two.
Slog.i(TAG, "Restored image dimensions (w="
+ options.outWidth + ", h=" + options.outHeight
+ ") too far off target (tw="
+ mDesiredMinWidth + ", th=" + mDesiredMinHeight
+ "); falling back to default wallpaper.");
f.delete();
return;
}
}
// We passed the acceptable-dimensions test (if any), so we're going to
// use the restored image.
// TODO: spin a service to copy the restored image to sd/usb storage,
// since it does not exist anywhere other than the private wallpaper
// file.
Slog.d(TAG, "Applying restored wallpaper image.");
f.renameTo(new File(WALLPAPER_IMAGE));
}
} else if (key.equals(WALLPAPER_INFO_KEY)) {
// XML file containing wallpaper info
File f = new File(WALLPAPER_INFO);
writeFile(f, data);
}
}
|
|