Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 78f0f8cb authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge changes 3953,3954 into donut

* changes:
  Make the file backup helper not crash if a file you requested can't be stated.  This means you don't need to know if the files you are backing up exist or not -- we'll figure it out for you.
  Fix SharedPrefsBackupHelper so it doesn't hard code the paths to the files.
parents e8966e12 ce88cb15
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -29035,6 +29035,19 @@
<parameter name="mode" type="int">
</parameter>
</method>
<method name="getSharedPrefsFile"
 return="java.io.File"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="name" type="java.lang.String">
</parameter>
</method>
<method name="getSystemService"
 return="java.lang.Object"
 abstract="false"
@@ -115907,6 +115920,19 @@
<parameter name="mode" type="int">
</parameter>
</method>
<method name="getSharedPrefsFile"
 return="java.io.File"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="name" type="java.lang.String">
</parameter>
</method>
<method name="getSystemService"
 return="java.lang.Object"
 abstract="false"
+5 −1
Original line number Diff line number Diff line
@@ -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()) {
+25 −11
Original line number Diff line number Diff line
@@ -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);
}
+2 −4
Original line number Diff line number Diff line
@@ -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);
    }
}
+9 −1
Original line number Diff line number Diff line
@@ -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
Loading