ActionMenuPresenter.java revision 07a07ce59efb770e9fb9ca53a0133e5e64a63bbc
1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/* 2bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Copyright (C) 2011 The Android Open Source Project 3bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 4bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * you may not use this file except in compliance with the License. 6bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * You may obtain a copy of the License at 7bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 8bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * http://www.apache.org/licenses/LICENSE-2.0 9bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 10bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Unless required by applicable law or agreed to in writing, software 11bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * See the License for the specific language governing permissions and 14bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * limitations under the License. 15bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 16bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 17da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownpackage android.support.v7.internal.view.menu; 18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 19bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context; 20176a17e30644b1d5a4206cc462268d151e43949bChris Banesimport android.content.DialogInterface; 21bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.Configuration; 22bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.Resources; 23bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.os.Parcel; 24bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.os.Parcelable; 25da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.appcompat.R; 26da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.view.ActionBarPolicy; 2730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.support.v4.view.ActionProvider; 28da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.view.menu.ActionMenuView.ActionMenuChildView; 29bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.util.SparseBooleanArray; 3030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem; 31bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.SoundEffectConstants; 32bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View; 33bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View.MeasureSpec; 34bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.ViewGroup; 35bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.widget.ImageButton; 36bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 37bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport java.util.ArrayList; 38bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 39bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/** 40bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * MenuPresenter for building action menus as seen in the action bar and action modes. 41bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 42bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellpublic class ActionMenuPresenter extends BaseMenuPresenter 4320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns implements ActionProvider.SubUiVisibilityListener { 44bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private static final String TAG = "ActionMenuPresenter"; 46bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private View mOverflowButton; 4820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mReserveOverflow; 4920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mReserveOverflowSet; 5020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private int mWidthLimit; 5120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private int mActionItemWidthLimit; 5220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private int mMaxItems; 5320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mMaxItemsSet; 5420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mStrictWidthLimit; 5520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mWidthLimitSet; 5620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mExpandedActionViewsExclusive; 57bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 5820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private int mMinCellSize; 59bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 6020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Group IDs that have been added as actions - used temporarily, allocated here for reuse. 6120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private final SparseBooleanArray mActionButtonGroups = new SparseBooleanArray(); 62bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 6320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private View mScrapActionButtonView; 64bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 6520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private OverflowPopup mOverflowPopup; 6620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private ActionButtonSubmenu mActionButtonPopup; 67bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 6820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private OpenOverflowRunnable mPostedOpenRunnable; 69bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 7020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback(); 7120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int mOpenSubMenuId; 72bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 7320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public ActionMenuPresenter(Context context) { 74ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes super(context, R.layout.abc_action_menu_layout, R.layout.abc_action_menu_item_layout); 75bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 76bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 7720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 7820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void initForMenu(Context context, MenuBuilder menu) { 7920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.initForMenu(context, menu); 80bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 8120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final Resources res = context.getResources(); 82bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 8320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ActionBarPolicy abp = ActionBarPolicy.get(context); 8420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!mReserveOverflowSet) { 8520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mReserveOverflow = abp.showsOverflowMenuButton(); 8620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 87bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 8820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!mWidthLimitSet) { 8920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mWidthLimit = abp.getEmbeddedMenuWidthLimit(); 9020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 91bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 9220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Measure for initial configuration 9320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!mMaxItemsSet) { 9420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMaxItems = abp.getMaxActionButtons(); 9520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 96bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 9720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int width = mWidthLimit; 9820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mReserveOverflow) { 9920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mOverflowButton == null) { 10020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowButton = new OverflowMenuButton(mSystemContext); 10120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 10220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowButton.measure(spec, spec); 10320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 10420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns width -= mOverflowButton.getMeasuredWidth(); 10520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 10620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowButton = null; 10720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 108bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 10920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionItemWidthLimit = width; 110bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 11120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMinCellSize = (int) (ActionMenuView.MIN_CELL_SIZE * res.getDisplayMetrics().density); 112bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 11320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Drop a scrap view as it may no longer reflect the proper context/config. 11420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mScrapActionButtonView = null; 115bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 11620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 11720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onConfigurationChanged(Configuration newConfig) { 11820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!mMaxItemsSet) { 11920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMaxItems = mContext.getResources().getInteger( 12007a07ce59efb770e9fb9ca53a0133e5e64a63bbcChris Banes R.integer.abc_max_action_buttons); 121bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 12220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mMenu != null) { 123d900fe072335d488f883585e3f686ef955d1ccc9Chris Banes mMenu.onItemsChanged(true); 124bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 12520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 126bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 12720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setWidthLimit(int width, boolean strict) { 12820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mWidthLimit = width; 12920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mStrictWidthLimit = strict; 13020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mWidthLimitSet = true; 131bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 132bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 13320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setReserveOverflow(boolean reserveOverflow) { 13420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mReserveOverflow = reserveOverflow; 13520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mReserveOverflowSet = true; 13620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 137bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 13820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setItemLimit(int itemCount) { 13920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMaxItems = itemCount; 14020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMaxItemsSet = true; 14120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 142bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 14320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setExpandedActionViewsExclusive(boolean isExclusive) { 14420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mExpandedActionViewsExclusive = isExclusive; 145bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 146bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 14720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 14820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public MenuView getMenuView(ViewGroup root) { 14920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuView result = super.getMenuView(root); 15020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((ActionMenuView) result).setPresenter(this); 15120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return result; 152bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 153bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 15420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 15520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) { 15620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns View actionView = item.getActionView(); 15720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (actionView == null || item.hasCollapsibleActionView()) { 15820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!(convertView instanceof ActionMenuItemView)) { 15920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns convertView = null; 16020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 16120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns actionView = super.getItemView(item, convertView, parent); 16220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 16320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns actionView.setVisibility(item.isActionViewExpanded() ? View.GONE : View.VISIBLE); 164bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 16520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ActionMenuView menuParent = (ActionMenuView) parent; 16620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ViewGroup.LayoutParams lp = actionView.getLayoutParams(); 16720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!menuParent.checkLayoutParams(lp)) { 16820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns actionView.setLayoutParams(menuParent.generateLayoutParams(lp)); 16920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 17020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return actionView; 171bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 172bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 17320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 17420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void bindItemView(MenuItemImpl item, MenuView.ItemView itemView) { 17520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns itemView.initialize(item, 0); 17620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 17720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ActionMenuView menuView = (ActionMenuView) mMenuView; 17820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ActionMenuItemView actionItemView = (ActionMenuItemView) itemView; 17981173a86853974bb27d4197a0f0768922f8205caTrevor Johns actionItemView.setItemInvoker(menuView); 180bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 181bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 182bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 18320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean shouldIncludeItem(int childIndex, MenuItemImpl item) { 18420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return item.isActionButton(); 185bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 186bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 187bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 18820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void updateMenuView(boolean cleared) { 18920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.updateMenuView(cleared); 19020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 191176a17e30644b1d5a4206cc462268d151e43949bChris Banes if (mMenuView == null) { 192176a17e30644b1d5a4206cc462268d151e43949bChris Banes return; 193176a17e30644b1d5a4206cc462268d151e43949bChris Banes } 194176a17e30644b1d5a4206cc462268d151e43949bChris Banes 19520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mMenu != null) { 19620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ArrayList<MenuItemImpl> actionItems = mMenu.getActionItems(); 19720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int count = actionItems.size(); 19820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns for (int i = 0; i < count; i++) { 19930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell final ActionProvider provider = actionItems.get(i).getSupportActionProvider(); 20020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (provider != null) { 20120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns provider.setSubUiVisibilityListener(this); 20220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 20320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 20420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 205bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 20620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ArrayList<MenuItemImpl> nonActionItems = mMenu != null ? 20720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMenu.getNonActionItems() : null; 208bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 20920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean hasOverflow = false; 21020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mReserveOverflow && nonActionItems != null) { 21120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int count = nonActionItems.size(); 21220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (count == 1) { 21320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns hasOverflow = !nonActionItems.get(0).isActionViewExpanded(); 21420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 21520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns hasOverflow = count > 0; 21620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 21720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 218bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 21920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (hasOverflow) { 22020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mOverflowButton == null) { 22120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowButton = new OverflowMenuButton(mSystemContext); 22220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 22320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ViewGroup parent = (ViewGroup) mOverflowButton.getParent(); 22420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (parent != mMenuView) { 22520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (parent != null) { 22620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns parent.removeView(mOverflowButton); 22720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 22820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ActionMenuView menuView = (ActionMenuView) mMenuView; 22920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns menuView.addView(mOverflowButton, menuView.generateOverflowButtonLayoutParams()); 23020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 23120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else if (mOverflowButton != null && mOverflowButton.getParent() == mMenuView) { 23220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((ViewGroup) mMenuView).removeView(mOverflowButton); 23320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 234bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 23520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((ActionMenuView) mMenuView).setOverflowReserved(mReserveOverflow); 236bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 237bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 238bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 23920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean filterLeftoverView(ViewGroup parent, int childIndex) { 24020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (parent.getChildAt(childIndex) == mOverflowButton) { 24120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 24220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 24320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return super.filterLeftoverView(parent, childIndex); 24420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 24520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 24620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean onSubMenuSelected(SubMenuBuilder subMenu) { 24720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!subMenu.hasVisibleItems()) { 24820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 24920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 25020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 25120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SubMenuBuilder topSubMenu = subMenu; 25220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns while (topSubMenu.getParentMenu() != mMenu) { 25320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns topSubMenu = (SubMenuBuilder) topSubMenu.getParentMenu(); 25420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 25520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns View anchor = findViewForItem(topSubMenu.getItem()); 25620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (anchor == null) { 25720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mOverflowButton == null) { 25820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 25920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 26020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns anchor = mOverflowButton; 26120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 26220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 26320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOpenSubMenuId = subMenu.getItem().getItemId(); 264176a17e30644b1d5a4206cc462268d151e43949bChris Banes mActionButtonPopup = new ActionButtonSubmenu(subMenu); 265176a17e30644b1d5a4206cc462268d151e43949bChris Banes mActionButtonPopup.show(null); 26620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onSubMenuSelected(subMenu); 267bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return true; 26820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 26920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 27020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private View findViewForItem(MenuItem item) { 27120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ViewGroup parent = (ViewGroup) mMenuView; 27220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (parent == null) { 27320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return null; 27420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 27520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 27620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int count = parent.getChildCount(); 27720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns for (int i = 0; i < count; i++) { 27820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final View child = parent.getChildAt(i); 27920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (child instanceof MenuView.ItemView && 28020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((MenuView.ItemView) child).getItemData() == item) { 28120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return child; 28220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 28320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 28420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return null; 28520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 28620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 28720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 28820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Display the overflow menu if one is present. 28920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * 29020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if the overflow menu was shown, false otherwise. 29120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 29220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean showOverflowMenu() { 29320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mReserveOverflow && !isOverflowMenuShowing() && mMenu != null && mMenuView != null && 29420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mPostedOpenRunnable == null) { 29520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns OverflowPopup popup = new OverflowPopup(mContext, mMenu, mOverflowButton, true); 29620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mPostedOpenRunnable = new OpenOverflowRunnable(popup); 29720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Post this for later; we might still need a layout for the anchor to be right. 29820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((View) mMenuView).post(mPostedOpenRunnable); 29920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 30020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // ActionMenuPresenter uses null as a callback argument here 30120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // to indicate overflow is opening. 30220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onSubMenuSelected(null); 30320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 30420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 30520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 30620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 30720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 30820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 30920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 31020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Hide the overflow menu if it is currently showing. 31120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * 31220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if the overflow menu was hidden, false otherwise. 31320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 31420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean hideOverflowMenu() { 31520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mPostedOpenRunnable != null && mMenuView != null) { 31620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((View) mMenuView).removeCallbacks(mPostedOpenRunnable); 31720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mPostedOpenRunnable = null; 31820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 31920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 32020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 32120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuPopupHelper popup = mOverflowPopup; 32220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (popup != null) { 32320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns popup.dismiss(); 32420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 32520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 32620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 32720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 32820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 32920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 33020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Dismiss all popup menus - overflow and submenus. 33120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * 33220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if popups were dismissed, false otherwise. (This can be because none were open.) 33320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 33420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean dismissPopupMenus() { 33520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean result = hideOverflowMenu(); 33620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns result |= hideSubMenus(); 33720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return result; 33820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 33920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 34020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 34120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Dismiss all submenu popups. 34220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * 34320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if popups were dismissed, false otherwise. (This can be because none were open.) 34420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 34520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean hideSubMenus() { 34620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionButtonPopup != null) { 34720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionButtonPopup.dismiss(); 34820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 34920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 35020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 35120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 35220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 35320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 35420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if the overflow menu is currently showing 35520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 35620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean isOverflowMenuShowing() { 35720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mOverflowPopup != null && mOverflowPopup.isShowing(); 35820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 35920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 36020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 36120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if space has been reserved in the action menu for an overflow item. 36220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 36320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean isOverflowReserved() { 36420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mReserveOverflow; 36520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 36620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 36720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean flagActionItems() { 36820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ArrayList<MenuItemImpl> visibleItems = mMenu.getVisibleItems(); 36920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int itemsSize = visibleItems.size(); 37020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int maxActions = mMaxItems; 37120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int widthLimit = mActionItemWidthLimit; 37220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int querySpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 37320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ViewGroup parent = (ViewGroup) mMenuView; 37420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 37520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int requiredItems = 0; 37620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int requestedItems = 0; 37720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int firstActionWidth = 0; 37820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean hasOverflow = false; 37920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns for (int i = 0; i < itemsSize; i++) { 38020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuItemImpl item = visibleItems.get(i); 38120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (item.requiresActionButton()) { 38220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns requiredItems++; 38320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else if (item.requestsActionButton()) { 38420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns requestedItems++; 38520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 38620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns hasOverflow = true; 38720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 38820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mExpandedActionViewsExclusive && item.isActionViewExpanded()) { 38920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Overflow everything if we have an expanded action view and we're 39020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // space constrained. 39120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns maxActions = 0; 39220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 39320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 39420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 39520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Reserve a spot for the overflow item if needed. 39620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mReserveOverflow && 39720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns (hasOverflow || requiredItems + requestedItems > maxActions)) { 39820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns maxActions--; 39920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 40020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns maxActions -= requiredItems; 401bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 40220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final SparseBooleanArray seenGroups = mActionButtonGroups; 40320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns seenGroups.clear(); 40420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 40520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int cellSize = 0; 40620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int cellsRemaining = 0; 40720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mStrictWidthLimit) { 40820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellsRemaining = widthLimit / mMinCellSize; 40920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int cellSizeRemaining = widthLimit % mMinCellSize; 41020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellSize = mMinCellSize + cellSizeRemaining / cellsRemaining; 41120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 41220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 41320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Flag as many more requested items as will fit. 41420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns for (int i = 0; i < itemsSize; i++) { 41520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuItemImpl item = visibleItems.get(i); 41620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 41720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (item.requiresActionButton()) { 41820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns View v = getItemView(item, mScrapActionButtonView, parent); 41920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mScrapActionButtonView == null) { 42020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mScrapActionButtonView = v; 42120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 42220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mStrictWidthLimit) { 42320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellsRemaining -= ActionMenuView.measureChildForCells(v, 42420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellSize, cellsRemaining, querySpec, 0); 42520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 42620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns v.measure(querySpec, querySpec); 42720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 42820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int measuredWidth = v.getMeasuredWidth(); 42920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns widthLimit -= measuredWidth; 43020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (firstActionWidth == 0) { 43120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns firstActionWidth = measuredWidth; 43220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 43320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int groupId = item.getGroupId(); 43420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (groupId != 0) { 43520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns seenGroups.put(groupId, true); 43620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 43720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns item.setIsActionButton(true); 43820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else if (item.requestsActionButton()) { 43920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Items in a group with other items that already have an action slot 44020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // can break the max actions rule, but not the width limit. 44120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int groupId = item.getGroupId(); 44220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final boolean inGroup = seenGroups.get(groupId); 44320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean isAction = (maxActions > 0 || inGroup) && widthLimit > 0 && 44420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns (!mStrictWidthLimit || cellsRemaining > 0); 44520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 44620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (isAction) { 44720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns View v = getItemView(item, mScrapActionButtonView, parent); 44820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mScrapActionButtonView == null) { 44920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mScrapActionButtonView = v; 45020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 45120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mStrictWidthLimit) { 45220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int cells = ActionMenuView.measureChildForCells(v, 45320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellSize, cellsRemaining, querySpec, 0); 45420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellsRemaining -= cells; 45520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (cells == 0) { 45620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns isAction = false; 45720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 45820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 45920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns v.measure(querySpec, querySpec); 46020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 46120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int measuredWidth = v.getMeasuredWidth(); 46220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns widthLimit -= measuredWidth; 46320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (firstActionWidth == 0) { 46420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns firstActionWidth = measuredWidth; 46520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 46620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 46720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mStrictWidthLimit) { 46820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns isAction &= widthLimit >= 0; 46920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 47020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Did this push the entire first item past the limit? 47120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns isAction &= widthLimit + firstActionWidth > 0; 47220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 47320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 47420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 47520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (isAction && groupId != 0) { 47620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns seenGroups.put(groupId, true); 47720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else if (inGroup) { 47820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // We broke the width limit. Demote the whole group, they all overflow now. 47920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns seenGroups.put(groupId, false); 48020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns for (int j = 0; j < i; j++) { 48120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuItemImpl areYouMyGroupie = visibleItems.get(j); 48220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (areYouMyGroupie.getGroupId() == groupId) { 48320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Give back the action slot 48420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (areYouMyGroupie.isActionButton()) { 48520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns maxActions++; 48620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 48720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns areYouMyGroupie.setIsActionButton(false); 48820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 48920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 49020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 49120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 49220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (isAction) { 49320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns maxActions--; 49420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 49520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 49620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns item.setIsActionButton(isAction); 49720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 49820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 49920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 500bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 501bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 50220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 50320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 50420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns dismissPopupMenus(); 50520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onCloseMenu(menu, allMenusAreClosing); 506bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 507bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 50820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 50920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public Parcelable onSaveInstanceState() { 51020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SavedState state = new SavedState(); 51120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns state.openSubMenuId = mOpenSubMenuId; 51220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return state; 513bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 514bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 51520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 51620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onRestoreInstanceState(Parcelable state) { 51720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SavedState saved = (SavedState) state; 51820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (saved.openSubMenuId > 0) { 51920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuItem item = mMenu.findItem(saved.openSubMenuId); 52020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (item != null) { 52120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); 52220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns onSubMenuSelected(subMenu); 52320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 52420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 525bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 526bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 527bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 52820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onSubUiVisibilityChanged(boolean isVisible) { 52920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (isVisible) { 53020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Not a submenu, but treat it like one. 53120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onSubMenuSelected(null); 53220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 53320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMenu.close(false); 53420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 535bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 536bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 53720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private static class SavedState implements Parcelable { 538bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 53920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int openSubMenuId; 540bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 54120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SavedState() { 54220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 543bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 54420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SavedState(Parcel in) { 54520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns openSubMenuId = in.readInt(); 54620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 54720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 54820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 54920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int describeContents() { 55020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return 0; 55120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 552bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 55320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 55420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void writeToParcel(Parcel dest, int flags) { 55520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns dest.writeInt(openSubMenuId); 556bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 55720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 55820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public static final Parcelable.Creator<SavedState> CREATOR 55920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns = new Parcelable.Creator<SavedState>() { 56020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public SavedState createFromParcel(Parcel in) { 56120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return new SavedState(in); 56220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 56320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 56420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public SavedState[] newArray(int size) { 56520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return new SavedState[size]; 56620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 56720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns }; 568bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 569bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 57020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private class OverflowMenuButton extends ImageButton implements ActionMenuChildView { 57120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 57220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public OverflowMenuButton(Context context) { 57320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super(context, null, R.attr.actionOverflowButtonStyle); 57420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 57520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setClickable(true); 57620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setFocusable(true); 57720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setVisibility(VISIBLE); 57820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setEnabled(true); 57920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 58020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 58120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 58220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean performClick() { 58320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (super.performClick()) { 58420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 58520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 58620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 58720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns playSoundEffect(SoundEffectConstants.CLICK); 58820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns showOverflowMenu(); 58920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 59020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 59120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 59220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean needsDividerBefore() { 59320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 59420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 59520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 59620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean needsDividerAfter() { 59720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 59820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 599bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 600bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 60120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private class OverflowPopup extends MenuPopupHelper { 602bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 60320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public OverflowPopup(Context context, MenuBuilder menu, View anchorView, 60420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean overflowOnly) { 60520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super(context, menu, anchorView, overflowOnly); 60620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setCallback(mPopupPresenterCallback); 60720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 608bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 60920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 61020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onDismiss() { 61120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onDismiss(); 61220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMenu.close(); 61320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowPopup = null; 61420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 615bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 616bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 617176a17e30644b1d5a4206cc462268d151e43949bChris Banes private class ActionButtonSubmenu extends MenuDialogHelper { 61820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 619176a17e30644b1d5a4206cc462268d151e43949bChris Banes public ActionButtonSubmenu(SubMenuBuilder subMenu) { 620176a17e30644b1d5a4206cc462268d151e43949bChris Banes super(subMenu); 62120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setCallback(mPopupPresenterCallback); 62220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 62320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 62420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 625176a17e30644b1d5a4206cc462268d151e43949bChris Banes public void onDismiss(DialogInterface dialog) { 626176a17e30644b1d5a4206cc462268d151e43949bChris Banes super.onDismiss(dialog); 62720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionButtonPopup = null; 62820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOpenSubMenuId = 0; 62920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 630bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 631bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 63220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private class PopupPresenterCallback implements MenuPresenter.Callback { 63320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 63420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 63520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean onOpenSubMenu(MenuBuilder subMenu) { 63620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (subMenu == null) { 63720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 63820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 63920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 64020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); 64120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 64220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 643bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 64420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 64520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 64620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (menu instanceof SubMenuBuilder) { 64720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((SubMenuBuilder) menu).getRootMenu().close(false); 64820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 64920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 650bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 651bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 65220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private class OpenOverflowRunnable implements Runnable { 65320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 65420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private OverflowPopup mPopup; 65520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 65620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public OpenOverflowRunnable(OverflowPopup popup) { 65720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mPopup = popup; 65820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 65920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 66020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void run() { 66120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMenu.changeMenuMode(); 66220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final View menuView = (View) mMenuView; 66320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (menuView != null && menuView.getWindowToken() != null && mPopup.tryShow()) { 66420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowPopup = mPopup; 66520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 66620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mPostedOpenRunnable = null; 66720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 668bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 669bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell} 670