From c46125042493e66f7dfdccec24e3b0739600b194 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Thu, 4 Sep 2014 19:16:39 -0700 Subject: [PATCH] Menu callbacks for ToolbarActionBars, part 2 Pass through the menu mode change events and make sure Activities get prepare/open/close events properly. Bug 17326424 Change-Id: I0ac2f56e4d0054ef01720b2ff1c41ded053750c7 --- core/java/android/widget/ActionMenuView.java | 9 ++++++-- core/java/android/widget/Toolbar.java | 8 ++++--- .../internal/app/ToolbarActionBar.java | 22 ++++++++++++++++++- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/core/java/android/widget/ActionMenuView.java b/core/java/android/widget/ActionMenuView.java index 9b65232cf8770..6ca4a9e10db2f 100644 --- a/core/java/android/widget/ActionMenuView.java +++ b/core/java/android/widget/ActionMenuView.java @@ -55,6 +55,7 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo private boolean mReserveOverflow; private ActionMenuPresenter mPresenter; private MenuPresenter.Callback mActionMenuPresenterCallback; + private MenuBuilder.Callback mMenuBuilderCallback; private boolean mFormatItems; private int mFormatItemsWidth; private int mMinCellSize; @@ -623,8 +624,9 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo * Must be called before the first call to getMenu() * @hide */ - public void setActionMenuPresenterCallback(MenuPresenter.Callback cb) { - mActionMenuPresenterCallback = cb; + public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) { + mActionMenuPresenterCallback = pcb; + mMenuBuilderCallback = mcb; } /** @@ -730,6 +732,9 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo @Override public void onMenuModeChange(MenuBuilder menu) { + if (mMenuBuilderCallback != null) { + mMenuBuilderCallback.onMenuModeChange(menu); + } } } diff --git a/core/java/android/widget/Toolbar.java b/core/java/android/widget/Toolbar.java index 80309f7eb4e33..be28199b3636a 100644 --- a/core/java/android/widget/Toolbar.java +++ b/core/java/android/widget/Toolbar.java @@ -155,6 +155,7 @@ public class Toolbar extends ViewGroup { private ActionMenuPresenter mOuterActionMenuPresenter; private ExpandedActionViewMenuPresenter mExpandedMenuPresenter; private MenuPresenter.Callback mActionMenuPresenterCallback; + private MenuBuilder.Callback mMenuBuilderCallback; private boolean mCollapsible; @@ -827,7 +828,7 @@ public class Toolbar extends ViewGroup { mMenuView = new ActionMenuView(getContext()); mMenuView.setPopupTheme(mPopupTheme); mMenuView.setOnMenuItemClickListener(mMenuViewItemClickListener); - mMenuView.setActionMenuPresenterCallback(mActionMenuPresenterCallback); + mMenuView.setMenuCallbacks(mActionMenuPresenterCallback, mMenuBuilderCallback); final LayoutParams lp = generateDefaultLayoutParams(); lp.gravity = Gravity.END | (mButtonGravity & Gravity.VERTICAL_GRAVITY_MASK); mMenuView.setLayoutParams(lp); @@ -1684,8 +1685,9 @@ public class Toolbar extends ViewGroup { * Must be called before the menu is accessed * @hide */ - public void setActionMenuPresenterCallback(MenuPresenter.Callback cb) { - mActionMenuPresenterCallback = cb; + public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) { + mActionMenuPresenterCallback = pcb; + mMenuBuilderCallback = mcb; } /** diff --git a/core/java/com/android/internal/app/ToolbarActionBar.java b/core/java/com/android/internal/app/ToolbarActionBar.java index 3b024e92bf3e6..99c87eabf5a03 100644 --- a/core/java/com/android/internal/app/ToolbarActionBar.java +++ b/core/java/com/android/internal/app/ToolbarActionBar.java @@ -456,7 +456,7 @@ public class ToolbarActionBar extends ActionBar { void populateOptionsMenu() { if (!mMenuCallbackSet) { - mToolbar.setActionMenuPresenterCallback(new ActionMenuPresenterCallback()); + mToolbar.setMenuCallbacks(new ActionMenuPresenterCallback(), new MenuBuilderCallback()); mMenuCallbackSet = true; } final Menu menu = mToolbar.getMenu(); @@ -547,4 +547,24 @@ public class ToolbarActionBar extends ActionBar { mClosingActionMenu = false; } } + + private final class MenuBuilderCallback implements MenuBuilder.Callback { + + @Override + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + return false; + } + + @Override + public void onMenuModeChange(MenuBuilder menu) { + if (mWindowCallback != null) { + if (mToolbar.isOverflowMenuShowing()) { + mWindowCallback.onPanelClosed(Window.FEATURE_ACTION_BAR, menu); + } else if (mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, + null, menu)) { + mWindowCallback.onMenuOpened(Window.FEATURE_ACTION_BAR, menu); + } + } + } + } }