WallpaperBackupHelper.java revision 9f22443b4e3ac1ca1763a25a186177809ec1c3cb
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app.backup; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1907fe63e5de3cbc36a213178faede137cf648170aDan Sandlerimport android.app.WallpaperManager; 2007fe63e5de3cbc36a213178faede137cf648170aDan Sandlerimport android.content.Context; 21add70268b193cd83e4ea2b35fabca2d4f5808828John Reckimport android.os.Environment; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor; 23c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.os.UserHandle; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Slog; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackbornimport java.io.File; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 28c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport java.io.IOException; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 3137d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * We no longer back up wallpapers with this helper, but we do need to process restores 3237d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * of legacy backup payloads. We just take the restored image as-is and apply it as the 3337d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * system wallpaper using the public "set the wallpaper" API. 3437d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * 3537d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * @hide 3637d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle */ 3775951d7c86242f150e5d17ac745458996e97cc72Kevin Hufnaglepublic class WallpaperBackupHelper extends FileBackupHelperBase implements BackupHelper { 3837d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle private static final String TAG = "WallpaperBackupHelper"; 3937d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle private static final boolean DEBUG = false; 4037d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle 4137d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle // Key that legacy wallpaper imagery was stored under 427025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn public static final String WALLPAPER_IMAGE_KEY = 4337d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle "/data/data/com.android.settings/files/wallpaper"; 4437d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle public static final String WALLPAPER_INFO_KEY = "/data/system/wallpaper_info.xml"; 4537d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Stage file that the restored imagery is stored to prior to being applied 47c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn // as the system wallpaper. 48c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn private static final String STAGE_FILE = 49c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn new File(Environment.getUserSystemDirectory(UserHandle.USER_SYSTEM), 50c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn "wallpaper-tmp").getAbsolutePath(); 51c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn 52f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn private final String[] mKeys; 53c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn private final WallpaperManager mWpm; 545fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn /** 56c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn * Legacy wallpaper restores, from back when the imagery was stored under the 57c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn * "android" system package as file key/value entities. 58c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn * 59c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn * @param context 60c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn * @param files 61c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn */ 62c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn public WallpaperBackupHelper(Context context, String[] keys) { 63c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn super(context); 64c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn 65c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn mContext = context; 66c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn mKeys = keys; 67f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn 68f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn mWpm = (WallpaperManager) context.getSystemService(Context.WALLPAPER_SERVICE); 69f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn } 70f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn 71f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn /** 72f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn * Based on oldState, determine which of the files from the application's data directory 73f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn * need to be backed up, write them to the data stream, and fill in newState with the 74f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn * state as it exists now. 75f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn */ 76f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn @Override 77f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data, 78f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn ParcelFileDescriptor newState) { 79f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn // Intentionally no-op; we don't back up the wallpaper this way any more. 80f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn } 81f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Restore one absolute file entity from the restore stream. If we're restoring the 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * magic wallpaper file, apply it as the system wallpaper. 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 878e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk public void restoreEntity(BackupDataInputStream data) { 888e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk final String key = data.getKey(); 8975951d7c86242f150e5d17ac745458996e97cc72Kevin Hufnagle if (isKeyInList(key, mKeys)) { 908e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk if (key.equals(WALLPAPER_IMAGE_KEY)) { 918e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk // restore the file to the stage for inspection 928e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk File stage = new File(STAGE_FILE); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (writeFile(stage, data)) { 95add70268b193cd83e4ea2b35fabca2d4f5808828John Reck try (FileInputStream in = new FileInputStream(stage)) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWpm.setStream(in); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Slog.e(TAG, "Unable to set restored wallpaper: " + e.getMessage()); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1007025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn } else { 1017025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn Slog.e(TAG, "Unable to save restored wallpaper"); 1027025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn } 1037025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn } finally { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stage.delete(); 105add70268b193cd83e4ea2b35fabca2d4f5808828John Reck } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 108c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn } 109add70268b193cd83e4ea2b35fabca2d4f5808828John Reck} 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project