blob: fd69d2043d15024724b00acd12287ec72ff80dfb [file] [log] [blame]
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);
}
}