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

Commit ca51e878 authored by Adam Powell's avatar Adam Powell
Browse files

Fix some bugs with MenuPopupHelper and ListPopupWindow

Clean up handling of a few conditions in MenuPopupHelper that the
monkeys manage to trigger around the use of ViewTreeObserver. (bug
3443819, bug 3312949)

Fix a bug where a stale handler message could cause a ListPopupWindow
to reopen itself after being dismissed. (bug 3453607)

Change-Id: I488014767ccee785500862a2572beb35901d173b
parent 95d6b782
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -604,6 +604,7 @@ public class ListPopupWindow {
        removePromptView();
        mPopup.setContentView(null);
        mDropDownList = null;
        mHandler.removeCallbacks(mResizePopupRunnable);
    }

    /**
+14 −8
Original line number Diff line number Diff line
@@ -101,8 +101,10 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On
        }

        if (anchor != null) {
            if (mTreeObserver == null) {
                mTreeObserver = anchor.getViewTreeObserver();
                mTreeObserver.addOnGlobalLayoutListener(this);
            }
            mPopup.setAnchorView(anchor);
        } else {
            return false;
@@ -123,10 +125,10 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On

    public void onDismiss() {
        mPopup = null;
        if (mTreeObserver != null) {
            mTreeObserver.removeGlobalOnLayoutListener(MenuPopupHelper.this);
            mTreeObserver = null;
        if (mTreeObserver != null && mTreeObserver.isAlive()) {
            mTreeObserver.removeGlobalOnLayoutListener(this);
        }
        mTreeObserver = null;
    }

    public boolean isShowing() {
@@ -134,6 +136,8 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On
    }

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        if (!isShowing()) return;

        MenuItem item = null;
        if (mOverflowOnly) {
            item = mMenu.getOverflowItem(position);
@@ -184,13 +188,15 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On
    @Override
    public void onGlobalLayout() {
        if (!isShowing()) {
            if (mTreeObserver.isAlive()) {
                mTreeObserver.removeGlobalOnLayoutListener(this);
            }
            mTreeObserver = null;
        } else {
            final View anchor = mAnchorView != null ? mAnchorView.get() : null;
            if (anchor != null && !anchor.isShown()) {
            if (anchor == null || !anchor.isShown()) {
                dismiss();
            } else {
            } else if (isShowing()) {
                // Recompute window size and position
                mPopup.show();
            }