MenuBuilder.java revision 4d9861e7ec8488634d316b20981464de2ab7b6fe
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.view.menu; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ResolveInfo; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 3096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powellimport android.util.Log; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyCharacterMap; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 3596675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powellimport android.view.LayoutInflater; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Menu; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MenuItem; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SubMenu; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.BaseAdapter; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 48e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roardimport java.util.Vector; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implementation of the {@link android.view.Menu} interface for creating a 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * standard menu UI. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MenuBuilder implements Menu { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOGTAG = "MenuBuilder"; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The number of different menu types */ 584267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell public static final int NUM_TYPES = 5; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The menu type that represents the icon menu view */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TYPE_ICON = 0; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The menu type that represents the expanded menu view */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TYPE_EXPANDED = 1; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The menu type that represents a menu dialog. Examples are context and sub 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * menus. This menu type will not have a corresponding MenuView, but it will 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * have an ItemView. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TYPE_DIALOG = 2; 6996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell /** 7096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * The menu type that represents a button in the application's action bar. 7196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell */ 7296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell public static final int TYPE_ACTION_BUTTON = 3; 734267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell /** 744267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell * The menu type that represents a menu popup. 754267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell */ 764267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell public static final int TYPE_POPUP = 4; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String VIEWS_TAG = "android:views"; 794267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Order must be the same order as the TYPE_* 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int THEME_RES_FOR_TYPE[] = new int[] { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.style.Theme_IconMenu, 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.style.Theme_ExpandedMenu, 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0, 8596675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell 0, 864267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell 0, 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Order must be the same order as the TYPE_* 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int LAYOUT_RES_FOR_TYPE[] = new int[] { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.layout.icon_menu_layout, 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.layout.expanded_menu_layout, 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0, 9496675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell com.android.internal.R.layout.action_menu_layout, 954267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell 0, 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Order must be the same order as the TYPE_* 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int ITEM_LAYOUT_RES_FOR_TYPE[] = new int[] { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.layout.icon_menu_item_layout, 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.layout.list_menu_item_layout, 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.layout.list_menu_item_layout, 10396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell com.android.internal.R.layout.action_menu_item_layout, 1044267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell com.android.internal.R.layout.list_menu_item_layout, 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] sCategoryToOrder = new int[] { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1, /* No category */ 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4, /* CONTAINER */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5, /* SYSTEM */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3, /* SECONDARY */ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2, /* ALTERNATIVE */ 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0, /* SELECTED_ALTERNATIVE */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Resources mResources; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether the shortcuts should be qwerty-accessible. Use isQwertyMode() 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instead of accessing this directly. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mQwertyMode; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether the shortcuts should be visible on menus. Use isShortcutsVisible() 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instead of accessing this directly. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mShortcutsVisible; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Callback that will receive the various menu-related events generated by 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this class. Use getCallback to get a reference to the callback. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Callback mCallback; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Contains all of the items for this menu */ 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<MenuItemImpl> mItems; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Contains only the items that are currently visible. This will be created/refreshed from 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getVisibleItems()} */ 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<MenuItemImpl> mVisibleItems; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether or not the items (or any one item's shown state) has changed since it was last 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fetched from {@link #getVisibleItems()} 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIsVisibleItemsStale; 14896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell 14996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell /** 15096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * Contains only the items that should appear in the Action Bar, if present. 15196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell */ 15296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell private ArrayList<MenuItemImpl> mActionItems; 15396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell /** 15496675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * Contains items that should NOT appear in the Action Bar, if present. 15596675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell */ 15696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell private ArrayList<MenuItemImpl> mNonActionItems; 15796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell /** 15896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * The number of visible action buttons permitted in this menu 15996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell */ 16096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell private int mMaxActionItems; 16196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell /** 16296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * Whether or not the items (or any one item's action state) has changed since it was 16396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * last fetched. 16496675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell */ 16596675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell private boolean mIsActionItemsStale; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1688028dd32a4a04154050220dd0693583d5b750330Adam Powell * Whether the process of granting space as action items should reserve a space for 1698028dd32a4a04154050220dd0693583d5b750330Adam Powell * an overflow option in the action list. 1708028dd32a4a04154050220dd0693583d5b750330Adam Powell */ 1718028dd32a4a04154050220dd0693583d5b750330Adam Powell private boolean mReserveActionOverflow; 1728028dd32a4a04154050220dd0693583d5b750330Adam Powell 1738028dd32a4a04154050220dd0693583d5b750330Adam Powell /** 1744d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell * Default value for how added items should show in the action list. 1754d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell */ 1764d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell private int mDefaultShowAsAction = MenuItem.SHOW_AS_ACTION_NEVER; 1774d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell 1784d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell /** 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Current use case is Context Menus: As Views populate the context menu, each one has 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extra information that should be passed along. This is the current menu info that 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be set on all items added to this menu. 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ContextMenuInfo mCurrentMenuInfo; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Header title for menu types that have a header (context and submenus) */ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence mHeaderTitle; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Header icon for menu types that have a header and support icons (context) */ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable mHeaderIcon; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Header custom view for menu types that have a header and support custom views (context) */ 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View mHeaderView; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contains the state of the View hierarchy for all menu views when the menu 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was frozen. 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SparseArray<Parcelable> mFrozenViewStates; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Prevents onItemsChanged from doing its junk, useful for batching commands 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that may individually call onItemsChanged. 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mPreventDispatchingItemsChanged = false; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOptionalIconsVisible = false; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private MenuType[] mMenuTypes; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class MenuType { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mMenuType; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The layout inflater that uses the menu type's theme */ 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private LayoutInflater mInflater; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The lazily loaded {@link MenuView} */ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WeakReference<MenuView> mMenuView; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuType(int menuType) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMenuType = menuType; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutInflater getInflater() { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Create an inflater that uses the given theme for the Views it inflates 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInflater == null) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context wrappedContext = new ContextThemeWrapper(mContext, 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project THEME_RES_FOR_TYPE[mMenuType]); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInflater = (LayoutInflater) wrappedContext 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInflater; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuView getMenuView(ViewGroup parent) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LAYOUT_RES_FOR_TYPE[mMenuType] == 0) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuView menuView = mMenuView != null ? mMenuView.get() : null; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (menuView == null) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menuView = (MenuView) getInflater().inflate( 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LAYOUT_RES_FOR_TYPE[mMenuType], parent, false); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menuView.initialize(MenuBuilder.this, mMenuType); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Cache the view 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMenuView = new WeakReference<MenuView>(menuView); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFrozenViewStates != null) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = (View) menuView; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.restoreHierarchyState(mFrozenViewStates); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Clear this menu type's frozen state, since we just restored it 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFrozenViewStates.remove(view.getId()); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return menuView; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasMenuView() { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMenuView != null && mMenuView.get() != null; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by menu to notify of close and selection changes 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface Callback { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when a menu item is selected. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param menu The menu that is the parent of the item 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param item The menu item that is selected 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return whether the menu item selection was handled 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when a menu is closed. 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param menu The menu that was closed. 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param allMenusAreClosing Whether the menus are completely closing (true), 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or whether there is another menu opening shortly 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (false). For example, if the menu is closing because a 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sub menu is about to be shown, <var>allMenusAreClosing</var> 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is false. 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when a sub menu is selected. This is a cue to open the given sub menu's decor. 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param subMenu the sub menu that is being opened 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return whether the sub menu selection was handled by the callback 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onSubMenuSelected(SubMenuBuilder subMenu); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when a sub menu is closed 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param menu the sub menu that was closed 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCloseSubMenu(SubMenuBuilder menu); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when the mode of the menu changes (for example, from icon to expanded). 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param menu the menu that has changed modes 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onMenuModeChange(MenuBuilder menu); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by menu items to execute their associated action 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface ItemInvoker { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean invokeItem(MenuItemImpl item); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuBuilder(Context context) { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMenuTypes = new MenuType[NUM_TYPES]; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = context.getResources(); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItems = new ArrayList<MenuItemImpl>(); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibleItems = new ArrayList<MenuItemImpl>(); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsVisibleItemsStale = true; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell mActionItems = new ArrayList<MenuItemImpl>(); 32996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell mNonActionItems = new ArrayList<MenuItemImpl>(); 33096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell mIsActionItemsStale = true; 33196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShortcutsVisible = 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (mResources.getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3364d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell public MenuBuilder setDefaultShowAsAction(int defaultShowAsAction) { 3374d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell mDefaultShowAsAction = defaultShowAsAction; 3384d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell return this; 3394d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell } 3404d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCallback(Callback callback) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallback = callback; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuType getMenuType(int menuType) { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMenuTypes[menuType] == null) { 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMenuTypes[menuType] = new MenuType(menuType); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMenuTypes[menuType]; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets a menu View that contains this menu's items. 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param menuType The type of menu to get a View for (must be one of 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #TYPE_ICON}, {@link #TYPE_EXPANDED}, 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #TYPE_DIALOG}). 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent The ViewGroup that provides a set of LayoutParams values 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for this menu view 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A View for the menu of type <var>menuType</var> 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getMenuView(int menuType, ViewGroup parent) { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The expanded menu depends on the number if items shown in the icon menu (which 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is adjustable as setters/XML attributes on IconMenuView [imagine a larger LCD 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // wanting to show more icons]). If, for example, the activity goes through 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an orientation change while the expanded menu is open, the icon menu's view 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // won't have an instance anymore; so here we make sure we have an icon menu view (matching 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the same parent so the layout parameters from the XML are used). This 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // will create the icon menu view and cache it (if it doesn't already exist). 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (menuType == TYPE_EXPANDED 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (mMenuTypes[TYPE_ICON] == null || !mMenuTypes[TYPE_ICON].hasMenuView())) { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getMenuType(TYPE_ICON).getMenuView(parent); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (View) getMenuType(menuType).getMenuView(parent); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int getNumIconMenuItemsShown() { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup parent = null; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mMenuTypes[TYPE_ICON].hasMenuView()) { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There isn't an icon menu view instantiated, so when we get it 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * below, it will lazily instantiate it. We should pass a proper 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parent so it uses the layout_ attributes present in the XML 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layout file. 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMenuTypes[TYPE_EXPANDED].hasMenuView()) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View expandedMenuView = (View) mMenuTypes[TYPE_EXPANDED].getMenuView(null); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent = (ViewGroup) expandedMenuView.getParent(); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((IconMenuView) getMenuView(TYPE_ICON, parent)).getNumActualItemsShown(); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears the cached menu views. Call this if the menu views need to another 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layout (for example, if the screen size has changed). 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearMenuViews() { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = NUM_TYPES - 1; i >= 0; i--) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMenuTypes[i] != null) { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMenuTypes[i].mMenuView = null; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mItems.size() - 1; i >= 0; i--) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl item = mItems.get(i); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.hasSubMenu()) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((SubMenuBuilder) item.getSubMenu()).clearMenuViews(); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.clearItemViews(); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds an item to the menu. The other add methods funnel to this. 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private MenuItem addInternal(int group, int id, int categoryOrder, CharSequence title) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int ordering = getOrdering(categoryOrder); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4244d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell final MenuItemImpl item = new MenuItemImpl(this, group, id, categoryOrder, 4254d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell ordering, title, mDefaultShowAsAction); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentMenuInfo != null) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Pass along the current menu info 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.setMenuInfo(mCurrentMenuInfo); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItems.add(findInsertIndex(mItems, ordering), item); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onItemsChanged(false); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return item; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuItem add(CharSequence title) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addInternal(0, 0, 0, title); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuItem add(int titleRes) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addInternal(0, 0, 0, mResources.getString(titleRes)); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuItem add(int group, int id, int categoryOrder, CharSequence title) { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addInternal(group, id, categoryOrder, title); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuItem add(int group, int id, int categoryOrder, int title) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addInternal(group, id, categoryOrder, mResources.getString(title)); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SubMenu addSubMenu(CharSequence title) { 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addSubMenu(0, 0, 0, title); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SubMenu addSubMenu(int titleRes) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addSubMenu(0, 0, 0, mResources.getString(titleRes)); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SubMenu addSubMenu(int group, int id, int categoryOrder, CharSequence title) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final MenuItemImpl item = (MenuItemImpl) addInternal(group, id, categoryOrder, title); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SubMenuBuilder subMenu = new SubMenuBuilder(mContext, this, item); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.setSubMenu(subMenu); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return subMenu; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SubMenu addSubMenu(int group, int id, int categoryOrder, int title) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addSubMenu(group, id, categoryOrder, mResources.getString(title)); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int addIntentOptions(int group, int id, int categoryOrder, ComponentName caller, 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageManager pm = mContext.getPackageManager(); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final List<ResolveInfo> lri = 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pm.queryIntentActivityOptions(caller, specifics, intent, 0); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = lri != null ? lri.size() : 0; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & FLAG_APPEND_TO_GROUP) == 0) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeGroup(group); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ResolveInfo ri = lri.get(i); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent rintent = new Intent( 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri.specificIndex < 0 ? intent : specifics[ri.specificIndex]); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rintent.setComponent(new ComponentName( 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri.activityInfo.applicationInfo.packageName, 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri.activityInfo.name)); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final MenuItem item = add(group, id, categoryOrder, ri.loadLabel(pm)) 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setIcon(ri.loadIcon(pm)) 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setIntent(rintent); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outSpecificItems != null && ri.specificIndex >= 0) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outSpecificItems[ri.specificIndex] = item; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return N; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeItem(int id) { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeItemAtInt(findItemIndex(id), true); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeGroup(int group) { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int i = findGroupIndex(group); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= 0) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int maxRemovable = mItems.size() - i; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numRemoved = 0; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((numRemoved++ < maxRemovable) && (mItems.get(i).getGroupId() == group)) { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't force update for each one, this method will do it at the end 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeItemAtInt(i, false); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Notify menu views 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onItemsChanged(false); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the item at the given index and optionally forces menu views to 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * update. 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index The index of the item to be removed. If this index is 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invalid an exception is thrown. 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param updateChildrenOnMenuViews Whether to force update on menu views. 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Please make sure you eventually call this after your batch of 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * removals. 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeItemAtInt(int index, boolean updateChildrenOnMenuViews) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((index < 0) || (index >= mItems.size())) return; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItems.remove(index); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (updateChildrenOnMenuViews) onItemsChanged(false); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeItemAt(int index) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeItemAtInt(index, true); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearAll() { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreventDispatchingItemsChanged = true; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clear(); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearHeader(); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreventDispatchingItemsChanged = false; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onItemsChanged(true); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clear() { 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItems.clear(); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onItemsChanged(true); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setExclusiveItemChecked(MenuItem item) { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int group = item.getGroupId(); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mItems.size(); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl curItem = mItems.get(i); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curItem.getGroupId() == group) { 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!curItem.isExclusiveCheckable()) continue; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!curItem.isCheckable()) continue; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check the item meant to be checked, uncheck the others (that are in the group) 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curItem.setCheckedInt(curItem == item); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setGroupCheckable(int group, boolean checkable, boolean exclusive) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mItems.size(); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl item = mItems.get(i); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.getGroupId() == group) { 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.setExclusiveCheckable(exclusive); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.setCheckable(checkable); 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setGroupVisible(int group, boolean visible) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mItems.size(); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We handle the notification of items being changed ourselves, so we use setVisibleInt rather 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // than setVisible and at the end notify of items being changed 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changedAtLeastOneItem = false; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl item = mItems.get(i); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.getGroupId() == group) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.setVisibleInt(visible)) changedAtLeastOneItem = true; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (changedAtLeastOneItem) onItemsChanged(false); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setGroupEnabled(int group, boolean enabled) { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mItems.size(); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl item = mItems.get(i); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.getGroupId() == group) { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.setEnabled(enabled); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasVisibleItems() { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int size = size(); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < size; i++) { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl item = mItems.get(i); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.isVisible()) { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuItem findItem(int id) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int size = size(); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < size; i++) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl item = mItems.get(i); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.getItemId() == id) { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return item; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (item.hasSubMenu()) { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItem possibleItem = item.getSubMenu().findItem(id); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (possibleItem != null) { 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return possibleItem; 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int findItemIndex(int id) { 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int size = size(); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < size; i++) { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl item = mItems.get(i); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.getItemId() == id) { 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i; 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int findGroupIndex(int group) { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return findGroupIndex(group, 0); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int findGroupIndex(int group, int start) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int size = size(); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (start < 0) { 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project start = 0; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = start; i < size; i++) { 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final MenuItemImpl item = mItems.get(i); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.getGroupId() == group) { 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int size() { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItems.size(); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuItem getItem(int index) { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItems.get(index); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6908028dd32a4a04154050220dd0693583d5b750330Adam Powell public MenuItem getOverflowItem(int index) { 6918028dd32a4a04154050220dd0693583d5b750330Adam Powell flagActionItems(true); 6928028dd32a4a04154050220dd0693583d5b750330Adam Powell return mNonActionItems.get(index); 6938028dd32a4a04154050220dd0693583d5b750330Adam Powell } 6948028dd32a4a04154050220dd0693583d5b750330Adam Powell 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isShortcutKey(int keyCode, KeyEvent event) { 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return findItemWithShortcutForKey(keyCode, event) != null; 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setQwertyMode(boolean isQwerty) { 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQwertyMode = isQwerty; 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshShortcuts(isShortcutsVisible(), isQwerty); 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the ordering across all items. This will grab the category from 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the upper bits, find out how to order the category with respect to other 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * categories, and combine it with the lower bits. 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param categoryOrder The category order for a particular item (if it has 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not been or/add with a category, the default category is 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * assumed). 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return An ordering integer that can be used to order this item across 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all the items (even from other categories). 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int getOrdering(int categoryOrder) 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int index = (categoryOrder & CATEGORY_MASK) >> CATEGORY_SHIFT; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0 || index >= sCategoryToOrder.length) { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("order does not contain a valid category."); 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (sCategoryToOrder[index] << CATEGORY_SHIFT) | (categoryOrder & USER_MASK); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return whether the menu shortcuts are in qwerty mode or not 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isQwertyMode() { 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mQwertyMode; 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Refreshes the shortcut labels on each of the displayed items. Passes the arguments 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * so submenus don't need to call their parent menu for the same values. 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void refreshShortcuts(boolean shortcutsVisible, boolean qwertyMode) { 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl item; 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mItems.size() - 1; i >= 0; i--) { 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item = mItems.get(i); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.hasSubMenu()) { 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((MenuBuilder) item.getSubMenu()).refreshShortcuts(shortcutsVisible, qwertyMode); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.refreshShortcutOnItemViews(shortcutsVisible, qwertyMode); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets whether the shortcuts should be visible on menus. Devices without hardware 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * key input will never make shortcuts visible even if this method is passed 'true'. 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param shortcutsVisible Whether shortcuts should be visible (if true and a 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * menu item does not have a shortcut defined, that item will 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * still NOT show a shortcut) 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setShortcutsVisible(boolean shortcutsVisible) { 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mShortcutsVisible == shortcutsVisible) return; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShortcutsVisible = 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (mResources.getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS) 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && shortcutsVisible; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshShortcuts(mShortcutsVisible, isQwertyMode()); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether shortcuts should be visible on menus. 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isShortcutsVisible() { 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mShortcutsVisible; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources getResources() { 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Callback getCallback() { 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCallback; 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context getContext() { 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContext; 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int findInsertIndex(ArrayList<MenuItemImpl> items, int ordering) { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = items.size() - 1; i >= 0; i--) { 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl item = items.get(i); 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.getOrdering() <= ordering) { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i + 1; 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean performShortcut(int keyCode, KeyEvent event, int flags) { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final MenuItemImpl item = findItemWithShortcutForKey(keyCode, event); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean handled = false; 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item != null) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled = performItemAction(item, flags); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & FLAG_ALWAYS_PERFORM_CLOSE) != 0) { 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(true); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return handled; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 815e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard /* 816e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * This function will return all the menu and sub-menu items that can 817e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * be directly (the shortcut directly corresponds) and indirectly 818e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * (the ALT-enabled char corresponds to the shortcut) associated 819e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * with the keyCode. 820e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard */ 821e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard List<MenuItemImpl> findItemsWithShortcutForKey(int keyCode, KeyEvent event) { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean qwerty = isQwertyMode(); 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int metaState = event.getMetaState(); 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final KeyCharacterMap.KeyData possibleChars = new KeyCharacterMap.KeyData(); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the chars associated with the keyCode (i.e using any chording combo) 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean isKeyCodeMapped = event.getKeyData(possibleChars); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The delete key is not mapped to '\b' so we treat it specially 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isKeyCodeMapped && (keyCode != KeyEvent.KEYCODE_DEL)) { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 832e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard Vector<MenuItemImpl> items = new Vector(); 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Look for an item whose shortcut is this key. 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mItems.size(); 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl item = mItems.get(i); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.hasSubMenu()) { 838e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard List<MenuItemImpl> subMenuItems = ((MenuBuilder)item.getSubMenu()) 839e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard .findItemsWithShortcutForKey(keyCode, event); 840e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard items.addAll(subMenuItems); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 842e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard final char shortcutChar = qwerty ? item.getAlphabeticShortcut() : item.getNumericShortcut(); 843e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard if (((metaState & (KeyEvent.META_SHIFT_ON | KeyEvent.META_SYM_ON)) == 0) && 844e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard (shortcutChar != 0) && 845e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard (shortcutChar == possibleChars.meta[0] 846e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard || shortcutChar == possibleChars.meta[2] 847e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard || (qwerty && shortcutChar == '\b' && 848e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard keyCode == KeyEvent.KEYCODE_DEL)) && 849e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard item.isEnabled()) { 850e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard items.add(item); 851e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard } 852e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard } 853e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard return items; 854e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard } 855e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard 856e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard /* 857e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * We want to return the menu item associated with the key, but if there is no 858e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * ambiguity (i.e. there is only one menu item corresponding to the key) we want 859e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * to return it even if it's not an exact match; this allow the user to 860e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * _not_ use the ALT key for example, making the use of shortcuts slightly more 861e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * user-friendly. An example is on the G1, '!' and '1' are on the same key, and 862e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * in Gmail, Menu+1 will trigger Menu+! (the actual shortcut). 863e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * 864e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * On the other hand, if two (or more) shortcuts corresponds to the same key, 865e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard * we have to only return the exact match. 866e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard */ 867e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard MenuItemImpl findItemWithShortcutForKey(int keyCode, KeyEvent event) { 868e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard // Get all items that can be associated directly or indirectly with the keyCode 869e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard List<MenuItemImpl> items = findItemsWithShortcutForKey(keyCode, event); 870e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard 871e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard if (items == null) { 872e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard return null; 873e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard } 874e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard 875e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard final int metaState = event.getMetaState(); 876e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard final KeyCharacterMap.KeyData possibleChars = new KeyCharacterMap.KeyData(); 877e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard // Get the chars associated with the keyCode (i.e using any chording combo) 878e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard event.getKeyData(possibleChars); 879e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard 880e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard // If we have only one element, we can safely returns it 881e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard if (items.size() == 1) { 882e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard return items.get(0); 883e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard } 884e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard 885e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard final boolean qwerty = isQwertyMode(); 886e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard // If we found more than one item associated with the key, 887e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard // we have to return the exact match 888e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard for (MenuItemImpl item : items) { 889e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard final char shortcutChar = qwerty ? item.getAlphabeticShortcut() : item.getNumericShortcut(); 890e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard if ((shortcutChar == possibleChars.meta[0] && 891e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard (metaState & KeyEvent.META_ALT_ON) == 0) 892e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard || (shortcutChar == possibleChars.meta[2] && 893e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard (metaState & KeyEvent.META_ALT_ON) != 0) 894e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard || (qwerty && shortcutChar == '\b' && 895e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard keyCode == KeyEvent.KEYCODE_DEL)) { 896e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard return item; 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 901e0fc838ebc18e327a399902cacae16bdbbc09627Nicolas Roard 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean performIdentifierAction(int id, int flags) { 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Look for an item whose identifier is the id. 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return performItemAction(findItem(id), flags); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean performItemAction(MenuItem item, int flags) { 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl itemImpl = (MenuItemImpl) item; 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (itemImpl == null || !itemImpl.isEnabled()) { 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean invoked = itemImpl.invoke(); 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.hasSubMenu()) { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(false); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCallback != null) { 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Return true if the sub menu was invoked or the item was invoked previously 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invoked = mCallback.onSubMenuSelected((SubMenuBuilder) item.getSubMenu()) 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || invoked; 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & FLAG_PERFORM_NO_CLOSE) == 0) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(true); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return invoked; 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Closes the visible menu. 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param allMenusAreClosing Whether the menus are completely closing (true), 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or whether there is another menu coming in this menu's place 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (false). For example, if the menu is closing because a 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sub menu is about to be shown, <var>allMenusAreClosing</var> 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is false. 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void close(boolean allMenusAreClosing) { 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Callback callback = getCallback(); 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (callback != null) { 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback.onCloseMenu(this, allMenusAreClosing); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() { 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(true); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when an item is added or removed. 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cleared Whether the items were cleared or just changed. 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void onItemsChanged(boolean cleared) { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mPreventDispatchingItemsChanged) { 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIsVisibleItemsStale == false) mIsVisibleItemsStale = true; 96296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell if (mIsActionItemsStale == false) mIsActionItemsStale = true; 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuType[] menuTypes = mMenuTypes; 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < NUM_TYPES; i++) { 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((menuTypes[i] != null) && (menuTypes[i].hasMenuView())) { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuView menuView = menuTypes[i].mMenuView.get(); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menuView.updateChildren(cleared); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by {@link MenuItemImpl} when its visible flag is changed. 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param item The item that has gone through a visibility change. 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onItemVisibleChanged(MenuItemImpl item) { 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Notify of items being changed 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onItemsChanged(false); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 98396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell /** 98496675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * Called by {@link MenuItemImpl} when its action request status is changed. 98596675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * @param item The item that has gone through a change in action request status. 98696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell */ 98796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell void onItemActionRequestChanged(MenuItemImpl item) { 98896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell // Notify of items being changed 98996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell onItemsChanged(false); 99096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 99196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<MenuItemImpl> getVisibleItems() { 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mIsVisibleItemsStale) return mVisibleItems; 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Refresh the visible items 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibleItems.clear(); 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int itemsSize = mItems.size(); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuItemImpl item; 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < itemsSize; i++) { 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item = mItems.get(i); 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item.isVisible()) mVisibleItems.add(item); 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsVisibleItemsStale = false; 100696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell mIsActionItemsStale = true; 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mVisibleItems; 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 101096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell 10118028dd32a4a04154050220dd0693583d5b750330Adam Powell private void flagActionItems(boolean reserveActionOverflow) { 10128028dd32a4a04154050220dd0693583d5b750330Adam Powell if (reserveActionOverflow != mReserveActionOverflow) { 10138028dd32a4a04154050220dd0693583d5b750330Adam Powell mReserveActionOverflow = reserveActionOverflow; 10148028dd32a4a04154050220dd0693583d5b750330Adam Powell mIsActionItemsStale = true; 10158028dd32a4a04154050220dd0693583d5b750330Adam Powell } 10168028dd32a4a04154050220dd0693583d5b750330Adam Powell 101796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell if (!mIsActionItemsStale) { 101896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell return; 101996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 10208028dd32a4a04154050220dd0693583d5b750330Adam Powell 102196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell final ArrayList<MenuItemImpl> visibleItems = getVisibleItems(); 102296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell final int itemsSize = visibleItems.size(); 102396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell int maxActions = mMaxActionItems; 10248028dd32a4a04154050220dd0693583d5b750330Adam Powell 10258028dd32a4a04154050220dd0693583d5b750330Adam Powell int requiredItems = 0; 10268028dd32a4a04154050220dd0693583d5b750330Adam Powell int requestedItems = 0; 10278028dd32a4a04154050220dd0693583d5b750330Adam Powell boolean hasOverflow = false; 102896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell for (int i = 0; i < itemsSize; i++) { 102996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell MenuItemImpl item = visibleItems.get(i); 103096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell if (item.requiresActionButton()) { 10318028dd32a4a04154050220dd0693583d5b750330Adam Powell requiredItems++; 10328028dd32a4a04154050220dd0693583d5b750330Adam Powell } else if (item.requestsActionButton()) { 10338028dd32a4a04154050220dd0693583d5b750330Adam Powell requestedItems++; 10348028dd32a4a04154050220dd0693583d5b750330Adam Powell } else { 10358028dd32a4a04154050220dd0693583d5b750330Adam Powell hasOverflow = true; 103696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 103796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 10388028dd32a4a04154050220dd0693583d5b750330Adam Powell 10398028dd32a4a04154050220dd0693583d5b750330Adam Powell // Reserve a spot for the overflow item if needed. 10408028dd32a4a04154050220dd0693583d5b750330Adam Powell if (reserveActionOverflow && 10418028dd32a4a04154050220dd0693583d5b750330Adam Powell (hasOverflow || requiredItems + requestedItems > maxActions)) { 10428028dd32a4a04154050220dd0693583d5b750330Adam Powell maxActions--; 10438028dd32a4a04154050220dd0693583d5b750330Adam Powell } 10448028dd32a4a04154050220dd0693583d5b750330Adam Powell maxActions -= requiredItems; 10458028dd32a4a04154050220dd0693583d5b750330Adam Powell 104696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell // Flag as many more requested items as will fit. 104796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell for (int i = 0; i < itemsSize; i++) { 104896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell MenuItemImpl item = visibleItems.get(i); 104996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell if (item.requestsActionButton()) { 105096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell item.setIsActionButton(maxActions > 0); 105196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell maxActions--; 105296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 105396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 10548028dd32a4a04154050220dd0693583d5b750330Adam Powell 105596675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell mActionItems.clear(); 105696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell mNonActionItems.clear(); 105796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell for (int i = 0; i < itemsSize; i++) { 105896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell MenuItemImpl item = visibleItems.get(i); 105996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell if (item.isActionButton()) { 106096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell mActionItems.add(item); 106196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } else { 106296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell mNonActionItems.add(item); 106396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 106496675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 10658028dd32a4a04154050220dd0693583d5b750330Adam Powell 106696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell mIsActionItemsStale = false; 106796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 106896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell 10698028dd32a4a04154050220dd0693583d5b750330Adam Powell ArrayList<MenuItemImpl> getActionItems(boolean reserveActionOverflow) { 10708028dd32a4a04154050220dd0693583d5b750330Adam Powell flagActionItems(reserveActionOverflow); 107196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell return mActionItems; 107296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 107396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell 10748028dd32a4a04154050220dd0693583d5b750330Adam Powell ArrayList<MenuItemImpl> getNonActionItems(boolean reserveActionOverflow) { 10758028dd32a4a04154050220dd0693583d5b750330Adam Powell flagActionItems(reserveActionOverflow); 107696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell return mNonActionItems; 107796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 107896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell 107996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell void setMaxActionItems(int maxActionItems) { 108096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell mMaxActionItems = maxActionItems; 108196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell mIsActionItemsStale = true; 108296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell } 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearHeader() { 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeaderIcon = null; 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeaderTitle = null; 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeaderView = null; 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onItemsChanged(false); 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setHeaderInternal(final int titleRes, final CharSequence title, final int iconRes, 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable icon, final View view) { 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Resources r = getResources(); 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view != null) { 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeaderView = view; 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If using a custom view, then the title and icon aren't used 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeaderTitle = null; 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeaderIcon = null; 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (titleRes > 0) { 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeaderTitle = r.getText(titleRes); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (title != null) { 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeaderTitle = title; 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iconRes > 0) { 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeaderIcon = r.getDrawable(iconRes); 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (icon != null) { 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeaderIcon = icon; 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If using the title or icon, then a custom view isn't used 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeaderView = null; 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Notify of change 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onItemsChanged(false); 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the header's title. This replaces the header view. Called by the 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * builder-style methods of subclasses. 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param title The new title. 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return This MenuBuilder so additional setters can be called. 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected MenuBuilder setHeaderTitleInt(CharSequence title) { 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setHeaderInternal(0, title, 0, null, null); 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the header's title. This replaces the header view. Called by the 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * builder-style methods of subclasses. 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param titleRes The new title (as a resource ID). 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return This MenuBuilder so additional setters can be called. 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected MenuBuilder setHeaderTitleInt(int titleRes) { 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setHeaderInternal(titleRes, null, 0, null, null); 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the header's icon. This replaces the header view. Called by the 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * builder-style methods of subclasses. 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param icon The new icon. 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return This MenuBuilder so additional setters can be called. 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected MenuBuilder setHeaderIconInt(Drawable icon) { 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setHeaderInternal(0, null, 0, icon, null); 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the header's icon. This replaces the header view. Called by the 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * builder-style methods of subclasses. 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param iconRes The new icon (as a resource ID). 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return This MenuBuilder so additional setters can be called. 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected MenuBuilder setHeaderIconInt(int iconRes) { 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setHeaderInternal(0, null, iconRes, null, null); 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the header's view. This replaces the title and icon. Called by the 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * builder-style methods of subclasses. 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view The new view. 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return This MenuBuilder so additional setters can be called. 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected MenuBuilder setHeaderViewInt(View view) { 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setHeaderInternal(0, null, 0, null, view); 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getHeaderTitle() { 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeaderTitle; 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getHeaderIcon() { 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeaderIcon; 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getHeaderView() { 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeaderView; 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the root menu (if this is a submenu, find its root menu). 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The root menu. 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuBuilder getRootMenu() { 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the current menu info that is set on all items added to this menu 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (until this is called again with different menu info, in which case that 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one will be added to all subsequent item additions). 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param menuInfo The extra menu information to add. 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCurrentMenuInfo(ContextMenuInfo menuInfo) { 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentMenuInfo = menuInfo; 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets an adapter for providing items and their views. 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param menuType The type of menu to get an adapter for. 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A {@link MenuAdapter} for this menu with the given menu type. 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuAdapter getMenuAdapter(int menuType) { 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new MenuAdapter(menuType); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12248028dd32a4a04154050220dd0693583d5b750330Adam Powell /** 12258028dd32a4a04154050220dd0693583d5b750330Adam Powell * Gets an adapter for providing overflow (non-action) items and their views. 12268028dd32a4a04154050220dd0693583d5b750330Adam Powell * 12278028dd32a4a04154050220dd0693583d5b750330Adam Powell * @param menuType The type of menu to get an adapter for. 12288028dd32a4a04154050220dd0693583d5b750330Adam Powell * @return A {@link MenuAdapter} for this menu with the given menu type. 12298028dd32a4a04154050220dd0693583d5b750330Adam Powell */ 12308028dd32a4a04154050220dd0693583d5b750330Adam Powell public MenuAdapter getOverflowMenuAdapter(int menuType) { 12318028dd32a4a04154050220dd0693583d5b750330Adam Powell return new OverflowMenuAdapter(menuType); 12328028dd32a4a04154050220dd0693583d5b750330Adam Powell } 12338028dd32a4a04154050220dd0693583d5b750330Adam Powell 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setOptionalIconsVisible(boolean visible) { 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOptionalIconsVisible = visible; 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean getOptionalIconsVisible() { 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOptionalIconsVisible; 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void saveHierarchyState(Bundle outState) { 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseArray<Parcelable> viewStates = new SparseArray<Parcelable>(); 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuType[] menuTypes = mMenuTypes; 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = NUM_TYPES - 1; i >= 0; i--) { 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (menuTypes[i] == null) { 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (menuTypes[i].hasMenuView()) { 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((View) menuTypes[i].getMenuView(null)).saveHierarchyState(viewStates); 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outState.putSparseParcelableArray(VIEWS_TAG, viewStates); 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void restoreHierarchyState(Bundle inState) { 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Save this for menu views opened later 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseArray<Parcelable> viewStates = mFrozenViewStates = inState 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getSparseParcelableArray(VIEWS_TAG); 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Thaw those menu views already open 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuType[] menuTypes = mMenuTypes; 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = NUM_TYPES - 1; i >= 0; i--) { 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (menuTypes[i] == null) { 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (menuTypes[i].hasMenuView()) { 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((View) menuTypes[i].getMenuView(null)).restoreHierarchyState(viewStates); 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An adapter that allows an {@link AdapterView} to use this {@link MenuBuilder} as a data 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * source. This adapter will use only the visible/shown items from the menu. 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class MenuAdapter extends BaseAdapter { 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mMenuType; 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuAdapter(int menuType) { 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMenuType = menuType; 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOffset() { 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMenuType == TYPE_EXPANDED) { 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getNumIconMenuItemsShown(); 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getCount() { 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getVisibleItems().size() - getOffset(); 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuItemImpl getItem(int position) { 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getVisibleItems().get(position + getOffset()); 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getItemId(int position) { 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Since a menu item's ID is optional, we'll use the position as an 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ID for the item in the AdapterView 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return position; 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 13114267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell if (convertView != null) { 13124267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell MenuView.ItemView itemView = (MenuView.ItemView) convertView; 13134267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell itemView.getItemData().setItemView(mMenuType, null); 13144267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell 13154267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell MenuItemImpl item = (MenuItemImpl) getItem(position); 13164267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell itemView.initialize(item, mMenuType); 13174267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell item.setItemView(mMenuType, itemView); 13184267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell return convertView; 13194267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell } else { 13204267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell MenuItemImpl item = (MenuItemImpl) getItem(position); 13214267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell item.setItemView(mMenuType, null); 13224267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell return item.getItemView(mMenuType, parent); 13234267534d1c42af847ed0cefd1c88c99f66b36571Adam Powell } 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13258028dd32a4a04154050220dd0693583d5b750330Adam Powell } 13268028dd32a4a04154050220dd0693583d5b750330Adam Powell 13278028dd32a4a04154050220dd0693583d5b750330Adam Powell /** 13288028dd32a4a04154050220dd0693583d5b750330Adam Powell * An adapter that allows an {@link AdapterView} to use this {@link MenuBuilder} as a data 13298028dd32a4a04154050220dd0693583d5b750330Adam Powell * source for overflow menu items that do not fit in the list of action items. 13308028dd32a4a04154050220dd0693583d5b750330Adam Powell */ 13318028dd32a4a04154050220dd0693583d5b750330Adam Powell private class OverflowMenuAdapter extends MenuAdapter { 13328028dd32a4a04154050220dd0693583d5b750330Adam Powell private ArrayList<MenuItemImpl> mOverflowItems; 13338028dd32a4a04154050220dd0693583d5b750330Adam Powell 13348028dd32a4a04154050220dd0693583d5b750330Adam Powell public OverflowMenuAdapter(int menuType) { 13358028dd32a4a04154050220dd0693583d5b750330Adam Powell super(menuType); 13368028dd32a4a04154050220dd0693583d5b750330Adam Powell mOverflowItems = getNonActionItems(true); 13378028dd32a4a04154050220dd0693583d5b750330Adam Powell } 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13398028dd32a4a04154050220dd0693583d5b750330Adam Powell @Override 13408028dd32a4a04154050220dd0693583d5b750330Adam Powell public MenuItemImpl getItem(int position) { 13418028dd32a4a04154050220dd0693583d5b750330Adam Powell return mOverflowItems.get(position); 13428028dd32a4a04154050220dd0693583d5b750330Adam Powell } 13438028dd32a4a04154050220dd0693583d5b750330Adam Powell 13448028dd32a4a04154050220dd0693583d5b750330Adam Powell @Override 13458028dd32a4a04154050220dd0693583d5b750330Adam Powell public int getCount() { 13468028dd32a4a04154050220dd0693583d5b750330Adam Powell return mOverflowItems.size(); 13478028dd32a4a04154050220dd0693583d5b750330Adam Powell } 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1350