summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSelene Feigl <luna@artemicode.de>2012-11-11 23:49:27 +0100
committerGerrit Code Review <gerrit@review.cyanogenmod.com>2012-11-12 10:29:17 -0800
commitd4eacbe70db0c7cdf696b324927b353518d5b0d0 (patch)
tree96c87e695d96df4922afa6448a79f90a00286334
parentccdaa4e090ff469ea3c3a20b6cbdf8a6e9ac38fb (diff)
downloadandroid_frameworks_base-d4eacbe70db0c7cdf696b324927b353518d5b0d0.tar.gz
android_frameworks_base-d4eacbe70db0c7cdf696b324927b353518d5b0d0.tar.bz2
android_frameworks_base-d4eacbe70db0c7cdf696b324927b353518d5b0d0.zip
Fix memory leak in SettingsObserver. The observer holds closed activities alive because it registered to ContentResolver.
Move SettingsObserver to DecorView where it is needed and observe/unobserve on attach/detach from Window Change-Id: I0ca65203bca6c1a3f481ba8cdd58d6d986f9c47b
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindow.java72
1 files changed, 40 insertions, 32 deletions
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 012d2f1646c..d7b210da1d7 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -198,8 +198,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
private boolean mAlwaysReadCloseOnTouchAttr = false;
- private boolean mEnableGestures;
-
private Context mContext;
private ContextMenuBuilder mContextMenu;
private MenuDialogHelper mContextMenuHelper;
@@ -210,33 +208,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
private AudioManager mAudioManager;
private KeyguardManager mKeyguardManager;
- private Handler mConfigHandler;
-
- private final class SettingsObserver extends ContentObserver {
- SettingsObserver(Handler handler) {
- super(handler);
- }
-
- void observe() {
- ContentResolver resolver = mContext.getContentResolver();
- resolver.registerContentObserver(Settings.System
- .getUriFor(Settings.System.ENABLE_STYLUS_GESTURES), false,
- this);
- checkGestures();
- }
-
- @Override
- public void onChange(boolean selfChange) {
- checkGestures();
- }
-
- void checkGestures() {
- mEnableGestures = Settings.System.getInt(
- mContext.getContentResolver(),
- Settings.System.ENABLE_STYLUS_GESTURES, 0) == 1;
- }
- }
-
private int mUiOptions = 0;
static class WindowManagerHolder {
@@ -250,9 +221,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
super(context);
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
- mConfigHandler = new Handler();
- SettingsObserver settingsObserver = new SettingsObserver(mConfigHandler);
- settingsObserver.observe();
}
@Override
@@ -1835,9 +1803,15 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
private PopupWindow mActionModePopup;
private Runnable mShowActionModePopup;
+ private SettingsObserver gestureObserver;
+ private Handler mConfigHandler;
+ private boolean mEnableGestures;
+
public DecorView(Context context, int featureId) {
super(context);
mFeatureId = featureId;
+ mConfigHandler = new Handler();
+ gestureObserver = new SettingsObserver(mConfigHandler);
}
@Override
@@ -1997,6 +1971,36 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
+ private final class SettingsObserver extends ContentObserver {
+ SettingsObserver(Handler handler) {
+ super(handler);
+ }
+
+ void observe() {
+ ContentResolver resolver = mContext.getContentResolver();
+ resolver.registerContentObserver(Settings.System
+ .getUriFor(Settings.System.ENABLE_STYLUS_GESTURES), false,
+ this);
+ checkGestures();
+ }
+
+ void unobserve() {
+ ContentResolver resolver = mContext.getContentResolver();
+ resolver.unregisterContentObserver(this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ checkGestures();
+ }
+
+ void checkGestures() {
+ mEnableGestures = Settings.System.getInt(
+ mContext.getContentResolver(),
+ Settings.System.ENABLE_STYLUS_GESTURES, 0) == 1;
+ }
+ }
+
private void menuAction() {
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,
KeyEvent.KEYCODE_MENU));
@@ -2719,6 +2723,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
updateWindowResizeState();
+ gestureObserver.observe();
+
final Callback cb = getCallback();
if (cb != null && !isDestroyed() && mFeatureId < 0) {
cb.onAttachedToWindow();
@@ -2740,6 +2746,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
+ gestureObserver.unobserve();
+
final Callback cb = getCallback();
if (cb != null && mFeatureId < 0) {
cb.onDetachedFromWindow();