summaryrefslogtreecommitdiffstats
path: root/core/java/android/app/backup
diff options
context:
space:
mode:
authorChristopher Tate <ctate@google.com>2014-11-18 11:57:25 -0800
committerChristopher Tate <ctate@google.com>2014-11-20 12:48:25 -0800
commitac6a3a5e9d90edb533e5b377a4a14ef514be955a (patch)
tree5d03d18976e02f9f7ede07efab2bad3b074b005e /core/java/android/app/backup
parent2e982258f10e9af21ec328faf41e77b38b109738 (diff)
downloadframeworks_base-ac6a3a5e9d90edb533e5b377a4a14ef514be955a.zip
frameworks_base-ac6a3a5e9d90edb533e5b377a4a14ef514be955a.tar.gz
frameworks_base-ac6a3a5e9d90edb533e5b377a4a14ef514be955a.tar.bz2
Recents backup helper
Handles backup/restore of recent tasks for the system. Currently the thumbnails are not saved. At restore time the historical task records are placed in a designated separate location rather than directly in the live bookkeeping; this avoids ID duplication issues and makes it easier to deal with lazy adoption of the historical task state as apps are installed on the device post-restore. Bug 17303286 Bug 15986349 Change-Id: Ie156c1e2ab9c9a7e7ac0447b27016fdcef55dded
Diffstat (limited to 'core/java/android/app/backup')
-rw-r--r--core/java/android/app/backup/RecentsBackupHelper.java114
1 files changed, 114 insertions, 0 deletions
diff --git a/core/java/android/app/backup/RecentsBackupHelper.java b/core/java/android/app/backup/RecentsBackupHelper.java
new file mode 100644
index 0000000..fd69d20
--- /dev/null
+++ b/core/java/android/app/backup/RecentsBackupHelper.java
@@ -0,0 +1,114 @@
+package android.app.backup;
+
+import android.content.Context;
+import android.os.Environment;
+import android.os.ParcelFileDescriptor;
+import android.util.Slog;
+
+import java.io.File;
+
+/**
+ * Helper for saving/restoring 'recent tasks' infrastructure.
+ * @hide
+ */
+public class RecentsBackupHelper implements BackupHelper {
+ private static final String TAG = "RecentsBackup";
+ private static final boolean DEBUG = false;
+
+ // This must match TaskPersister.TASKS_DIRNAME, but that class is not accessible from here
+ private static final String RECENTS_TASK_DIR = "recent_tasks";
+
+ // Must match TaskPersister.IMAGES_DIRNAME, as above
+ private static final String RECENTS_IMAGE_DIR = "recent_images";
+
+ // At restore time, tasks/thumbnails are placed in these directories alongside
+ // the "live" recents dirs named above.
+ private static final String RECENTS_TASK_RESTORE_DIR = "restored_" + RECENTS_TASK_DIR;
+ private static final String RECENTS_IMAGE_RESTORE_DIR = "restored_" + RECENTS_IMAGE_DIR;
+
+ // Prefixes for tagging the two kinds of recents backup records that we might generate
+ private static final String RECENTS_TASK_KEY = "task:";
+ private static final String RECENTS_IMAGE_KEY = "image:";
+
+ FileBackupHelperBase mTaskFileHelper;
+
+ final File mSystemDir;
+ final File mTasksDir;
+ final File mRestoredTasksDir;
+ final File mRestoredImagesDir;
+ final String[] mRecentFiles;
+ final String[] mRecentKeys;
+
+ /**
+ * @param context The agent context in which this helper instance will run
+ */
+ public RecentsBackupHelper(Context context) {
+ mTaskFileHelper = new FileBackupHelperBase(context);
+
+ mSystemDir = new File(Environment.getDataDirectory(), "system");
+ mTasksDir = new File(mSystemDir, RECENTS_TASK_DIR);
+ mRestoredTasksDir = new File(mSystemDir, RECENTS_TASK_RESTORE_DIR);
+ mRestoredImagesDir = new File(mSystemDir, RECENTS_IMAGE_RESTORE_DIR);
+
+ // Currently we back up only the recent-task descriptions, not the thumbnails
+ File[] recentFiles = mTasksDir.listFiles();
+ if (recentFiles != null) {
+ // We explicitly proceed even if this is a zero-size array
+ final int N = recentFiles.length;
+ mRecentKeys = new String[N];
+ mRecentFiles = new String[N];
+ if (DEBUG) {
+ Slog.i(TAG, "Identifying recents for backup: " + N);
+ }
+ for (int i = 0; i < N; i++) {
+ mRecentKeys[i] = new String(RECENTS_TASK_KEY + recentFiles[i].getName());
+ mRecentFiles[i] = recentFiles[i].getAbsolutePath();
+ if (DEBUG) {
+ Slog.i(TAG, " " + mRecentKeys[i]);
+ }
+ }
+ } else {
+ mRecentFiles = mRecentKeys = new String[0];
+ }
+ }
+
+ /**
+ * Task-file key: RECENTS_TASK_KEY + leaf filename
+ * Thumbnail-file key: RECENTS_IMAGE_KEY + leaf filename
+ */
+ @Override
+ public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
+ ParcelFileDescriptor newState) {
+ FileBackupHelperBase.performBackup_checked(oldState, data, newState,
+ mRecentFiles, mRecentKeys);
+ }
+
+ @Override
+ public void restoreEntity(BackupDataInputStream data) {
+ final String key = data.getKey();
+ File output = null;
+ if (key.startsWith(RECENTS_TASK_KEY)) {
+ String name = key.substring(RECENTS_TASK_KEY.length());
+ output = new File(mRestoredTasksDir, name);
+ mRestoredTasksDir.mkdirs();
+ } else if (key.startsWith(RECENTS_IMAGE_KEY)) {
+ String name = key.substring(RECENTS_IMAGE_KEY.length());
+ output = new File(mRestoredImagesDir, name);
+ mRestoredImagesDir.mkdirs();
+ }
+
+ if (output != null) {
+ if (DEBUG) {
+ Slog.i(TAG, "Restoring key='"
+ + key + "' to " + output.getAbsolutePath());
+ }
+ mTaskFileHelper.writeFile(output, data);
+ }
+ }
+
+ @Override
+ public void writeNewStateDescription(ParcelFileDescriptor newState) {
+ mTaskFileHelper.writeNewStateDescription(newState);
+ }
+
+}