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. 4189208232f3b5d1451408d787872504a190bc7ee0Chris Banes * 4289208232f3b5d1451408d787872504a190bc7ee0Chris Banes * @hide 43bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 44bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellpublic class ActionMenuPresenter extends BaseMenuPresenter 4520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns implements ActionProvider.SubUiVisibilityListener { 46bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private static final String TAG = "ActionMenuPresenter"; 48bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private View mOverflowButton; 5020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mReserveOverflow; 5120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mReserveOverflowSet; 5220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private int mWidthLimit; 5320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private int mActionItemWidthLimit; 5420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private int mMaxItems; 5520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mMaxItemsSet; 5620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mStrictWidthLimit; 5720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mWidthLimitSet; 5820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mExpandedActionViewsExclusive; 59bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 6020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private int mMinCellSize; 61bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 6220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Group IDs that have been added as actions - used temporarily, allocated here for reuse. 6320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private final SparseBooleanArray mActionButtonGroups = new SparseBooleanArray(); 64bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 6520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private View mScrapActionButtonView; 66bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 6720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private OverflowPopup mOverflowPopup; 6820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private ActionButtonSubmenu mActionButtonPopup; 69bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 7020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private OpenOverflowRunnable mPostedOpenRunnable; 71bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 7220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback(); 7320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int mOpenSubMenuId; 74bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 7520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public ActionMenuPresenter(Context context) { 76ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes super(context, R.layout.abc_action_menu_layout, R.layout.abc_action_menu_item_layout); 77bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 78bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 7920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 8020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void initForMenu(Context context, MenuBuilder menu) { 8120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.initForMenu(context, menu); 82bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 8320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final Resources res = context.getResources(); 84bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 8520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ActionBarPolicy abp = ActionBarPolicy.get(context); 8620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!mReserveOverflowSet) { 8720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mReserveOverflow = abp.showsOverflowMenuButton(); 8820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 89bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 9020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!mWidthLimitSet) { 9120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mWidthLimit = abp.getEmbeddedMenuWidthLimit(); 9220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 93bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 9420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Measure for initial configuration 9520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!mMaxItemsSet) { 9620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMaxItems = abp.getMaxActionButtons(); 9720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 98bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 9920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int width = mWidthLimit; 10020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mReserveOverflow) { 10120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mOverflowButton == null) { 10220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowButton = new OverflowMenuButton(mSystemContext); 10320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 10420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowButton.measure(spec, spec); 10520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 10620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns width -= mOverflowButton.getMeasuredWidth(); 10720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 10820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowButton = null; 10920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 110bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 11120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionItemWidthLimit = width; 112bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 11320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMinCellSize = (int) (ActionMenuView.MIN_CELL_SIZE * res.getDisplayMetrics().density); 114bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 11520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Drop a scrap view as it may no longer reflect the proper context/config. 11620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mScrapActionButtonView = null; 117bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 11820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 11920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onConfigurationChanged(Configuration newConfig) { 12020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!mMaxItemsSet) { 12120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMaxItems = mContext.getResources().getInteger( 12207a07ce59efb770e9fb9ca53a0133e5e64a63bbcChris Banes R.integer.abc_max_action_buttons); 123bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 12420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mMenu != null) { 125d900fe072335d488f883585e3f686ef955d1ccc9Chris Banes mMenu.onItemsChanged(true); 126bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 12720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 128bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 12920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setWidthLimit(int width, boolean strict) { 13020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mWidthLimit = width; 13120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mStrictWidthLimit = strict; 13220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mWidthLimitSet = true; 133bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 134bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 13520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setReserveOverflow(boolean reserveOverflow) { 13620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mReserveOverflow = reserveOverflow; 13720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mReserveOverflowSet = true; 13820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 139bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 14020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setItemLimit(int itemCount) { 14120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMaxItems = itemCount; 14220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMaxItemsSet = true; 14320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 144bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 14520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setExpandedActionViewsExclusive(boolean isExclusive) { 14620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mExpandedActionViewsExclusive = isExclusive; 147bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 148bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 14920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 15020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public MenuView getMenuView(ViewGroup root) { 15120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuView result = super.getMenuView(root); 15220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((ActionMenuView) result).setPresenter(this); 15320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return result; 154bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 155bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 15620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 15720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) { 15820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns View actionView = item.getActionView(); 15920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (actionView == null || item.hasCollapsibleActionView()) { 16020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!(convertView instanceof ActionMenuItemView)) { 16120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns convertView = null; 16220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 16320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns actionView = super.getItemView(item, convertView, parent); 16420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 16520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns actionView.setVisibility(item.isActionViewExpanded() ? View.GONE : View.VISIBLE); 166bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 16720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ActionMenuView menuParent = (ActionMenuView) parent; 16820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ViewGroup.LayoutParams lp = actionView.getLayoutParams(); 16920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!menuParent.checkLayoutParams(lp)) { 17020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns actionView.setLayoutParams(menuParent.generateLayoutParams(lp)); 17120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 17220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return actionView; 173bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 174bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 17520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 17620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void bindItemView(MenuItemImpl item, MenuView.ItemView itemView) { 17720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns itemView.initialize(item, 0); 17820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 17920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ActionMenuView menuView = (ActionMenuView) mMenuView; 18020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ActionMenuItemView actionItemView = (ActionMenuItemView) itemView; 18181173a86853974bb27d4197a0f0768922f8205caTrevor Johns actionItemView.setItemInvoker(menuView); 182bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 183bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 184bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 18520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean shouldIncludeItem(int childIndex, MenuItemImpl item) { 18620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return item.isActionButton(); 187bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 188bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 189bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 19020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void updateMenuView(boolean cleared) { 19120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.updateMenuView(cleared); 19220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 193176a17e30644b1d5a4206cc462268d151e43949bChris Banes if (mMenuView == null) { 194176a17e30644b1d5a4206cc462268d151e43949bChris Banes return; 195176a17e30644b1d5a4206cc462268d151e43949bChris Banes } 196176a17e30644b1d5a4206cc462268d151e43949bChris Banes 19720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mMenu != null) { 19820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ArrayList<MenuItemImpl> actionItems = mMenu.getActionItems(); 19920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int count = actionItems.size(); 20020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns for (int i = 0; i < count; i++) { 20130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell final ActionProvider provider = actionItems.get(i).getSupportActionProvider(); 20220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (provider != null) { 20320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns provider.setSubUiVisibilityListener(this); 20420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 20520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 20620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 207bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 20820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ArrayList<MenuItemImpl> nonActionItems = mMenu != null ? 20920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMenu.getNonActionItems() : null; 210bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 21120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean hasOverflow = false; 21220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mReserveOverflow && nonActionItems != null) { 21320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int count = nonActionItems.size(); 21420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (count == 1) { 21520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns hasOverflow = !nonActionItems.get(0).isActionViewExpanded(); 21620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 21720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns hasOverflow = count > 0; 21820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 21920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 220bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 22120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (hasOverflow) { 22220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mOverflowButton == null) { 22320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowButton = new OverflowMenuButton(mSystemContext); 22420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 22520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ViewGroup parent = (ViewGroup) mOverflowButton.getParent(); 22620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (parent != mMenuView) { 22720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (parent != null) { 22820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns parent.removeView(mOverflowButton); 22920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 23020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ActionMenuView menuView = (ActionMenuView) mMenuView; 23120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns menuView.addView(mOverflowButton, menuView.generateOverflowButtonLayoutParams()); 23220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 23320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else if (mOverflowButton != null && mOverflowButton.getParent() == mMenuView) { 23420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((ViewGroup) mMenuView).removeView(mOverflowButton); 23520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 236bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 23720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((ActionMenuView) mMenuView).setOverflowReserved(mReserveOverflow); 238bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 239bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 240bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 24120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean filterLeftoverView(ViewGroup parent, int childIndex) { 24220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (parent.getChildAt(childIndex) == mOverflowButton) { 24320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 24420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 24520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return super.filterLeftoverView(parent, childIndex); 24620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 24720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 24820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean onSubMenuSelected(SubMenuBuilder subMenu) { 24920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!subMenu.hasVisibleItems()) { 25020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 25120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 25220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 25320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SubMenuBuilder topSubMenu = subMenu; 25420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns while (topSubMenu.getParentMenu() != mMenu) { 25520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns topSubMenu = (SubMenuBuilder) topSubMenu.getParentMenu(); 25620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 25720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns View anchor = findViewForItem(topSubMenu.getItem()); 25820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (anchor == null) { 25920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mOverflowButton == null) { 26020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 26120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 26220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns anchor = mOverflowButton; 26320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 26420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 26520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOpenSubMenuId = subMenu.getItem().getItemId(); 266176a17e30644b1d5a4206cc462268d151e43949bChris Banes mActionButtonPopup = new ActionButtonSubmenu(subMenu); 267176a17e30644b1d5a4206cc462268d151e43949bChris Banes mActionButtonPopup.show(null); 26820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onSubMenuSelected(subMenu); 269bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return true; 27020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 27120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 27220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private View findViewForItem(MenuItem item) { 27320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ViewGroup parent = (ViewGroup) mMenuView; 27420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (parent == null) { 27520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return null; 27620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 27720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 27820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int count = parent.getChildCount(); 27920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns for (int i = 0; i < count; i++) { 28020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final View child = parent.getChildAt(i); 28120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (child instanceof MenuView.ItemView && 28220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((MenuView.ItemView) child).getItemData() == item) { 28320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return child; 28420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 28520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 28620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return null; 28720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 28820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 28920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 29020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Display the overflow menu if one is present. 29120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * 29220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if the overflow menu was shown, false otherwise. 29320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 29420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean showOverflowMenu() { 29520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mReserveOverflow && !isOverflowMenuShowing() && mMenu != null && mMenuView != null && 29620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mPostedOpenRunnable == null) { 29720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns OverflowPopup popup = new OverflowPopup(mContext, mMenu, mOverflowButton, true); 29820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mPostedOpenRunnable = new OpenOverflowRunnable(popup); 29920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Post this for later; we might still need a layout for the anchor to be right. 30020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((View) mMenuView).post(mPostedOpenRunnable); 30120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 30220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // ActionMenuPresenter uses null as a callback argument here 30320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // to indicate overflow is opening. 30420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onSubMenuSelected(null); 30520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 30620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 30720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 30820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 30920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 31020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 31120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 31220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Hide the overflow menu if it is currently showing. 31320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * 31420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if the overflow menu was hidden, false otherwise. 31520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 31620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean hideOverflowMenu() { 31720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mPostedOpenRunnable != null && mMenuView != null) { 31820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((View) mMenuView).removeCallbacks(mPostedOpenRunnable); 31920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mPostedOpenRunnable = null; 32020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 32120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 32220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 32320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuPopupHelper popup = mOverflowPopup; 32420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (popup != null) { 32520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns popup.dismiss(); 32620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 32720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 32820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 32920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 33020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 33120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 33220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Dismiss all popup menus - overflow and submenus. 33320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * 33420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if popups were dismissed, false otherwise. (This can be because none were open.) 33520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 33620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean dismissPopupMenus() { 33720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean result = hideOverflowMenu(); 33820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns result |= hideSubMenus(); 33920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return result; 34020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 34120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 34220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 34320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Dismiss all submenu popups. 34420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * 34520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if popups were dismissed, false otherwise. (This can be because none were open.) 34620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 34720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean hideSubMenus() { 34820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionButtonPopup != null) { 34920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionButtonPopup.dismiss(); 35020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 35120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 35220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 35320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 35420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 35520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 35620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if the overflow menu is currently showing 35720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 35820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean isOverflowMenuShowing() { 35920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mOverflowPopup != null && mOverflowPopup.isShowing(); 36020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 36120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 36220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 36320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return true if space has been reserved in the action menu for an overflow item. 36420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 36520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean isOverflowReserved() { 36620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mReserveOverflow; 36720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 36820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 36920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean flagActionItems() { 37020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ArrayList<MenuItemImpl> visibleItems = mMenu.getVisibleItems(); 37120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int itemsSize = visibleItems.size(); 37220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int maxActions = mMaxItems; 37320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int widthLimit = mActionItemWidthLimit; 37420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int querySpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 37520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ViewGroup parent = (ViewGroup) mMenuView; 37620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 37720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int requiredItems = 0; 37820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int requestedItems = 0; 37920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int firstActionWidth = 0; 38020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean hasOverflow = false; 38120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns for (int i = 0; i < itemsSize; i++) { 38220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuItemImpl item = visibleItems.get(i); 38320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (item.requiresActionButton()) { 38420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns requiredItems++; 38520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else if (item.requestsActionButton()) { 38620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns requestedItems++; 38720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 38820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns hasOverflow = true; 38920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 39020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mExpandedActionViewsExclusive && item.isActionViewExpanded()) { 39120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Overflow everything if we have an expanded action view and we're 39220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // space constrained. 39320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns maxActions = 0; 39420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 39520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 39620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 39720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Reserve a spot for the overflow item if needed. 39820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mReserveOverflow && 39920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns (hasOverflow || requiredItems + requestedItems > maxActions)) { 40020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns maxActions--; 40120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 40220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns maxActions -= requiredItems; 403bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 40420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final SparseBooleanArray seenGroups = mActionButtonGroups; 40520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns seenGroups.clear(); 40620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 40720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int cellSize = 0; 40820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int cellsRemaining = 0; 40920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mStrictWidthLimit) { 41020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellsRemaining = widthLimit / mMinCellSize; 41120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int cellSizeRemaining = widthLimit % mMinCellSize; 41220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellSize = mMinCellSize + cellSizeRemaining / cellsRemaining; 41320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 41420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 41520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Flag as many more requested items as will fit. 41620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns for (int i = 0; i < itemsSize; i++) { 41720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuItemImpl item = visibleItems.get(i); 41820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 41920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (item.requiresActionButton()) { 42020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns View v = getItemView(item, mScrapActionButtonView, parent); 42120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mScrapActionButtonView == null) { 42220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mScrapActionButtonView = v; 42320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 42420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mStrictWidthLimit) { 42520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellsRemaining -= ActionMenuView.measureChildForCells(v, 42620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellSize, cellsRemaining, querySpec, 0); 42720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 42820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns v.measure(querySpec, querySpec); 42920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 43020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int measuredWidth = v.getMeasuredWidth(); 43120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns widthLimit -= measuredWidth; 43220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (firstActionWidth == 0) { 43320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns firstActionWidth = measuredWidth; 43420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 43520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int groupId = item.getGroupId(); 43620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (groupId != 0) { 43720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns seenGroups.put(groupId, true); 43820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 43920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns item.setIsActionButton(true); 44020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else if (item.requestsActionButton()) { 44120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Items in a group with other items that already have an action slot 44220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // can break the max actions rule, but not the width limit. 44320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int groupId = item.getGroupId(); 44420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final boolean inGroup = seenGroups.get(groupId); 44520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean isAction = (maxActions > 0 || inGroup) && widthLimit > 0 && 44620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns (!mStrictWidthLimit || cellsRemaining > 0); 44720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 44820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (isAction) { 44920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns View v = getItemView(item, mScrapActionButtonView, parent); 45020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mScrapActionButtonView == null) { 45120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mScrapActionButtonView = v; 45220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 45320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mStrictWidthLimit) { 45420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int cells = ActionMenuView.measureChildForCells(v, 45520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellSize, cellsRemaining, querySpec, 0); 45620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns cellsRemaining -= cells; 45720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (cells == 0) { 45820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns isAction = false; 45920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 46020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 46120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns v.measure(querySpec, querySpec); 46220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 46320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int measuredWidth = v.getMeasuredWidth(); 46420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns widthLimit -= measuredWidth; 46520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (firstActionWidth == 0) { 46620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns firstActionWidth = measuredWidth; 46720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 46820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 46920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mStrictWidthLimit) { 47020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns isAction &= widthLimit >= 0; 47120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 47220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Did this push the entire first item past the limit? 47320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns isAction &= widthLimit + firstActionWidth > 0; 47420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 47520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 47620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 47720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (isAction && groupId != 0) { 47820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns seenGroups.put(groupId, true); 47920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else if (inGroup) { 48020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // We broke the width limit. Demote the whole group, they all overflow now. 48120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns seenGroups.put(groupId, false); 48220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns for (int j = 0; j < i; j++) { 48320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuItemImpl areYouMyGroupie = visibleItems.get(j); 48420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (areYouMyGroupie.getGroupId() == groupId) { 48520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Give back the action slot 48620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (areYouMyGroupie.isActionButton()) { 48720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns maxActions++; 48820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 48920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns areYouMyGroupie.setIsActionButton(false); 49020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 49120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 49220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 49320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 49420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (isAction) { 49520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns maxActions--; 49620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 49720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 49820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns item.setIsActionButton(isAction); 49920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 50020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 50120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 502bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 503bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 50420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 50520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 50620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns dismissPopupMenus(); 50720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onCloseMenu(menu, allMenusAreClosing); 508bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 509bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 51020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 51120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public Parcelable onSaveInstanceState() { 51220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SavedState state = new SavedState(); 51320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns state.openSubMenuId = mOpenSubMenuId; 51420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return state; 515bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 516bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 51720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 51820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onRestoreInstanceState(Parcelable state) { 51920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SavedState saved = (SavedState) state; 52020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (saved.openSubMenuId > 0) { 52120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns MenuItem item = mMenu.findItem(saved.openSubMenuId); 52220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (item != null) { 52320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); 52420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns onSubMenuSelected(subMenu); 52520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 52620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 527bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 528bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 529bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 53020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onSubUiVisibilityChanged(boolean isVisible) { 53120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (isVisible) { 53220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Not a submenu, but treat it like one. 53320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onSubMenuSelected(null); 53420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 53520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMenu.close(false); 53620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 537bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 538bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 53920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private static class SavedState implements Parcelable { 540bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 54120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int openSubMenuId; 542bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 54320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SavedState() { 54420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 545bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 54620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns SavedState(Parcel in) { 54720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns openSubMenuId = in.readInt(); 54820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 54920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 55020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 55120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int describeContents() { 55220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return 0; 55320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 554bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 55520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 55620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void writeToParcel(Parcel dest, int flags) { 55720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns dest.writeInt(openSubMenuId); 558bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 55920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 56020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public static final Parcelable.Creator<SavedState> CREATOR 56120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns = new Parcelable.Creator<SavedState>() { 56220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public SavedState createFromParcel(Parcel in) { 56320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return new SavedState(in); 56420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 56520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 56620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public SavedState[] newArray(int size) { 56720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return new SavedState[size]; 56820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 56920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns }; 570bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 571bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 57220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private class OverflowMenuButton extends ImageButton implements ActionMenuChildView { 57320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 57420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public OverflowMenuButton(Context context) { 57520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super(context, null, R.attr.actionOverflowButtonStyle); 57620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 57720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setClickable(true); 57820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setFocusable(true); 57920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setVisibility(VISIBLE); 58020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setEnabled(true); 58120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 58220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 58320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 58420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean performClick() { 58520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (super.performClick()) { 58620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 58720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 58820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 58920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns playSoundEffect(SoundEffectConstants.CLICK); 59020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns showOverflowMenu(); 59120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 59220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 59320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 59420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean needsDividerBefore() { 59520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 59620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 59720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 59820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean needsDividerAfter() { 59920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 60020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 601bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 602bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 60320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private class OverflowPopup extends MenuPopupHelper { 604bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 60520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public OverflowPopup(Context context, MenuBuilder menu, View anchorView, 60620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean overflowOnly) { 60720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super(context, menu, anchorView, overflowOnly); 60820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setCallback(mPopupPresenterCallback); 60920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 610bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 61120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 61220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onDismiss() { 61320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onDismiss(); 61420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMenu.close(); 61520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowPopup = null; 61620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 617bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 618bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 619176a17e30644b1d5a4206cc462268d151e43949bChris Banes private class ActionButtonSubmenu extends MenuDialogHelper { 62020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 621176a17e30644b1d5a4206cc462268d151e43949bChris Banes public ActionButtonSubmenu(SubMenuBuilder subMenu) { 622176a17e30644b1d5a4206cc462268d151e43949bChris Banes super(subMenu); 62320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setCallback(mPopupPresenterCallback); 62420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 62520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 62620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 627176a17e30644b1d5a4206cc462268d151e43949bChris Banes public void onDismiss(DialogInterface dialog) { 628176a17e30644b1d5a4206cc462268d151e43949bChris Banes super.onDismiss(dialog); 62920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionButtonPopup = null; 63020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOpenSubMenuId = 0; 63120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 632bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 633bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 63420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private class PopupPresenterCallback implements MenuPresenter.Callback { 63520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 63620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 63720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean onOpenSubMenu(MenuBuilder subMenu) { 63820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (subMenu == null) { 63920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 64020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 64120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 64220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); 64320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 64420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 645bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 64620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 64720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 64820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (menu instanceof SubMenuBuilder) { 64920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ((SubMenuBuilder) menu).getRootMenu().close(false); 65020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 65120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 652bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 653bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 65420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private class OpenOverflowRunnable implements Runnable { 65520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 65620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private OverflowPopup mPopup; 65720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 65820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public OpenOverflowRunnable(OverflowPopup popup) { 65920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mPopup = popup; 66020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 66120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 66220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void run() { 66320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mMenu.changeMenuMode(); 66420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final View menuView = (View) mMenuView; 66520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (menuView != null && menuView.getWindowToken() != null && mPopup.tryShow()) { 66620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mOverflowPopup = mPopup; 66720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 66820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mPostedOpenRunnable = null; 66920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 670bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 671bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell} 672