blob: 8cf273dee8cc8eb67a1deb7c594bea6be9195942 [file] [log] [blame]
Joe Onorato9bb8fd72009-07-28 18:24:51 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server;
18
Dianne Hackborna924dc0d2011-02-17 14:22:17 -080019
Christopher Tate45281862010-03-05 15:46:30 -080020import android.app.backup.BackupDataInput;
Christopher Tate45281862010-03-05 15:46:30 -080021import android.app.backup.BackupDataOutput;
Christopher Tatecc84c692010-03-29 14:54:02 -070022import android.app.backup.BackupAgentHelper;
Christopher Tate4a627c72011-04-01 14:43:32 -070023import android.app.backup.FullBackup;
Christopher Tate2efd2db2011-07-19 16:32:49 -070024import android.app.backup.FullBackupDataOutput;
Christopher Tate3f64f8d2010-12-10 17:12:19 -080025import android.app.backup.WallpaperBackupHelper;
Joe Onorato9bb8fd72009-07-28 18:24:51 -070026import android.content.Context;
Amith Yamasani61f57372012-08-31 12:12:28 -070027import android.os.Environment;
Joe Onorato9bb8fd72009-07-28 18:24:51 -070028import android.os.ParcelFileDescriptor;
29import android.os.ServiceManager;
Amith Yamasani61f57372012-08-31 12:12:28 -070030import android.os.UserHandle;
Joe Onorato8a9b2202010-02-26 18:56:32 -080031import android.util.Slog;
Joe Onorato9bb8fd72009-07-28 18:24:51 -070032
Christopher Tate3f64f8d2010-12-10 17:12:19 -080033
Joe Onorato9bb8fd72009-07-28 18:24:51 -070034import java.io.File;
35import java.io.IOException;
36
37/**
Christopher Tate7c2bb662009-09-20 19:47:46 -070038 * Backup agent for various system-managed data, currently just the system wallpaper
Joe Onorato9bb8fd72009-07-28 18:24:51 -070039 */
Christopher Tatecc84c692010-03-29 14:54:02 -070040public class SystemBackupAgent extends BackupAgentHelper {
Joe Onorato9bb8fd72009-07-28 18:24:51 -070041 private static final String TAG = "SystemBackupAgent";
42
Christopher Tate75a99702011-05-18 16:28:19 -070043 // These paths must match what the WallpaperManagerService uses. The leaf *_FILENAME
44 // are also used in the full-backup file format, so must not change unless steps are
45 // taken to support the legacy backed-up datasets.
46 private static final String WALLPAPER_IMAGE_FILENAME = "wallpaper";
47 private static final String WALLPAPER_INFO_FILENAME = "wallpaper_info.xml";
48
Amith Yamasani37ce3a82012-02-06 12:04:42 -080049 // TODO: Will need to change if backing up non-primary user's wallpaper
Amith Yamasani61f57372012-08-31 12:12:28 -070050 private static final String WALLPAPER_IMAGE_DIR =
51 Environment.getUserSystemDirectory(UserHandle.USER_OWNER).getAbsolutePath();
Amith Yamasani37ce3a82012-02-06 12:04:42 -080052 private static final String WALLPAPER_IMAGE = WallpaperBackupHelper.WALLPAPER_IMAGE;
Christopher Tate75a99702011-05-18 16:28:19 -070053
Amith Yamasani37ce3a82012-02-06 12:04:42 -080054 // TODO: Will need to change if backing up non-primary user's wallpaper
Amith Yamasani61f57372012-08-31 12:12:28 -070055 private static final String WALLPAPER_INFO_DIR =
56 Environment.getUserSystemDirectory(UserHandle.USER_OWNER).getAbsolutePath();
Amith Yamasani37ce3a82012-02-06 12:04:42 -080057 private static final String WALLPAPER_INFO = WallpaperBackupHelper.WALLPAPER_INFO;
58 // Use old keys to keep legacy data compatibility and avoid writing two wallpapers
59 private static final String WALLPAPER_IMAGE_KEY = WallpaperBackupHelper.WALLPAPER_IMAGE_KEY;
60 private static final String WALLPAPER_INFO_KEY = WallpaperBackupHelper.WALLPAPER_INFO_KEY;
Joe Onorato9bb8fd72009-07-28 18:24:51 -070061
62 @Override
Christopher Tate7c2bb662009-09-20 19:47:46 -070063 public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
64 ParcelFileDescriptor newState) throws IOException {
65 // We only back up the data under the current "wallpaper" schema with metadata
Dan Egnor541fa512009-11-11 17:00:06 -080066 WallpaperManagerService wallpaper = (WallpaperManagerService)ServiceManager.getService(
67 Context.WALLPAPER_SERVICE);
68 String[] files = new String[] { WALLPAPER_IMAGE, WALLPAPER_INFO };
Amith Yamasani37ce3a82012-02-06 12:04:42 -080069 String[] keys = new String[] { WALLPAPER_IMAGE_KEY, WALLPAPER_INFO_KEY };
70 if (wallpaper != null && wallpaper.getName() != null && wallpaper.getName().length() > 0) {
Dan Egnor541fa512009-11-11 17:00:06 -080071 // When the wallpaper has a name, back up the info by itself.
72 // TODO: Don't rely on the innards of the service object like this!
73 // TODO: Send a delete for any stored wallpaper image in this case?
74 files = new String[] { WALLPAPER_INFO };
Amith Yamasani37ce3a82012-02-06 12:04:42 -080075 keys = new String[] { WALLPAPER_INFO_KEY };
Dan Egnor541fa512009-11-11 17:00:06 -080076 }
Amith Yamasani37ce3a82012-02-06 12:04:42 -080077 addHelper("wallpaper", new WallpaperBackupHelper(SystemBackupAgent.this, files, keys));
Christopher Tate7c2bb662009-09-20 19:47:46 -070078 super.onBackup(oldState, data, newState);
Joe Onorato9bb8fd72009-07-28 18:24:51 -070079 }
80
Christopher Tate2efd2db2011-07-19 16:32:49 -070081 @Override
82 public void onFullBackup(FullBackupDataOutput data) throws IOException {
83 // At present we back up only the wallpaper
84 fullWallpaperBackup(data);
Christopher Tate75a99702011-05-18 16:28:19 -070085 }
86
Christopher Tate2efd2db2011-07-19 16:32:49 -070087 private void fullWallpaperBackup(FullBackupDataOutput output) {
Christopher Tate75a99702011-05-18 16:28:19 -070088 // Back up the data files directly. We do them in this specific order --
89 // info file followed by image -- because then we need take no special
90 // steps during restore; the restore will happen properly when the individual
91 // files are restored piecemeal.
92 FullBackup.backupToTar(getPackageName(), FullBackup.ROOT_TREE_TOKEN, null,
Christopher Tate2efd2db2011-07-19 16:32:49 -070093 WALLPAPER_INFO_DIR, WALLPAPER_INFO, output.getData());
Christopher Tate75a99702011-05-18 16:28:19 -070094 FullBackup.backupToTar(getPackageName(), FullBackup.ROOT_TREE_TOKEN, null,
Christopher Tate2efd2db2011-07-19 16:32:49 -070095 WALLPAPER_IMAGE_DIR, WALLPAPER_IMAGE, output.getData());
Christopher Tate4a627c72011-04-01 14:43:32 -070096 }
97
Joe Onorato9bb8fd72009-07-28 18:24:51 -070098 @Override
99 public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)
100 throws IOException {
Christopher Tate7c2bb662009-09-20 19:47:46 -0700101 // On restore, we also support a previous data schema "system_files"
Christopher Tate3f64f8d2010-12-10 17:12:19 -0800102 addHelper("wallpaper", new WallpaperBackupHelper(SystemBackupAgent.this,
Amith Yamasani37ce3a82012-02-06 12:04:42 -0800103 new String[] { WALLPAPER_IMAGE, WALLPAPER_INFO },
104 new String[] { WALLPAPER_IMAGE_KEY, WALLPAPER_INFO_KEY} ));
Christopher Tate3f64f8d2010-12-10 17:12:19 -0800105 addHelper("system_files", new WallpaperBackupHelper(SystemBackupAgent.this,
Amith Yamasani37ce3a82012-02-06 12:04:42 -0800106 new String[] { WALLPAPER_IMAGE },
107 new String[] { WALLPAPER_IMAGE_KEY} ));
Christopher Tate7c2bb662009-09-20 19:47:46 -0700108
Joe Onorato9bb8fd72009-07-28 18:24:51 -0700109 try {
110 super.onRestore(data, appVersionCode, newState);
111
Dianne Hackborn8cc6a502009-08-05 21:29:42 -0700112 WallpaperManagerService wallpaper = (WallpaperManagerService)ServiceManager.getService(
Joe Onorato9bb8fd72009-07-28 18:24:51 -0700113 Context.WALLPAPER_SERVICE);
114 wallpaper.settingsRestored();
115 } catch (IOException ex) {
Christopher Tate3f64f8d2010-12-10 17:12:19 -0800116 // If there was a failure, delete everything for the wallpaper, this is too aggressive,
Joe Onorato9bb8fd72009-07-28 18:24:51 -0700117 // but this is hopefully a rare failure.
Joe Onorato8a9b2202010-02-26 18:56:32 -0800118 Slog.d(TAG, "restore failed", ex);
Joe Onorato9bb8fd72009-07-28 18:24:51 -0700119 (new File(WALLPAPER_IMAGE)).delete();
120 (new File(WALLPAPER_INFO)).delete();
121 }
122 }
Christopher Tate75a99702011-05-18 16:28:19 -0700123
124 @Override
125 public void onRestoreFile(ParcelFileDescriptor data, long size,
126 int type, String domain, String path, long mode, long mtime)
127 throws IOException {
128 Slog.i(TAG, "Restoring file domain=" + domain + " path=" + path);
129
130 // Bits to indicate postprocessing we may need to perform
131 boolean restoredWallpaper = false;
132
133 File outFile = null;
134 // Various domain+files we understand a priori
135 if (domain.equals(FullBackup.ROOT_TREE_TOKEN)) {
136 if (path.equals(WALLPAPER_INFO_FILENAME)) {
137 outFile = new File(WALLPAPER_INFO);
138 restoredWallpaper = true;
139 } else if (path.equals(WALLPAPER_IMAGE_FILENAME)) {
140 outFile = new File(WALLPAPER_IMAGE);
141 restoredWallpaper = true;
142 }
143 }
144
145 try {
146 if (outFile == null) {
147 Slog.w(TAG, "Skipping unrecognized system file: [ " + domain + " : " + path + " ]");
148 }
Christopher Tate79ec80d2011-06-24 14:58:49 -0700149 FullBackup.restoreFile(data, size, type, mode, mtime, outFile);
Christopher Tate75a99702011-05-18 16:28:19 -0700150
151 if (restoredWallpaper) {
152 WallpaperManagerService wallpaper =
153 (WallpaperManagerService)ServiceManager.getService(
154 Context.WALLPAPER_SERVICE);
155 wallpaper.settingsRestored();
156 }
157 } catch (IOException e) {
158 if (restoredWallpaper) {
159 // Make sure we wind up in a good state
160 (new File(WALLPAPER_IMAGE)).delete();
161 (new File(WALLPAPER_INFO)).delete();
162 }
163 }
164 }
Joe Onorato9bb8fd72009-07-28 18:24:51 -0700165}