diff options
author | Selene Feigl <luna@artemicode.de> | 2012-11-11 23:49:27 +0100 |
---|---|---|
committer | Gerrit Code Review <gerrit@review.cyanogenmod.com> | 2012-11-12 10:29:17 -0800 |
commit | d4eacbe70db0c7cdf696b324927b353518d5b0d0 (patch) | |
tree | 96c87e695d96df4922afa6448a79f90a00286334 | |
parent | ccdaa4e090ff469ea3c3a20b6cbdf8a6e9ac38fb (diff) | |
download | android_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.java | 72 |
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(); |