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

Commit 04c0d460 authored by Adam Powell's avatar Adam Powell
Browse files

Dispatch more menu events to window callbacks from ToolbarActionBar

Wire through the callbacks that result in onPrepareOptionsMenu being
called properly when an activity overflow menu is opened.

Bug 17326424

Change-Id: Ifc5b67af0d215f210bb00326f82f60ba55a36d52
parent 191cbad9
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.view.accessibility.AccessibilityEvent;
import com.android.internal.view.menu.ActionMenuItemView;
import com.android.internal.view.menu.MenuBuilder;
import com.android.internal.view.menu.MenuItemImpl;
import com.android.internal.view.menu.MenuPresenter;
import com.android.internal.view.menu.MenuView;

/**
@@ -53,6 +54,7 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo

    private boolean mReserveOverflow;
    private ActionMenuPresenter mPresenter;
    private MenuPresenter.Callback mActionMenuPresenterCallback;
    private boolean mFormatItems;
    private int mFormatItemsWidth;
    private int mMinCellSize;
@@ -608,7 +610,8 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
            mMenu = new MenuBuilder(context);
            mMenu.setCallback(new MenuBuilderCallback());
            mPresenter = new ActionMenuPresenter(context);
            mPresenter.setCallback(new ActionMenuPresenterCallback());
            mPresenter.setCallback(mActionMenuPresenterCallback != null
                    ? mActionMenuPresenterCallback : new ActionMenuPresenterCallback());
            mMenu.addMenuPresenter(mPresenter, mPopupContext);
            mPresenter.setMenuView(this);
        }
@@ -616,6 +619,14 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
        return mMenu;
    }

    /**
     * Must be called before the first call to getMenu()
     * @hide
     */
    public void setActionMenuPresenterCallback(MenuPresenter.Callback cb) {
        mActionMenuPresenterCallback = cb;
    }

    /**
     * Returns the current menu or null if one has not yet been configured.
     * @hide Internal use only for action bar integration
+11 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.view.View;
import android.view.ViewGroup;

import com.android.internal.R;
import com.android.internal.app.ToolbarActionBar;
import com.android.internal.view.menu.MenuBuilder;
import com.android.internal.view.menu.MenuItemImpl;
import com.android.internal.view.menu.MenuPresenter;
@@ -153,6 +154,7 @@ public class Toolbar extends ViewGroup {
    private ToolbarWidgetWrapper mWrapper;
    private ActionMenuPresenter mOuterActionMenuPresenter;
    private ExpandedActionViewMenuPresenter mExpandedMenuPresenter;
    private MenuPresenter.Callback mActionMenuPresenterCallback;

    private boolean mCollapsible;

@@ -825,6 +827,7 @@ public class Toolbar extends ViewGroup {
            mMenuView = new ActionMenuView(getContext());
            mMenuView.setPopupTheme(mPopupTheme);
            mMenuView.setOnMenuItemClickListener(mMenuViewItemClickListener);
            mMenuView.setActionMenuPresenterCallback(mActionMenuPresenterCallback);
            final LayoutParams lp = generateDefaultLayoutParams();
            lp.gravity = Gravity.END | (mButtonGravity & Gravity.VERTICAL_GRAVITY_MASK);
            mMenuView.setLayoutParams(lp);
@@ -1677,6 +1680,14 @@ public class Toolbar extends ViewGroup {
        requestLayout();
    }

    /**
     * Must be called before the menu is accessed
     * @hide
     */
    public void setActionMenuPresenterCallback(MenuPresenter.Callback cb) {
        mActionMenuPresenterCallback = cb;
    }

    /**
     * Interface responsible for receiving menu item click events if the items themselves
     * do not have individual item click listeners.
+33 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import android.widget.SpinnerAdapter;
import android.widget.Toolbar;
import com.android.internal.R;
import com.android.internal.view.menu.MenuBuilder;
import com.android.internal.view.menu.MenuPresenter;
import com.android.internal.widget.DecorToolbar;
import com.android.internal.widget.ToolbarWidgetWrapper;

@@ -45,6 +46,7 @@ public class ToolbarActionBar extends ActionBar {
    private DecorToolbar mDecorToolbar;
    private boolean mToolbarMenuPrepared;
    private Window.Callback mWindowCallback;
    private boolean mMenuCallbackSet;

    private CharSequence mHomeDescription;

@@ -453,6 +455,10 @@ public class ToolbarActionBar extends ActionBar {
    }

    void populateOptionsMenu() {
        if (!mMenuCallbackSet) {
            mToolbar.setActionMenuPresenterCallback(new ActionMenuPresenterCallback());
            mMenuCallbackSet = true;
        }
        final Menu menu = mToolbar.getMenu();
        final MenuBuilder mb = menu instanceof MenuBuilder ? (MenuBuilder) menu : null;
        if (mb != null) {
@@ -514,4 +520,31 @@ public class ToolbarActionBar extends ActionBar {
            return result;
        }
    }

    private final class ActionMenuPresenterCallback implements MenuPresenter.Callback {
        private boolean mClosingActionMenu;

        @Override
        public boolean onOpenSubMenu(MenuBuilder subMenu) {
            if (mWindowCallback != null) {
                mWindowCallback.onMenuOpened(Window.FEATURE_ACTION_BAR, subMenu);
                return true;
            }
            return false;
        }

        @Override
        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
            if (mClosingActionMenu) {
                return;
            }

            mClosingActionMenu = true;
            mToolbar.dismissPopupMenus();
            if (mWindowCallback != null) {
                mWindowCallback.onPanelClosed(Window.FEATURE_ACTION_BAR, menu);
            }
            mClosingActionMenu = false;
        }
    }
}