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