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); } }