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

Commit 967fcfa5 authored by Svetoslav Ganov's avatar Svetoslav Ganov Committed by Android (Google) Code Review
Browse files

Merge "Use the correct handler when persisting the settings state." into nyc-dev

parents 37a40271 9205749c
Loading
Loading
Loading
Loading
+1 −5
Original line number Original line Diff line number Diff line
@@ -203,9 +203,6 @@ public class SettingsProvider extends ContentProvider {
    @GuardedBy("mLock")
    @GuardedBy("mLock")
    private HandlerThread mHandlerThread;
    private HandlerThread mHandlerThread;


    @GuardedBy("mLock")
    private Handler mBackgroundHandler;

    // We have to call in the user manager with no lock held,
    // We have to call in the user manager with no lock held,
    private volatile UserManager mUserManager;
    private volatile UserManager mUserManager;


@@ -254,7 +251,6 @@ public class SettingsProvider extends ContentProvider {
            mHandlerThread = new HandlerThread(LOG_TAG,
            mHandlerThread = new HandlerThread(LOG_TAG,
                    Process.THREAD_PRIORITY_BACKGROUND);
                    Process.THREAD_PRIORITY_BACKGROUND);
            mHandlerThread.start();
            mHandlerThread.start();
            mBackgroundHandler = new Handler(mHandlerThread.getLooper());
            mSettingsRegistry = new SettingsRegistry();
            mSettingsRegistry = new SettingsRegistry();
        }
        }
        registerBroadcastReceivers();
        registerBroadcastReceivers();
@@ -1680,7 +1676,7 @@ public class SettingsProvider extends ContentProvider {
            if (mSettingsStates.get(key) == null) {
            if (mSettingsStates.get(key) == null) {
                final int maxBytesPerPackage = getMaxBytesPerPackageForType(getTypeFromKey(key));
                final int maxBytesPerPackage = getMaxBytesPerPackageForType(getTypeFromKey(key));
                SettingsState settingsState = new SettingsState(mLock, getSettingsFile(key), key,
                SettingsState settingsState = new SettingsState(mLock, getSettingsFile(key), key,
                        maxBytesPerPackage, mBackgroundHandler);
                        maxBytesPerPackage, mHandlerThread.getLooper());
                mSettingsStates.put(key, settingsState);
                mSettingsStates.put(key, settingsState);
            }
            }
        }
        }
+5 −5
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.providers.settings;
package com.android.providers.settings;


import android.os.Handler;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.Message;
import android.os.SystemClock;
import android.os.SystemClock;
import android.provider.Settings;
import android.provider.Settings;
@@ -27,7 +28,6 @@ import android.util.Base64;
import android.util.Slog;
import android.util.Slog;
import android.util.Xml;
import android.util.Xml;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.BackgroundThread;
import libcore.io.IoUtils;
import libcore.io.IoUtils;
import libcore.util.Objects;
import libcore.util.Objects;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParser;
@@ -135,14 +135,14 @@ final class SettingsState {
    private long mNextId;
    private long mNextId;


    public SettingsState(Object lock, File file, int key, int maxBytesPerAppPackage,
    public SettingsState(Object lock, File file, int key, int maxBytesPerAppPackage,
            Handler handler) {
            Looper looper) {
        // It is important that we use the same lock as the settings provider
        // It is important that we use the same lock as the settings provider
        // to ensure multiple mutations on this state are atomicaly persisted
        // to ensure multiple mutations on this state are atomicaly persisted
        // as the async persistence should be blocked while we make changes.
        // as the async persistence should be blocked while we make changes.
        mLock = lock;
        mLock = lock;
        mStatePersistFile = file;
        mStatePersistFile = file;
        mKey = key;
        mKey = key;
        mHandler = handler;
        mHandler = new MyHandler(looper);
        if (maxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_LIMITED) {
        if (maxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_LIMITED) {
            mMaxBytesPerAppPackage = maxBytesPerAppPackage;
            mMaxBytesPerAppPackage = maxBytesPerAppPackage;
            mPackageToMemoryUsage = new ArrayMap<>();
            mPackageToMemoryUsage = new ArrayMap<>();
@@ -548,8 +548,8 @@ final class SettingsState {
    private final class MyHandler extends Handler {
    private final class MyHandler extends Handler {
        public static final int MSG_PERSIST_SETTINGS = 1;
        public static final int MSG_PERSIST_SETTINGS = 1;


        public MyHandler() {
        public MyHandler(Looper looper) {
            super(BackgroundThread.getHandler().getLooper());
            super(looper);
        }
        }


        @Override
        @Override
+4 −3
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@
package com.android.providers.settings;
package com.android.providers.settings;


import android.os.Handler;
import android.os.Handler;
import android.os.Looper;
import android.test.AndroidTestCase;
import android.test.AndroidTestCase;
import android.util.Xml;
import android.util.Xml;


@@ -127,7 +128,7 @@ public class SettingsStateTest extends AndroidTestCase {
        final Object lock = new Object();
        final Object lock = new Object();


        final SettingsState ssWriter = new SettingsState(lock, file, 1,
        final SettingsState ssWriter = new SettingsState(lock, file, 1,
                SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, new Handler());
                SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper());
        ssWriter.setVersionLocked(SettingsState.SETTINGS_VERSOIN_NEW_ENCODING);
        ssWriter.setVersionLocked(SettingsState.SETTINGS_VERSOIN_NEW_ENCODING);


        ssWriter.insertSettingLocked("k1", "\u0000", "package");
        ssWriter.insertSettingLocked("k1", "\u0000", "package");
@@ -139,7 +140,7 @@ public class SettingsStateTest extends AndroidTestCase {
        }
        }


        final SettingsState ssReader = new SettingsState(lock, file, 1,
        final SettingsState ssReader = new SettingsState(lock, file, 1,
                SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, new Handler());
                SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper());
        synchronized (lock) {
        synchronized (lock) {
            assertEquals("\u0000", ssReader.getSettingLocked("k1").getValue());
            assertEquals("\u0000", ssReader.getSettingLocked("k1").getValue());
            assertEquals("abc", ssReader.getSettingLocked("k2").getValue());
            assertEquals("abc", ssReader.getSettingLocked("k2").getValue());
@@ -166,7 +167,7 @@ public class SettingsStateTest extends AndroidTestCase {
        os.close();
        os.close();


        final SettingsState ss = new SettingsState(lock, file, 1,
        final SettingsState ss = new SettingsState(lock, file, 1,
                SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, new Handler());
                SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper());
        synchronized (lock) {
        synchronized (lock) {
            SettingsState.Setting s;
            SettingsState.Setting s;
            s = ss.getSettingLocked("k0");
            s = ss.getSettingLocked("k0");