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