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

Commit d4eacbe7 authored by Selene Feigl's avatar Selene Feigl Committed by Gerrit Code Review
Browse files

Fix memory leak in SettingsObserver. The observer holds closed activities...

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
parent ccdaa4e0
Loading
Loading
Loading
Loading
+40 −32
Original line number Diff line number Diff line
@@ -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();