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

Commit b4914267 authored by Alan Viverette's avatar Alan Viverette Committed by Android (Google) Code Review
Browse files

Merge "Move drag-to-open handling into ActionMenuItemView"

parents 76bd2d9b 56110725
Loading
Loading
Loading
Loading
+12 −20
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ public class ActionMenuPresenter extends BaseMenuPresenter
    private ActionButtonSubmenu mActionButtonPopup;

    private OpenOverflowRunnable mPostedOpenRunnable;
    private ActionMenuPopupCallback mPopupCallback;

    final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback();
    int mOpenSubMenuId;
@@ -177,33 +178,17 @@ public class ActionMenuPresenter extends BaseMenuPresenter
    }

    @Override
    public void bindItemView(final MenuItemImpl item, MenuView.ItemView itemView) {
    public void bindItemView(MenuItemImpl item, MenuView.ItemView itemView) {
        itemView.initialize(item, 0);

        final ActionMenuView menuView = (ActionMenuView) mMenuView;
        final ActionMenuItemView actionItemView = (ActionMenuItemView) itemView;
        actionItemView.setItemInvoker(menuView);

        if (item.hasSubMenu()) {
            actionItemView.setOnTouchListener(new ForwardingListener(actionItemView) {
                @Override
                public ListPopupWindow getPopup() {
                    return mActionButtonPopup != null ? mActionButtonPopup.getPopup() : null;
                }

                @Override
                protected boolean onForwardingStarted() {
                    return onSubMenuSelected((SubMenuBuilder) item.getSubMenu());
                }

                @Override
                protected boolean onForwardingStopped() {
                    return dismissPopupMenus();
                }
            });
        } else {
            actionItemView.setOnTouchListener(null);
        if (mPopupCallback == null) {
            mPopupCallback = new ActionMenuPopupCallback();
        }
        actionItemView.setPopupCallback(mPopupCallback);
    }

    @Override
@@ -761,4 +746,11 @@ public class ActionMenuPresenter extends BaseMenuPresenter
            mPostedOpenRunnable = null;
        }
    }

    private class ActionMenuPopupCallback extends ActionMenuItemView.PopupCallback {
        @Override
        public ListPopupWindow getPopup() {
            return mActionButtonPopup != null ? mActionButtonPopup.getPopup() : null;
        }
    }
}
+63 −0
Original line number Diff line number Diff line
@@ -29,8 +29,10 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.widget.ActionMenuView;
import android.widget.ListPopupWindow;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ListPopupWindow.ForwardingListener;

/**
 * @hide
@@ -44,6 +46,8 @@ public class ActionMenuItemView extends TextView
    private CharSequence mTitle;
    private Drawable mIcon;
    private MenuBuilder.ItemInvoker mItemInvoker;
    private ForwardingListener mForwardingListener;
    private PopupCallback mPopupCallback;

    private boolean mAllowTextWithIcon;
    private boolean mExpandedFormat;
@@ -104,6 +108,7 @@ public class ActionMenuItemView extends TextView
        return mItemData;
    }

    @Override
    public void initialize(MenuItemImpl itemData, int menuType) {
        mItemData = itemData;

@@ -113,8 +118,24 @@ public class ActionMenuItemView extends TextView

        setVisibility(itemData.isVisible() ? View.VISIBLE : View.GONE);
        setEnabled(itemData.isEnabled());

        if (itemData.hasSubMenu()) {
            if (mForwardingListener == null) {
                mForwardingListener = new ActionMenuItemForwardingListener();
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        if (mItemData.hasSubMenu() && mForwardingListener != null
                && mForwardingListener.onTouch(this, e)) {
            return true;
        }
        return super.onTouchEvent(e);
    }

    @Override
    public void onClick(View v) {
        if (mItemInvoker != null) {
            mItemInvoker.invokeItem(mItemData);
@@ -125,6 +146,10 @@ public class ActionMenuItemView extends TextView
        mItemInvoker = invoker;
    }

    public void setPopupCallback(PopupCallback popupCallback) {
        mPopupCallback = popupCallback;
    }

    public boolean prefersCondensedTitle() {
        return true;
    }
@@ -290,4 +315,42 @@ public class ActionMenuItemView extends TextView
            super.setPadding((w - dw) / 2, getPaddingTop(), getPaddingRight(), getPaddingBottom());
        }
    }

    private class ActionMenuItemForwardingListener extends ForwardingListener {
        public ActionMenuItemForwardingListener() {
            super(ActionMenuItemView.this);
        }

        @Override
        public ListPopupWindow getPopup() {
            if (mPopupCallback != null) {
                return mPopupCallback.getPopup();
            }
            return null;
        }

        @Override
        protected boolean onForwardingStarted() {
            // Call the invoker, then check if the expected popup is showing.
            if (mItemInvoker != null && mItemInvoker.invokeItem(mItemData)) {
                final ListPopupWindow popup = getPopup();
                return popup != null && popup.isShowing();
            }
            return false;
        }

        @Override
        protected boolean onForwardingStopped() {
            final ListPopupWindow popup = getPopup();
            if (popup != null) {
                popup.dismiss();
                return true;
            }
            return false;
        }
    }

    public static abstract class PopupCallback {
        public abstract ListPopupWindow getPopup();
    }
}