Fix SharedPrefsBackupHelper so it doesn't hard code the paths to the files.
This took quite a bit of refactoring.
This commit is contained in:
@@ -300,10 +300,14 @@ class ApplicationContext extends Context {
|
||||
return new File(prefsFile.getPath() + ".bak");
|
||||
}
|
||||
|
||||
public File getSharedPrefsFile(String name) {
|
||||
return makeFilename(getPreferencesDir(), name + ".xml");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SharedPreferences getSharedPreferences(String name, int mode) {
|
||||
SharedPreferencesImpl sp;
|
||||
File f = makeFilename(getPreferencesDir(), name + ".xml");
|
||||
File f = getSharedPrefsFile(name);
|
||||
synchronized (sSharedPrefs) {
|
||||
sp = sSharedPrefs.get(f);
|
||||
if (sp != null && !sp.hasFileChanged()) {
|
||||
|
||||
@@ -20,6 +20,7 @@ import android.content.Context;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileDescriptor;
|
||||
|
||||
/** @hide */
|
||||
@@ -34,22 +35,34 @@ public class FileBackupHelper {
|
||||
public static void performBackup(Context context,
|
||||
ParcelFileDescriptor oldState, BackupDataOutput data,
|
||||
ParcelFileDescriptor newState, String[] files) {
|
||||
String basePath = context.getFilesDir().getAbsolutePath();
|
||||
performBackup_checked(basePath, oldState, data, newState, files);
|
||||
File base = context.getFilesDir();
|
||||
final int N = files.length;
|
||||
String[] fullPaths = new String[N];
|
||||
for (int i=0; i<N; i++) {
|
||||
fullPaths[i] = (new File(base, files[i])).getAbsolutePath();
|
||||
}
|
||||
performBackup_checked(oldState, data, newState, fullPaths, files);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the parameters so the native code doens't have to throw all the exceptions
|
||||
* since it's easier to do that from java.
|
||||
*/
|
||||
static void performBackup_checked(String basePath,
|
||||
ParcelFileDescriptor oldState, BackupDataOutput data,
|
||||
ParcelFileDescriptor newState, String[] files) {
|
||||
static void performBackup_checked(ParcelFileDescriptor oldState, BackupDataOutput data,
|
||||
ParcelFileDescriptor newState, String[] files, String[] keys) {
|
||||
if (files.length == 0) {
|
||||
return;
|
||||
}
|
||||
if (basePath == null) {
|
||||
throw new NullPointerException();
|
||||
// files must be all absolute paths
|
||||
for (String f: files) {
|
||||
if (f.charAt(0) != '/') {
|
||||
throw new RuntimeException("files must have all absolute paths: " + f);
|
||||
}
|
||||
}
|
||||
// the length of files and keys must be the same
|
||||
if (files.length != keys.length) {
|
||||
throw new RuntimeException("files.length=" + files.length
|
||||
+ " keys.length=" + keys.length);
|
||||
}
|
||||
// oldStateFd can be null
|
||||
FileDescriptor oldStateFd = oldState != null ? oldState.getFileDescriptor() : null;
|
||||
@@ -58,13 +71,14 @@ public class FileBackupHelper {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
|
||||
int err = performBackup_native(basePath, oldStateFd, data.mBackupWriter, newStateFd, files);
|
||||
int err = performBackup_native(oldStateFd, data.mBackupWriter, newStateFd, files, keys);
|
||||
|
||||
if (err != 0) {
|
||||
throw new RuntimeException("Backup failed"); // TODO: more here
|
||||
// TODO: more here
|
||||
throw new RuntimeException("Backup failed 0x" + Integer.toHexString(err));
|
||||
}
|
||||
}
|
||||
|
||||
native private static int performBackup_native(String basePath, FileDescriptor oldState,
|
||||
int data, FileDescriptor newState, String[] files);
|
||||
native private static int performBackup_native(FileDescriptor oldState,
|
||||
int data, FileDescriptor newState, String[] files, String[] keys);
|
||||
}
|
||||
|
||||
@@ -26,16 +26,14 @@ public class SharedPreferencesBackupHelper {
|
||||
public static void performBackup(Context context,
|
||||
ParcelFileDescriptor oldSnapshot, ParcelFileDescriptor newSnapshot,
|
||||
BackupDataOutput data, String[] prefGroups) {
|
||||
String basePath = "/xxx"; //context.getPreferencesDir();
|
||||
|
||||
// make filenames for the prefGroups
|
||||
final int N = prefGroups.length;
|
||||
String[] files = new String[N];
|
||||
for (int i=0; i<N; i++) {
|
||||
files[i] = prefGroups[i] + ".xml";
|
||||
files[i] = context.getSharedPrefsFile(prefGroups[i]).toString();
|
||||
}
|
||||
|
||||
FileBackupHelper.performBackup_checked(basePath, oldSnapshot, data, newSnapshot, files);
|
||||
FileBackupHelper.performBackup_checked(oldSnapshot, data, newSnapshot, files, prefGroups);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -254,11 +254,19 @@ public abstract class Context {
|
||||
* <p>Note: this is not generally useful for applications, since they should
|
||||
* not be directly accessing the file system.
|
||||
*
|
||||
*
|
||||
* @return String Path to the code and assets.
|
||||
*/
|
||||
public abstract String getPackageCodePath();
|
||||
|
||||
/**
|
||||
* {@hide}
|
||||
* Return the full path to the shared prefs file for the given prefs group name.
|
||||
*
|
||||
* <p>Note: this is not generally useful for applications, since they should
|
||||
* not be directly accessing the file system.
|
||||
*/
|
||||
public abstract File getSharedPrefsFile(String name);
|
||||
|
||||
/**
|
||||
* Retrieve and hold the contents of the preferences file 'name', returning
|
||||
* a SharedPreferences through which you can retrieve and modify its
|
||||
|
||||
@@ -129,6 +129,11 @@ public class ContextWrapper extends Context {
|
||||
return mBase.getPackageCodePath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getSharedPrefsFile(String name) {
|
||||
return mBase.getSharedPrefsFile(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SharedPreferences getSharedPreferences(String name, int mode) {
|
||||
return mBase.getSharedPreferences(name, mode);
|
||||
|
||||
@@ -28,8 +28,8 @@ namespace android
|
||||
static jfieldID s_descriptorField = 0;
|
||||
|
||||
static int
|
||||
performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldState, int data,
|
||||
jobject newState, jobjectArray files)
|
||||
performBackup_native(JNIEnv* env, jobject clazz, jobject oldState, int data,
|
||||
jobject newState, jobjectArray files, jobjectArray keys)
|
||||
{
|
||||
int err;
|
||||
|
||||
@@ -39,29 +39,37 @@ performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldSt
|
||||
int newStateFD = env->GetIntField(newState, s_descriptorField);
|
||||
BackupDataWriter* dataStream = (BackupDataWriter*)data;
|
||||
|
||||
char const* basePathUTF = env->GetStringUTFChars(basePath, NULL);
|
||||
LOGD("basePathUTF=\"%s\"\n", basePathUTF);
|
||||
const int fileCount = env->GetArrayLength(files);
|
||||
char const** filesUTF = (char const**)malloc(sizeof(char*)*fileCount);
|
||||
for (int i=0; i<fileCount; i++) {
|
||||
filesUTF[i] = env->GetStringUTFChars((jstring)env->GetObjectArrayElement(files, i), NULL);
|
||||
}
|
||||
|
||||
err = back_up_files(oldStateFD, dataStream, newStateFD, basePathUTF, filesUTF, fileCount);
|
||||
const int keyCount = env->GetArrayLength(keys);
|
||||
char const** keysUTF = (char const**)malloc(sizeof(char*)*keyCount);
|
||||
for (int i=0; i<keyCount; i++) {
|
||||
keysUTF[i] = env->GetStringUTFChars((jstring)env->GetObjectArrayElement(keys, i), NULL);
|
||||
}
|
||||
|
||||
err = back_up_files(oldStateFD, dataStream, newStateFD, filesUTF, keysUTF, fileCount);
|
||||
|
||||
for (int i=0; i<fileCount; i++) {
|
||||
env->ReleaseStringUTFChars((jstring)env->GetObjectArrayElement(files, i), filesUTF[i]);
|
||||
}
|
||||
free(filesUTF);
|
||||
env->ReleaseStringUTFChars(basePath, basePathUTF);
|
||||
|
||||
for (int i=0; i<keyCount; i++) {
|
||||
env->ReleaseStringUTFChars((jstring)env->GetObjectArrayElement(keys, i), keysUTF[i]);
|
||||
}
|
||||
free(keysUTF);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static const JNINativeMethod g_methods[] = {
|
||||
{ "performBackup_native",
|
||||
"(Ljava/lang/String;Ljava/io/FileDescriptor;ILjava/io/FileDescriptor;[Ljava/lang/String;)I",
|
||||
(void*)performBackup_native },
|
||||
"(Ljava/io/FileDescriptor;ILjava/io/FileDescriptor;[Ljava/lang/String;[Ljava/lang/String;)I",
|
||||
(void*)performBackup_native },
|
||||
};
|
||||
|
||||
int register_android_backup_FileBackupHelper(JNIEnv* env)
|
||||
|
||||
Reference in New Issue
Block a user