Merge "Use the correct handler when persisting the settings state." into nyc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
967fcfa593
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user