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

Commit 844f24dc authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Refresh in-memory SharedPreferences instances after restore"

parents 28eec81d fe2368c3
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Objects;

class ReceiverRestrictedContext extends ContextWrapper {
@@ -417,6 +418,26 @@ class ContextImpl extends Context {
        return packagePrefs;
    }

    @Override
    public void reloadSharedPreferences() {
        // Build the list of all per-context impls (i.e. caches) we know about
        ArrayList<SharedPreferencesImpl> spImpls = new ArrayList<>();
        synchronized (ContextImpl.class) {
            final ArrayMap<File, SharedPreferencesImpl> cache = getSharedPreferencesCacheLocked();
            for (int i = 0; i < cache.size(); i++) {
                final SharedPreferencesImpl sp = cache.valueAt(i);
                if (sp != null) {
                    spImpls.add(sp);
                }
            }
        }

        // Issue the reload outside the cache lock
        for (int i = 0; i < spImpls.size(); i++) {
            spImpls.get(i).startReloadIfChangedUnexpectedly();
        }
    }

    /**
     * Try our best to migrate all files from source to target that match
     * requested prefix.
+9 −2
Original line number Diff line number Diff line
@@ -942,6 +942,11 @@ public abstract class BackupAgent extends ContextWrapper {
            long ident = Binder.clearCallingIdentity();

            if (DEBUG) Log.v(TAG, "doRestore() invoked");

            // Ensure that any side-effect SharedPreferences writes have landed *before*
            // we may be about to rewrite the file out from underneath
            waitForSharedPrefs();

            BackupDataInput input = new BackupDataInput(data.getFileDescriptor());
            try {
                BackupAgent.this.onRestore(input, appVersionCode, newState);
@@ -952,8 +957,8 @@ public abstract class BackupAgent extends ContextWrapper {
                Log.d(TAG, "onRestore (" + BackupAgent.this.getClass().getName() + ") threw", ex);
                throw ex;
            } finally {
                // Ensure that any side-effect SharedPreferences writes have landed
                waitForSharedPrefs();
                // And bring live SharedPreferences instances up to date
                reloadSharedPreferences();

                Binder.restoreCallingIdentity(ident);
                try {
@@ -1053,6 +1058,8 @@ public abstract class BackupAgent extends ContextWrapper {
            } finally {
                // Ensure that any side-effect SharedPreferences writes have landed
                waitForSharedPrefs();
                // And bring live SharedPreferences instances up to date
                reloadSharedPreferences();

                Binder.restoreCallingIdentity(ident);
                try {
+3 −0
Original line number Diff line number Diff line
@@ -813,6 +813,9 @@ public abstract class Context {
     */
    public abstract boolean deleteSharedPreferences(String name);

    /** @hide */
    public abstract void reloadSharedPreferences();

    /**
     * Open a private file associated with this Context's application package
     * for reading.
+6 −1
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package android.content;
import android.annotation.SystemApi;
import android.app.IApplicationThread;
import android.app.IServiceConnection;
import android.app.Notification;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
@@ -173,6 +172,12 @@ public class ContextWrapper extends Context {
        return mBase.getSharedPreferences(file, mode);
    }

    /** @hide */
    @Override
    public void reloadSharedPreferences() {
        mBase.reloadSharedPreferences();
    }

    @Override
    public boolean moveSharedPreferencesFrom(Context sourceContext, String name) {
        return mBase.moveSharedPreferencesFrom(sourceContext, name);
+26 −4
Original line number Diff line number Diff line
@@ -839,6 +839,29 @@ public class BackupManagerService implements BackupManagerServiceInterface {
        return !appGetsFullBackup(pkg);
    }
    /*
     * Construct a backup agent instance for the metadata pseudopackage.  This is a
     * process-local non-lifecycle agent instance, so we manually set up the context
     * topology for it.
     */
    PackageManagerBackupAgent makeMetadataAgent() {
        PackageManagerBackupAgent pmAgent = new PackageManagerBackupAgent(mPackageManager);
        pmAgent.attach(mContext);
        pmAgent.onCreate();
        return pmAgent;
    }
    /*
     * Same as above but with the explicit package-set configuration.
     */
    PackageManagerBackupAgent makeMetadataAgent(List<PackageInfo> packages) {
        PackageManagerBackupAgent pmAgent =
                new PackageManagerBackupAgent(mPackageManager, packages);
        pmAgent.attach(mContext);
        pmAgent.onCreate();
        return pmAgent;
    }
    // ----- Asynchronous backup/restore handler thread -----
    private class BackupHandler extends Handler {
@@ -2893,8 +2916,7 @@ public class BackupManagerService implements BackupManagerServiceInterface {
                    // because it's cheap and this way we guarantee that we don't get out of
                    // step even if we're selecting among various transports at run time.
                    if (mStatus == BackupTransport.TRANSPORT_OK) {
                        PackageManagerBackupAgent pmAgent = new PackageManagerBackupAgent(
                                mPackageManager);
                        PackageManagerBackupAgent pmAgent = makeMetadataAgent();
                        mStatus = invokeAgentForBackup(PACKAGE_MANAGER_SENTINEL,
                                IBackupAgent.Stub.asInterface(pmAgent.onBind()), mTransport);
                        addBackupTrace("PMBA invoke: " + mStatus);
@@ -7155,7 +7177,7 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
            mObserver = observer;
            mLatchObject = latch;
            mAgent = null;
            mPackageManagerBackupAgent = new PackageManagerBackupAgent(mPackageManager);
            mPackageManagerBackupAgent = makeMetadataAgent();
            mAgentPackage = null;
            mTargetApp = null;
            mObbConnection = new FullBackupObbConnection();
@@ -8817,7 +8839,7 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
                // Pull the Package Manager metadata from the restore set first
                mCurrentPackage = new PackageInfo();
                mCurrentPackage.packageName = PACKAGE_MANAGER_SENTINEL;
                mPmAgent = new PackageManagerBackupAgent(mPackageManager, null);
                mPmAgent = makeMetadataAgent(null);
                mAgent = IBackupAgent.Stub.asInterface(mPmAgent.onBind());
                if (MORE_DEBUG) {
                    Slog.v(TAG, "initiating restore for PMBA");
Loading