ActionMenuPresenter.java revision d900fe072335d488f883585e3f686ef955d1ccc9
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;
27da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.view.ActionProvider;
28da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.view.MenuItem;
29da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.view.menu.ActionMenuView.ActionMenuChildView;
30bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.util.SparseBooleanArray;
31bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.SoundEffectConstants;
32bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View;
33bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View.MeasureSpec;
34bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.ViewGroup;
35bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.widget.ImageButton;
36bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
37bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport java.util.ArrayList;
38bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
39bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/**
40bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * MenuPresenter for building action menus as seen in the action bar and action modes.
41bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */
42bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellpublic class ActionMenuPresenter extends BaseMenuPresenter
4320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        implements ActionProvider.SubUiVisibilityListener {
44bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
4520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private static final String TAG = "ActionMenuPresenter";
46bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
4720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private View mOverflowButton;
4820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private boolean mReserveOverflow;
4920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private boolean mReserveOverflowSet;
5020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private int mWidthLimit;
5120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private int mActionItemWidthLimit;
5220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private int mMaxItems;
5320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private boolean mMaxItemsSet;
5420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private boolean mStrictWidthLimit;
5520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private boolean mWidthLimitSet;
5620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private boolean mExpandedActionViewsExclusive;
57bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
5820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private int mMinCellSize;
59bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
6020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    // Group IDs that have been added as actions - used temporarily, allocated here for reuse.
6120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private final SparseBooleanArray mActionButtonGroups = new SparseBooleanArray();
62bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
6320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private View mScrapActionButtonView;
64bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
6520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private OverflowPopup mOverflowPopup;
6620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private ActionButtonSubmenu mActionButtonPopup;
67bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
6820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private OpenOverflowRunnable mPostedOpenRunnable;
69bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
7020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback();
7120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    int mOpenSubMenuId;
72bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
7320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public ActionMenuPresenter(Context context) {
74da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brown        super(context, android.support.v7.appcompat.R.layout.action_menu_layout,
75da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brown                android.support.v7.appcompat.R.layout.action_menu_item_layout);
76bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
77bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
7820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
7920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void initForMenu(Context context, MenuBuilder menu) {
8020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.initForMenu(context, menu);
81bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
8220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final Resources res = context.getResources();
83bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
8420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final ActionBarPolicy abp = ActionBarPolicy.get(context);
8520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (!mReserveOverflowSet) {
8620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mReserveOverflow = abp.showsOverflowMenuButton();
8720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
88bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
8920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (!mWidthLimitSet) {
9020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mWidthLimit = abp.getEmbeddedMenuWidthLimit();
9120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
92bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
9320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        // Measure for initial configuration
9420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (!mMaxItemsSet) {
9520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mMaxItems = abp.getMaxActionButtons();
9620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
97bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
9820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        int width = mWidthLimit;
9920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mReserveOverflow) {
10020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mOverflowButton == null) {
10120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mOverflowButton = new OverflowMenuButton(mSystemContext);
10220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                final int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
10320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mOverflowButton.measure(spec, spec);
10420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
10520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            width -= mOverflowButton.getMeasuredWidth();
10620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        } else {
10720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mOverflowButton = null;
10820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
109bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
11020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mActionItemWidthLimit = width;
111bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
11220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mMinCellSize = (int) (ActionMenuView.MIN_CELL_SIZE * res.getDisplayMetrics().density);
113bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
11420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        // Drop a scrap view as it may no longer reflect the proper context/config.
11520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mScrapActionButtonView = null;
116bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
11720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
11820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onConfigurationChanged(Configuration newConfig) {
11920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (!mMaxItemsSet) {
12020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mMaxItems = mContext.getResources().getInteger(
12120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    R.integer.max_action_buttons);
122bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
12320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mMenu != null) {
124d900fe072335d488f883585e3f686ef955d1ccc9Chris Banes            mMenu.onItemsChanged(true);
125bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
12620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
127bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
12820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setWidthLimit(int width, boolean strict) {
12920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mWidthLimit = width;
13020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mStrictWidthLimit = strict;
13120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mWidthLimitSet = true;
132bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
133bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
13420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setReserveOverflow(boolean reserveOverflow) {
13520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mReserveOverflow = reserveOverflow;
13620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mReserveOverflowSet = true;
13720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
138bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
13920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setItemLimit(int itemCount) {
14020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mMaxItems = itemCount;
14120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mMaxItemsSet = true;
14220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
143bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
14420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setExpandedActionViewsExclusive(boolean isExclusive) {
14520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mExpandedActionViewsExclusive = isExclusive;
146bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
147bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
14820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
14920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public MenuView getMenuView(ViewGroup root) {
15020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        MenuView result = super.getMenuView(root);
15120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        ((ActionMenuView) result).setPresenter(this);
15220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return result;
153bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
154bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
15520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
15620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) {
15720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        View actionView = item.getActionView();
15820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (actionView == null || item.hasCollapsibleActionView()) {
15920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (!(convertView instanceof ActionMenuItemView)) {
16020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                convertView = null;
16120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
16220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            actionView = super.getItemView(item, convertView, parent);
16320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
16420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        actionView.setVisibility(item.isActionViewExpanded() ? View.GONE : View.VISIBLE);
165bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
16620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final ActionMenuView menuParent = (ActionMenuView) parent;
16720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final ViewGroup.LayoutParams lp = actionView.getLayoutParams();
16820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (!menuParent.checkLayoutParams(lp)) {
16920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            actionView.setLayoutParams(menuParent.generateLayoutParams(lp));
17020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
17120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return actionView;
172bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
173bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
17420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
17520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void bindItemView(MenuItemImpl item, MenuView.ItemView itemView) {
17620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        itemView.initialize(item, 0);
17720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
17820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final ActionMenuView menuView = (ActionMenuView) mMenuView;
17920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        ActionMenuItemView actionItemView = (ActionMenuItemView) itemView;
18081173a86853974bb27d4197a0f0768922f8205caTrevor Johns        actionItemView.setItemInvoker(menuView);
181bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
182bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
183bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
18420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean shouldIncludeItem(int childIndex, MenuItemImpl item) {
18520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return item.isActionButton();
186bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
187bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
188bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
18920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void updateMenuView(boolean cleared) {
19020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.updateMenuView(cleared);
19120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
192176a17e30644b1d5a4206cc462268d151e43949bChris Banes        if (mMenuView == null) {
193176a17e30644b1d5a4206cc462268d151e43949bChris Banes            return;
194176a17e30644b1d5a4206cc462268d151e43949bChris Banes        }
195176a17e30644b1d5a4206cc462268d151e43949bChris Banes
19620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mMenu != null) {
19720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final ArrayList<MenuItemImpl> actionItems = mMenu.getActionItems();
19820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final int count = actionItems.size();
19920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            for (int i = 0; i < count; i++) {
20020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                final ActionProvider provider = actionItems.get(i).getActionProvider();
20120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                if (provider != null) {
20220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    provider.setSubUiVisibilityListener(this);
20320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                }
20420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
20520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
206bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
20720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final ArrayList<MenuItemImpl> nonActionItems = mMenu != null ?
20820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mMenu.getNonActionItems() : null;
209bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
21020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        boolean hasOverflow = false;
21120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mReserveOverflow && nonActionItems != null) {
21220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final int count = nonActionItems.size();
21320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (count == 1) {
21420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                hasOverflow = !nonActionItems.get(0).isActionViewExpanded();
21520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            } else {
21620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                hasOverflow = count > 0;
21720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
21820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
219bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
22020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (hasOverflow) {
22120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mOverflowButton == null) {
22220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mOverflowButton = new OverflowMenuButton(mSystemContext);
22320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
22420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            ViewGroup parent = (ViewGroup) mOverflowButton.getParent();
22520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (parent != mMenuView) {
22620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                if (parent != null) {
22720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    parent.removeView(mOverflowButton);
22820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                }
22920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                ActionMenuView menuView = (ActionMenuView) mMenuView;
23020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                menuView.addView(mOverflowButton, menuView.generateOverflowButtonLayoutParams());
23120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
23220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        } else if (mOverflowButton != null && mOverflowButton.getParent() == mMenuView) {
23320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            ((ViewGroup) mMenuView).removeView(mOverflowButton);
23420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
235bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
23620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        ((ActionMenuView) mMenuView).setOverflowReserved(mReserveOverflow);
237bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
238bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
239bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
24020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean filterLeftoverView(ViewGroup parent, int childIndex) {
24120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (parent.getChildAt(childIndex) == mOverflowButton) {
24220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return false;
24320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
24420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return super.filterLeftoverView(parent, childIndex);
24520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
24620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
24720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
24820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (!subMenu.hasVisibleItems()) {
24920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return false;
25020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
25120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
25220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        SubMenuBuilder topSubMenu = subMenu;
25320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        while (topSubMenu.getParentMenu() != mMenu) {
25420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            topSubMenu = (SubMenuBuilder) topSubMenu.getParentMenu();
25520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
25620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        View anchor = findViewForItem(topSubMenu.getItem());
25720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (anchor == null) {
25820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mOverflowButton == null) {
25920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                return false;
26020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
26120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            anchor = mOverflowButton;
26220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
26320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
26420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mOpenSubMenuId = subMenu.getItem().getItemId();
265176a17e30644b1d5a4206cc462268d151e43949bChris Banes        mActionButtonPopup = new ActionButtonSubmenu(subMenu);
266176a17e30644b1d5a4206cc462268d151e43949bChris Banes        mActionButtonPopup.show(null);
26720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.onSubMenuSelected(subMenu);
268bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        return true;
26920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
27020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
27120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private View findViewForItem(MenuItem item) {
27220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final ViewGroup parent = (ViewGroup) mMenuView;
27320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (parent == null) {
27420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return null;
27520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
27620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
27720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final int count = parent.getChildCount();
27820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        for (int i = 0; i < count; i++) {
27920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final View child = parent.getChildAt(i);
28020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (child instanceof MenuView.ItemView &&
28120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    ((MenuView.ItemView) child).getItemData() == item) {
28220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                return child;
28320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
28420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
28520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return null;
28620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
28720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
28820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
28920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Display the overflow menu if one is present.
29020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
29120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return true if the overflow menu was shown, false otherwise.
29220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
29320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean showOverflowMenu() {
29420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mReserveOverflow && !isOverflowMenuShowing() && mMenu != null && mMenuView != null &&
29520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mPostedOpenRunnable == null) {
29620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            OverflowPopup popup = new OverflowPopup(mContext, mMenu, mOverflowButton, true);
29720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mPostedOpenRunnable = new OpenOverflowRunnable(popup);
29820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            // Post this for later; we might still need a layout for the anchor to be right.
29920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            ((View) mMenuView).post(mPostedOpenRunnable);
30020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
30120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            // ActionMenuPresenter uses null as a callback argument here
30220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            // to indicate overflow is opening.
30320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            super.onSubMenuSelected(null);
30420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
30520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return true;
30620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
30720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return false;
30820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
30920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
31020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
31120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Hide the overflow menu if it is currently showing.
31220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
31320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return true if the overflow menu was hidden, false otherwise.
31420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
31520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean hideOverflowMenu() {
31620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mPostedOpenRunnable != null && mMenuView != null) {
31720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            ((View) mMenuView).removeCallbacks(mPostedOpenRunnable);
31820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mPostedOpenRunnable = null;
31920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return true;
32020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
32120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
32220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        MenuPopupHelper popup = mOverflowPopup;
32320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (popup != null) {
32420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            popup.dismiss();
32520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return true;
32620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
32720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return false;
32820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
32920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
33020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
33120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Dismiss all popup menus - overflow and submenus.
33220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
33320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return true if popups were dismissed, false otherwise. (This can be because none were open.)
33420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
33520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean dismissPopupMenus() {
33620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        boolean result = hideOverflowMenu();
33720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        result |= hideSubMenus();
33820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return result;
33920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
34020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
34120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
34220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Dismiss all submenu popups.
34320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
34420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return true if popups were dismissed, false otherwise. (This can be because none were open.)
34520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
34620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean hideSubMenus() {
34720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mActionButtonPopup != null) {
34820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mActionButtonPopup.dismiss();
34920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return true;
35020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
35120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return false;
35220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
35320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
35420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
35520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return true if the overflow menu is currently showing
35620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
35720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean isOverflowMenuShowing() {
35820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return mOverflowPopup != null && mOverflowPopup.isShowing();
35920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
36020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
36120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
36220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @return true if space has been reserved in the action menu for an overflow item.
36320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
36420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean isOverflowReserved() {
36520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return mReserveOverflow;
36620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
36720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
36820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean flagActionItems() {
36920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final ArrayList<MenuItemImpl> visibleItems = mMenu.getVisibleItems();
37020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final int itemsSize = visibleItems.size();
37120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        int maxActions = mMaxItems;
37220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        int widthLimit = mActionItemWidthLimit;
37320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final int querySpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
37420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final ViewGroup parent = (ViewGroup) mMenuView;
37520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
37620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        int requiredItems = 0;
37720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        int requestedItems = 0;
37820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        int firstActionWidth = 0;
37920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        boolean hasOverflow = false;
38020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        for (int i = 0; i < itemsSize; i++) {
38120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            MenuItemImpl item = visibleItems.get(i);
38220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (item.requiresActionButton()) {
38320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                requiredItems++;
38420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            } else if (item.requestsActionButton()) {
38520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                requestedItems++;
38620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            } else {
38720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                hasOverflow = true;
38820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
38920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mExpandedActionViewsExclusive && item.isActionViewExpanded()) {
39020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                // Overflow everything if we have an expanded action view and we're
39120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                // space constrained.
39220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                maxActions = 0;
39320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
39420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
39520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
39620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        // Reserve a spot for the overflow item if needed.
39720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mReserveOverflow &&
39820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                (hasOverflow || requiredItems + requestedItems > maxActions)) {
39920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            maxActions--;
40020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
40120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        maxActions -= requiredItems;
402bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
40320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final SparseBooleanArray seenGroups = mActionButtonGroups;
40420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        seenGroups.clear();
40520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
40620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        int cellSize = 0;
40720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        int cellsRemaining = 0;
40820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mStrictWidthLimit) {
40920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            cellsRemaining = widthLimit / mMinCellSize;
41020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final int cellSizeRemaining = widthLimit % mMinCellSize;
41120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            cellSize = mMinCellSize + cellSizeRemaining / cellsRemaining;
41220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
41320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
41420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        // Flag as many more requested items as will fit.
41520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        for (int i = 0; i < itemsSize; i++) {
41620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            MenuItemImpl item = visibleItems.get(i);
41720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
41820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (item.requiresActionButton()) {
41920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                View v = getItemView(item, mScrapActionButtonView, parent);
42020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                if (mScrapActionButtonView == null) {
42120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    mScrapActionButtonView = v;
42220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                }
42320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                if (mStrictWidthLimit) {
42420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    cellsRemaining -= ActionMenuView.measureChildForCells(v,
42520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                            cellSize, cellsRemaining, querySpec, 0);
42620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                } else {
42720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    v.measure(querySpec, querySpec);
42820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                }
42920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                final int measuredWidth = v.getMeasuredWidth();
43020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                widthLimit -= measuredWidth;
43120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                if (firstActionWidth == 0) {
43220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    firstActionWidth = measuredWidth;
43320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                }
43420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                final int groupId = item.getGroupId();
43520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                if (groupId != 0) {
43620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    seenGroups.put(groupId, true);
43720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                }
43820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                item.setIsActionButton(true);
43920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            } else if (item.requestsActionButton()) {
44020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                // Items in a group with other items that already have an action slot
44120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                // can break the max actions rule, but not the width limit.
44220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                final int groupId = item.getGroupId();
44320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                final boolean inGroup = seenGroups.get(groupId);
44420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                boolean isAction = (maxActions > 0 || inGroup) && widthLimit > 0 &&
44520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        (!mStrictWidthLimit || cellsRemaining > 0);
44620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
44720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                if (isAction) {
44820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    View v = getItemView(item, mScrapActionButtonView, parent);
44920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    if (mScrapActionButtonView == null) {
45020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        mScrapActionButtonView = v;
45120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    }
45220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    if (mStrictWidthLimit) {
45320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        final int cells = ActionMenuView.measureChildForCells(v,
45420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                                cellSize, cellsRemaining, querySpec, 0);
45520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        cellsRemaining -= cells;
45620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        if (cells == 0) {
45720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                            isAction = false;
45820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        }
45920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    } else {
46020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        v.measure(querySpec, querySpec);
46120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    }
46220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    final int measuredWidth = v.getMeasuredWidth();
46320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    widthLimit -= measuredWidth;
46420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    if (firstActionWidth == 0) {
46520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        firstActionWidth = measuredWidth;
46620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    }
46720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
46820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    if (mStrictWidthLimit) {
46920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        isAction &= widthLimit >= 0;
47020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    } else {
47120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        // Did this push the entire first item past the limit?
47220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        isAction &= widthLimit + firstActionWidth > 0;
47320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    }
47420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                }
47520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
47620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                if (isAction && groupId != 0) {
47720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    seenGroups.put(groupId, true);
47820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                } else if (inGroup) {
47920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    // We broke the width limit. Demote the whole group, they all overflow now.
48020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    seenGroups.put(groupId, false);
48120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    for (int j = 0; j < i; j++) {
48220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        MenuItemImpl areYouMyGroupie = visibleItems.get(j);
48320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        if (areYouMyGroupie.getGroupId() == groupId) {
48420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                            // Give back the action slot
48520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                            if (areYouMyGroupie.isActionButton()) {
48620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                                maxActions++;
48720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                            }
48820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                            areYouMyGroupie.setIsActionButton(false);
48920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        }
49020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    }
49120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                }
49220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
49320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                if (isAction) {
49420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    maxActions--;
49520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                }
49620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
49720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                item.setIsActionButton(isAction);
49820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
49920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
50020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return true;
501bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
502bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
50320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
50420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
50520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        dismissPopupMenus();
50620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.onCloseMenu(menu, allMenusAreClosing);
507bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
508bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
50920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
51020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public Parcelable onSaveInstanceState() {
51120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        SavedState state = new SavedState();
51220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        state.openSubMenuId = mOpenSubMenuId;
51320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return state;
514bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
515bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
51620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
51720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onRestoreInstanceState(Parcelable state) {
51820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        SavedState saved = (SavedState) state;
51920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (saved.openSubMenuId > 0) {
52020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            MenuItem item = mMenu.findItem(saved.openSubMenuId);
52120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (item != null) {
52220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu();
52320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                onSubMenuSelected(subMenu);
52420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
52520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
526bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
527bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
528bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
52920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onSubUiVisibilityChanged(boolean isVisible) {
53020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (isVisible) {
53120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            // Not a submenu, but treat it like one.
53220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            super.onSubMenuSelected(null);
53320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        } else {
53420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mMenu.close(false);
53520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
536bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
537bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
53820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private static class SavedState implements Parcelable {
539bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
54020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public int openSubMenuId;
541bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
54220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        SavedState() {
54320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
544bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
54520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        SavedState(Parcel in) {
54620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            openSubMenuId = in.readInt();
54720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
54820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
54920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        @Override
55020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public int describeContents() {
55120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return 0;
55220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
553bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
55420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        @Override
55520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public void writeToParcel(Parcel dest, int flags) {
55620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            dest.writeInt(openSubMenuId);
557bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
55820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
55920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public static final Parcelable.Creator<SavedState> CREATOR
56020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                = new Parcelable.Creator<SavedState>() {
56120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            public SavedState createFromParcel(Parcel in) {
56220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                return new SavedState(in);
56320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
56420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
56520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            public SavedState[] newArray(int size) {
56620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                return new SavedState[size];
56720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
56820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        };
569bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
570bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
57120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private class OverflowMenuButton extends ImageButton implements ActionMenuChildView {
57220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
57320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public OverflowMenuButton(Context context) {
57420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            super(context, null, R.attr.actionOverflowButtonStyle);
57520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
57620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            setClickable(true);
57720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            setFocusable(true);
57820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            setVisibility(VISIBLE);
57920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            setEnabled(true);
58020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
58120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
58220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        @Override
58320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public boolean performClick() {
58420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (super.performClick()) {
58520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                return true;
58620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
58720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
58820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            playSoundEffect(SoundEffectConstants.CLICK);
58920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            showOverflowMenu();
59020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return true;
59120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
59220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
59320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public boolean needsDividerBefore() {
59420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return false;
59520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
59620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
59720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public boolean needsDividerAfter() {
59820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return false;
59920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
600bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
601bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
60220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private class OverflowPopup extends MenuPopupHelper {
603bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
60420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public OverflowPopup(Context context, MenuBuilder menu, View anchorView,
60520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                boolean overflowOnly) {
60620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            super(context, menu, anchorView, overflowOnly);
60720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            setCallback(mPopupPresenterCallback);
60820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
609bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
61020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        @Override
61120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public void onDismiss() {
61220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            super.onDismiss();
61320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mMenu.close();
61420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mOverflowPopup = null;
61520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
616bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
617bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
618176a17e30644b1d5a4206cc462268d151e43949bChris Banes    private class ActionButtonSubmenu extends MenuDialogHelper {
61920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
620176a17e30644b1d5a4206cc462268d151e43949bChris Banes        public ActionButtonSubmenu(SubMenuBuilder subMenu) {
621176a17e30644b1d5a4206cc462268d151e43949bChris Banes            super(subMenu);
62220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            setCallback(mPopupPresenterCallback);
62320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
62420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
62520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        @Override
626176a17e30644b1d5a4206cc462268d151e43949bChris Banes        public void onDismiss(DialogInterface dialog) {
627176a17e30644b1d5a4206cc462268d151e43949bChris Banes            super.onDismiss(dialog);
62820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mActionButtonPopup = null;
62920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mOpenSubMenuId = 0;
63020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
631bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
632bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
63320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private class PopupPresenterCallback implements MenuPresenter.Callback {
63420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
63520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        @Override
63620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public boolean onOpenSubMenu(MenuBuilder subMenu) {
63720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (subMenu == null) {
63820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                return false;
63920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
64020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
64120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId();
64220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return false;
64320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
644bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
64520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        @Override
64620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
64720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (menu instanceof SubMenuBuilder) {
64820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                ((SubMenuBuilder) menu).getRootMenu().close(false);
64920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
65020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
651bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
652bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
65320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private class OpenOverflowRunnable implements Runnable {
65420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
65520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        private OverflowPopup mPopup;
65620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
65720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public OpenOverflowRunnable(OverflowPopup popup) {
65820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mPopup = popup;
65920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
66020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
66120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        public void run() {
66220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mMenu.changeMenuMode();
66320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final View menuView = (View) mMenuView;
66420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (menuView != null && menuView.getWindowToken() != null && mPopup.tryShow()) {
66520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mOverflowPopup = mPopup;
66620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
66720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mPostedOpenRunnable = null;
66820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
669bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
670bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell}
671