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