MenuPopupHelper.java revision 11ed1d6cae9214335c92ac38498a4e6c7d1c8324
14267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell/*
24267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell * Copyright (C) 2010 The Android Open Source Project
34267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell *
44267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell * Licensed under the Apache License, Version 2.0 (the "License");
54267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell * you may not use this file except in compliance with the License.
64267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell * You may obtain a copy of the License at
74267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell *
84267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell *      http://www.apache.org/licenses/LICENSE-2.0
94267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell *
104267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell * Unless required by applicable law or agreed to in writing, software
114267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell * distributed under the License is distributed on an "AS IS" BASIS,
124267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell * See the License for the specific language governing permissions and
144267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell * limitations under the License.
154267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell */
164267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
174267534d1c42af847ed0cefd1c88c99f66b36571Adam Powellpackage com.android.internal.view.menu;
184267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
194267534d1c42af847ed0cefd1c88c99f66b36571Adam Powellimport android.content.Context;
2038639b1d75933bfb720db79fce26f09478709614Adam Powellimport android.content.res.Resources;
2111ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powellimport android.os.Parcelable;
224267534d1c42af847ed0cefd1c88c99f66b36571Adam Powellimport android.util.DisplayMetrics;
238028dd32a4a04154050220dd0693583d5b750330Adam Powellimport android.view.KeyEvent;
24696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.view.LayoutInflater;
254267534d1c42af847ed0cefd1c88c99f66b36571Adam Powellimport android.view.View;
264267534d1c42af847ed0cefd1c88c99f66b36571Adam Powellimport android.view.View.MeasureSpec;
27696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.view.ViewGroup;
280458796f1401732b38660794148f4c5e5602f432Adam Powellimport android.view.ViewTreeObserver;
294267534d1c42af847ed0cefd1c88c99f66b36571Adam Powellimport android.widget.AdapterView;
30696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.widget.BaseAdapter;
31696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.widget.ListAdapter;
324267534d1c42af847ed0cefd1c88c99f66b36571Adam Powellimport android.widget.ListPopupWindow;
336c6f575423d6718c3ff322224c1520901ce881e1Adam Powellimport android.widget.PopupWindow;
344267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
35696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport java.util.ArrayList;
368028dd32a4a04154050220dd0693583d5b750330Adam Powell
374267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell/**
38696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * Presents a menu as a small, simple popup anchored to another view.
394267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell * @hide
404267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell */
410458796f1401732b38660794148f4c5e5602f432Adam Powellpublic class MenuPopupHelper implements AdapterView.OnItemClickListener, View.OnKeyListener,
424afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell        ViewTreeObserver.OnGlobalLayoutListener, PopupWindow.OnDismissListener,
43696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        View.OnAttachStateChangeListener, MenuPresenter {
444267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    private static final String TAG = "MenuPopupHelper";
454267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
46696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    static final int ITEM_LAYOUT = com.android.internal.R.layout.popup_menu_item_layout;
47696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
484267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    private Context mContext;
49696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    private LayoutInflater mInflater;
504267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    private ListPopupWindow mPopup;
518028dd32a4a04154050220dd0693583d5b750330Adam Powell    private MenuBuilder mMenu;
524267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    private int mPopupMaxWidth;
534afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell    private View mAnchorView;
548028dd32a4a04154050220dd0693583d5b750330Adam Powell    private boolean mOverflowOnly;
550458796f1401732b38660794148f4c5e5602f432Adam Powell    private ViewTreeObserver mTreeObserver;
568028dd32a4a04154050220dd0693583d5b750330Adam Powell
57696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    private MenuAdapter mAdapter;
58696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
59696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    private Callback mPresenterCallback;
60e2b03a62e5014ea60e24a989544fa549b493a520Adam Powell
618028dd32a4a04154050220dd0693583d5b750330Adam Powell    public MenuPopupHelper(Context context, MenuBuilder menu) {
628028dd32a4a04154050220dd0693583d5b750330Adam Powell        this(context, menu, null, false);
638028dd32a4a04154050220dd0693583d5b750330Adam Powell    }
644267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
658028dd32a4a04154050220dd0693583d5b750330Adam Powell    public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView) {
668028dd32a4a04154050220dd0693583d5b750330Adam Powell        this(context, menu, anchorView, false);
678028dd32a4a04154050220dd0693583d5b750330Adam Powell    }
688028dd32a4a04154050220dd0693583d5b750330Adam Powell
698028dd32a4a04154050220dd0693583d5b750330Adam Powell    public MenuPopupHelper(Context context, MenuBuilder menu,
708028dd32a4a04154050220dd0693583d5b750330Adam Powell            View anchorView, boolean overflowOnly) {
714267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        mContext = context;
72696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mInflater = LayoutInflater.from(context);
738028dd32a4a04154050220dd0693583d5b750330Adam Powell        mMenu = menu;
748028dd32a4a04154050220dd0693583d5b750330Adam Powell        mOverflowOnly = overflowOnly;
754267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
7638639b1d75933bfb720db79fce26f09478709614Adam Powell        final Resources res = context.getResources();
7738639b1d75933bfb720db79fce26f09478709614Adam Powell        mPopupMaxWidth = Math.max(res.getDisplayMetrics().widthPixels / 2,
7838639b1d75933bfb720db79fce26f09478709614Adam Powell                res.getDimensionPixelSize(com.android.internal.R.dimen.config_prefDialogWidth));
798028dd32a4a04154050220dd0693583d5b750330Adam Powell
804afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell        mAnchorView = anchorView;
81696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
82696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        menu.addMenuPresenter(this);
834267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    }
844267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
85f0ad6e6eaf48ac8f4007232ad0a8511a7b5cfc0eAdam Powell    public void setAnchorView(View anchor) {
864afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell        mAnchorView = anchor;
87f0ad6e6eaf48ac8f4007232ad0a8511a7b5cfc0eAdam Powell    }
88f0ad6e6eaf48ac8f4007232ad0a8511a7b5cfc0eAdam Powell
894267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    public void show() {
905e3f284baa271cb0fbf90e504d19fdd2e385382eAdam Powell        if (!tryShow()) {
915e3f284baa271cb0fbf90e504d19fdd2e385382eAdam Powell            throw new IllegalStateException("MenuPopupHelper cannot be used without an anchor");
925e3f284baa271cb0fbf90e504d19fdd2e385382eAdam Powell        }
935e3f284baa271cb0fbf90e504d19fdd2e385382eAdam Powell    }
945e3f284baa271cb0fbf90e504d19fdd2e385382eAdam Powell
955e3f284baa271cb0fbf90e504d19fdd2e385382eAdam Powell    public boolean tryShow() {
960b2d306e7000f4c0c6ad4e00d494bb401d8a9fc2Adam Powell        mPopup = new ListPopupWindow(mContext, null, com.android.internal.R.attr.popupMenuStyle);
978515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        mPopup.setOnDismissListener(this);
98696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mPopup.setOnItemClickListener(this);
994267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
100696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mAdapter = new MenuAdapter(mMenu);
101696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mPopup.setAdapter(mAdapter);
1024267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        mPopup.setModal(true);
1034267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
1044afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell        View anchor = mAnchorView;
1050458796f1401732b38660794148f4c5e5602f432Adam Powell        if (anchor != null) {
1064afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell            final boolean addGlobalListener = mTreeObserver == null;
1074afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell            mTreeObserver = anchor.getViewTreeObserver(); // Refresh to latest
1084afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell            if (addGlobalListener) mTreeObserver.addOnGlobalLayoutListener(this);
1094afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell            anchor.addOnAttachStateChangeListener(this);
1100458796f1401732b38660794148f4c5e5602f432Adam Powell            mPopup.setAnchorView(anchor);
1114be0d52125b88dc992a4c500edbe95bf55484e0bAdam Powell        } else {
1125e3f284baa271cb0fbf90e504d19fdd2e385382eAdam Powell            return false;
1138028dd32a4a04154050220dd0693583d5b750330Adam Powell        }
1144267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
115696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mPopup.setContentWidth(Math.min(measureContentWidth(mAdapter), mPopupMaxWidth));
116aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell        mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);
1174267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        mPopup.show();
1188028dd32a4a04154050220dd0693583d5b750330Adam Powell        mPopup.getListView().setOnKeyListener(this);
1195e3f284baa271cb0fbf90e504d19fdd2e385382eAdam Powell        return true;
1204267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    }
1214267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
1224267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    public void dismiss() {
1233d3da27ab394108fd51771616cca3279baae99d1Adam Powell        if (isShowing()) {
1243d3da27ab394108fd51771616cca3279baae99d1Adam Powell            mPopup.dismiss();
1253d3da27ab394108fd51771616cca3279baae99d1Adam Powell        }
1268515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    }
1278515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell
1288515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    public void onDismiss() {
1298515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        mPopup = null;
13042b91bbcdaf64b2f19d0a9ce168964b31a5dc139Adam Powell        mMenu.close();
1314afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell        if (mTreeObserver != null) {
1324afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell            if (!mTreeObserver.isAlive()) mTreeObserver = mAnchorView.getViewTreeObserver();
133ca51e8788a58f2af3525b7214a675f2d0233e5daAdam Powell            mTreeObserver.removeGlobalOnLayoutListener(this);
1344afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell            mTreeObserver = null;
135ed8b403cc8066bf76cdf98f8d9906ff810defc5bAdam Powell        }
1364afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell        mAnchorView.removeOnAttachStateChangeListener(this);
1374267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    }
1384267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
1398028dd32a4a04154050220dd0693583d5b750330Adam Powell    public boolean isShowing() {
1408028dd32a4a04154050220dd0693583d5b750330Adam Powell        return mPopup != null && mPopup.isShowing();
1418028dd32a4a04154050220dd0693583d5b750330Adam Powell    }
1428028dd32a4a04154050220dd0693583d5b750330Adam Powell
143696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
1444267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
145696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        MenuAdapter adapter = mAdapter;
146696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        adapter.mAdapterMenu.performItemAction(adapter.getItem(position), 0);
1474267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    }
1484267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell
1498028dd32a4a04154050220dd0693583d5b750330Adam Powell    public boolean onKey(View v, int keyCode, KeyEvent event) {
1508028dd32a4a04154050220dd0693583d5b750330Adam Powell        if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_MENU) {
1518028dd32a4a04154050220dd0693583d5b750330Adam Powell            dismiss();
1528028dd32a4a04154050220dd0693583d5b750330Adam Powell            return true;
1538028dd32a4a04154050220dd0693583d5b750330Adam Powell        }
1548028dd32a4a04154050220dd0693583d5b750330Adam Powell        return false;
1558028dd32a4a04154050220dd0693583d5b750330Adam Powell    }
1568028dd32a4a04154050220dd0693583d5b750330Adam Powell
157696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    private int measureContentWidth(ListAdapter adapter) {
1584267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        // Menus don't tend to be long, so this is more sane than it looks.
1594267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        int width = 0;
1604267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        View itemView = null;
16150f784cf2dc2dea8061153ac3a843f60a9d88781Adam Powell        int itemType = 0;
1624267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        final int widthMeasureSpec =
1634267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
1644267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        final int heightMeasureSpec =
1654267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
1664267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        final int count = adapter.getCount();
1674267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        for (int i = 0; i < count; i++) {
16850f784cf2dc2dea8061153ac3a843f60a9d88781Adam Powell            final int positionType = adapter.getItemViewType(i);
16950f784cf2dc2dea8061153ac3a843f60a9d88781Adam Powell            if (positionType != itemType) {
17050f784cf2dc2dea8061153ac3a843f60a9d88781Adam Powell                itemType = positionType;
17150f784cf2dc2dea8061153ac3a843f60a9d88781Adam Powell                itemView = null;
17250f784cf2dc2dea8061153ac3a843f60a9d88781Adam Powell            }
1734267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell            itemView = adapter.getView(i, itemView, null);
1744267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell            itemView.measure(widthMeasureSpec, heightMeasureSpec);
1754267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell            width = Math.max(width, itemView.getMeasuredWidth());
1764267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        }
1774267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell        return width;
1784267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell    }
1790458796f1401732b38660794148f4c5e5602f432Adam Powell
1800458796f1401732b38660794148f4c5e5602f432Adam Powell    @Override
1810458796f1401732b38660794148f4c5e5602f432Adam Powell    public void onGlobalLayout() {
1824afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell        if (isShowing()) {
1834afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell            final View anchor = mAnchorView;
184ca51e8788a58f2af3525b7214a675f2d0233e5daAdam Powell            if (anchor == null || !anchor.isShown()) {
1850458796f1401732b38660794148f4c5e5602f432Adam Powell                dismiss();
186ca51e8788a58f2af3525b7214a675f2d0233e5daAdam Powell            } else if (isShowing()) {
187aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell                // Recompute window size and position
188aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell                mPopup.show();
1890458796f1401732b38660794148f4c5e5602f432Adam Powell            }
1900458796f1401732b38660794148f4c5e5602f432Adam Powell        }
1910458796f1401732b38660794148f4c5e5602f432Adam Powell    }
1924afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell
1934afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell    @Override
1944afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell    public void onViewAttachedToWindow(View v) {
1954afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell    }
1964afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell
1974afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell    @Override
1984afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell    public void onViewDetachedFromWindow(View v) {
1994afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell        if (mTreeObserver != null) {
2004afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell            if (!mTreeObserver.isAlive()) mTreeObserver = v.getViewTreeObserver();
2014afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell            mTreeObserver.removeGlobalOnLayoutListener(this);
2024afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell        }
2034afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell        v.removeOnAttachStateChangeListener(this);
2044afd62b18c52a55371ab923d54f93615ad68fd7aAdam Powell    }
205696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
206696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
207696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void initForMenu(Context context, MenuBuilder menu) {
208696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        // Don't need to do anything; we added as a presenter in the constructor.
209696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
210696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
211696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
212696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public MenuView getMenuView(ViewGroup root) {
213696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        throw new UnsupportedOperationException("MenuPopupHelpers manage their own views");
214696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
215696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
216696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
217696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void updateMenuView(boolean cleared) {
218696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (mAdapter != null) mAdapter.notifyDataSetChanged();
219696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
220696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
221696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
222696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void setCallback(Callback cb) {
223696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mPresenterCallback = cb;
224696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
225696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
226696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
227696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
228696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (subMenu.hasVisibleItems()) {
229696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            MenuPopupHelper subPopup = new MenuPopupHelper(mContext, subMenu, mAnchorView, false);
230696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            subPopup.setCallback(mPresenterCallback);
231696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            if (subPopup.tryShow()) {
232696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell                if (mPresenterCallback != null) {
233696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell                    mPresenterCallback.onOpenSubMenu(subMenu);
234696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell                }
235696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell                return true;
236696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            }
237696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
238696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        return false;
239696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
240696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
241696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
242696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
243696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        // Only care about the (sub)menu we're presenting.
244696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (menu != mMenu) return;
245696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
246696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        dismiss();
247696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (mPresenterCallback != null) {
248696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            mPresenterCallback.onCloseMenu(menu, allMenusAreClosing);
249696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
250696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
251696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
252696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
253696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public boolean flagActionItems() {
254696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        return false;
255696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
256696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
2578d02deabac62c4a68a335a7b3141795466362b89Adam Powell    public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) {
2588d02deabac62c4a68a335a7b3141795466362b89Adam Powell        return false;
2598d02deabac62c4a68a335a7b3141795466362b89Adam Powell    }
2608d02deabac62c4a68a335a7b3141795466362b89Adam Powell
2618d02deabac62c4a68a335a7b3141795466362b89Adam Powell    public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) {
2628d02deabac62c4a68a335a7b3141795466362b89Adam Powell        return false;
2638d02deabac62c4a68a335a7b3141795466362b89Adam Powell    }
2648d02deabac62c4a68a335a7b3141795466362b89Adam Powell
265696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    private class MenuAdapter extends BaseAdapter {
266696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        private MenuBuilder mAdapterMenu;
267696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
268696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        public MenuAdapter(MenuBuilder menu) {
269696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            mAdapterMenu = menu;
270696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
271696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
272696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        public int getCount() {
273696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            ArrayList<MenuItemImpl> items = mOverflowOnly ?
274696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell                    mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems();
275696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            return items.size();
276696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
277696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
278696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        public MenuItemImpl getItem(int position) {
279696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            ArrayList<MenuItemImpl> items = mOverflowOnly ?
280696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell                    mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems();
281696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            return items.get(position);
282696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
283696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
284696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        public long getItemId(int position) {
285696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            // Since a menu item's ID is optional, we'll use the position as an
286696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            // ID for the item in the AdapterView
287696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            return position;
288696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
289696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
290696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        public View getView(int position, View convertView, ViewGroup parent) {
291696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            if (convertView == null) {
292696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell                convertView = mInflater.inflate(ITEM_LAYOUT, parent, false);
293696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            }
294696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
295696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            MenuView.ItemView itemView = (MenuView.ItemView) convertView;
296696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            itemView.initialize(getItem(position), 0);
297696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            return convertView;
298696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
299696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
30011ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell
30111ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    @Override
30211ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    public int getId() {
30311ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell        return 0;
30411ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    }
30511ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell
30611ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    @Override
30711ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    public Parcelable onSaveInstanceState() {
30811ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell        return null;
30911ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    }
31011ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell
31111ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    @Override
31211ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    public void onRestoreInstanceState(Parcelable state) {
31311ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    }
3144267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell}
315