1696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell/* 2696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * Copyright (C) 2011 The Android Open Source Project 3696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * 4696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * you may not use this file except in compliance with the License. 6696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * You may obtain a copy of the License at 7696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * 8696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * http://www.apache.org/licenses/LICENSE-2.0 9696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * 10696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * Unless required by applicable law or agreed to in writing, software 11696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * See the License for the specific language governing permissions and 14696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * limitations under the License. 15696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell */ 16696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 17696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellpackage com.android.internal.view.menu; 18696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 1928a8468995c71ba3fbba12557d143e7599db38d8Alan Viveretteimport android.annotation.NonNull; 2028a8468995c71ba3fbba12557d143e7599db38d8Alan Viveretteimport android.annotation.Nullable; 21696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.content.Context; 22696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.os.Bundle; 23696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.os.Parcelable; 24696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.util.SparseArray; 25696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.view.ContextThemeWrapper; 26696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.view.LayoutInflater; 27696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.view.View; 28696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.view.ViewGroup; 29696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.widget.AdapterView; 30696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.widget.BaseAdapter; 31696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.widget.ListAdapter; 32696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 33696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport java.util.ArrayList; 34696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 35696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell/** 36696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * MenuPresenter for list-style menus. 37696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell */ 38696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellpublic class ListMenuPresenter implements MenuPresenter, AdapterView.OnItemClickListener { 391d07e16c9d9ecaaaf8994ad5691c4063ab31f265Adam Powell private static final String TAG = "ListMenuPresenter"; 401d07e16c9d9ecaaaf8994ad5691c4063ab31f265Adam Powell 41696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell Context mContext; 42696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell LayoutInflater mInflater; 43696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell MenuBuilder mMenu; 44696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 45696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell ExpandedMenuView mMenuView; 46696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 47696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell private int mItemIndexOffset; 48696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell int mThemeRes; 49696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell int mItemLayoutRes; 50696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 51696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell private Callback mCallback; 52275702c2f47ed87ab642462530092d9777f32ecdAdam Powell MenuAdapter mAdapter; 53696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 5411ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell private int mId; 5511ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell 56696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public static final String VIEWS_TAG = "android:menu:list"; 57696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 58696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell /** 59696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * Construct a new ListMenuPresenter. 60696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * @param context Context to use for theming. This will supersede the context provided 61696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * to initForMenu when this presenter is added. 62696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * @param itemLayoutRes Layout resource for individual item views. 63696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell */ 64696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public ListMenuPresenter(Context context, int itemLayoutRes) { 65696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell this(itemLayoutRes, 0); 66696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mContext = context; 67bc835039994f8fe70e37041a29d21335a2e22479Adam Powell mInflater = LayoutInflater.from(mContext); 68696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 69696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 70696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell /** 71696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * Construct a new ListMenuPresenter. 72696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * @param itemLayoutRes Layout resource for individual item views. 73696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * @param themeRes Resource ID of a theme to use for views. 74696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell */ 75696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public ListMenuPresenter(int itemLayoutRes, int themeRes) { 76696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mItemLayoutRes = itemLayoutRes; 77696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mThemeRes = themeRes; 78696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 79696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 80696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell @Override 8128a8468995c71ba3fbba12557d143e7599db38d8Alan Viverette public void initForMenu(@NonNull Context context, @Nullable MenuBuilder menu) { 82696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell if (mThemeRes != 0) { 83696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mContext = new ContextThemeWrapper(context, mThemeRes); 84bc835039994f8fe70e37041a29d21335a2e22479Adam Powell mInflater = LayoutInflater.from(mContext); 851d07e16c9d9ecaaaf8994ad5691c4063ab31f265Adam Powell } else if (mContext != null) { 86696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mContext = context; 87bc835039994f8fe70e37041a29d21335a2e22479Adam Powell if (mInflater == null) { 88bc835039994f8fe70e37041a29d21335a2e22479Adam Powell mInflater = LayoutInflater.from(mContext); 89bc835039994f8fe70e37041a29d21335a2e22479Adam Powell } 90696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 91696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mMenu = menu; 9228048d011cb0887cd641977ca37e5f2fde04d191Adam Powell if (mAdapter != null) { 9328048d011cb0887cd641977ca37e5f2fde04d191Adam Powell mAdapter.notifyDataSetChanged(); 9428048d011cb0887cd641977ca37e5f2fde04d191Adam Powell } 95696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 96696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 97696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell @Override 98696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public MenuView getMenuView(ViewGroup root) { 99696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell if (mMenuView == null) { 100696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mMenuView = (ExpandedMenuView) mInflater.inflate( 101696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell com.android.internal.R.layout.expanded_menu_layout, root, false); 102696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell if (mAdapter == null) { 103696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mAdapter = new MenuAdapter(); 104696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 105696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mMenuView.setAdapter(mAdapter); 106696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mMenuView.setOnItemClickListener(this); 107696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 108696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell return mMenuView; 109696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 110696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 111696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell /** 112696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * Call this instead of getMenuView if you want to manage your own ListView. 113696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * For proper operation, the ListView hosting this adapter should add 114696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * this presenter as an OnItemClickListener. 115696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * 116696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * @return A ListAdapter containing the items in the menu. 117696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell */ 118696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public ListAdapter getAdapter() { 119696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell if (mAdapter == null) { 120696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mAdapter = new MenuAdapter(); 121696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 122696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell return mAdapter; 123696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 124696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 125696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell @Override 126696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public void updateMenuView(boolean cleared) { 127696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell if (mAdapter != null) mAdapter.notifyDataSetChanged(); 128696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 129696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 130696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell @Override 131696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public void setCallback(Callback cb) { 132696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mCallback = cb; 133696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 134696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 135696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell @Override 136696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public boolean onSubMenuSelected(SubMenuBuilder subMenu) { 137696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell if (!subMenu.hasVisibleItems()) return false; 138696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 139696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell // The window manager will give us a token. 140696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell new MenuDialogHelper(subMenu).show(null); 141696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell if (mCallback != null) { 142696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mCallback.onOpenSubMenu(subMenu); 143696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 144696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell return true; 145696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 146696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 147696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell @Override 148696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 149696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell if (mCallback != null) { 150696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mCallback.onCloseMenu(menu, allMenusAreClosing); 151696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 152696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 153696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 154696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell int getItemIndexOffset() { 155696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell return mItemIndexOffset; 156696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 157696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 158696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public void setItemIndexOffset(int offset) { 159696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell mItemIndexOffset = offset; 160696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell if (mMenuView != null) { 161696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell updateMenuView(false); 162696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 163696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 164696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 165696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell @Override 166696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 167c0cc68053e5013c207be6f64ffd2ad9e8c467defAdam Powell mMenu.performItemAction(mAdapter.getItem(position), this, 0); 168696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 169696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 170696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell @Override 171696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public boolean flagActionItems() { 172696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell return false; 173696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 174696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 1758d02deabac62c4a68a335a7b3141795466362b89Adam Powell public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { 1768d02deabac62c4a68a335a7b3141795466362b89Adam Powell return false; 1778d02deabac62c4a68a335a7b3141795466362b89Adam Powell } 1788d02deabac62c4a68a335a7b3141795466362b89Adam Powell 1798d02deabac62c4a68a335a7b3141795466362b89Adam Powell public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { 1808d02deabac62c4a68a335a7b3141795466362b89Adam Powell return false; 1818d02deabac62c4a68a335a7b3141795466362b89Adam Powell } 1828d02deabac62c4a68a335a7b3141795466362b89Adam Powell 183696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public void saveHierarchyState(Bundle outState) { 184696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell SparseArray<Parcelable> viewStates = new SparseArray<Parcelable>(); 185696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell if (mMenuView != null) { 186696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell ((View) mMenuView).saveHierarchyState(viewStates); 187696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 188696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell outState.putSparseParcelableArray(VIEWS_TAG, viewStates); 189696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 190696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 191696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public void restoreHierarchyState(Bundle inState) { 192696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell SparseArray<Parcelable> viewStates = inState.getSparseParcelableArray(VIEWS_TAG); 193f1a4549604639e3d9eafc406426ddc252d427b57Adam Powell if (viewStates != null) { 194f1a4549604639e3d9eafc406426ddc252d427b57Adam Powell ((View) mMenuView).restoreHierarchyState(viewStates); 195f1a4549604639e3d9eafc406426ddc252d427b57Adam Powell } 196696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 19711ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell 19811ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell public void setId(int id) { 19911ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell mId = id; 20011ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell } 20111ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell 20211ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell @Override 20311ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell public int getId() { 20411ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell return mId; 20511ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell } 20611ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell 20711ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell @Override 20811ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell public Parcelable onSaveInstanceState() { 20911ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell if (mMenuView == null) { 21011ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell return null; 21111ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell } 21211ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell 21311ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell Bundle state = new Bundle(); 21411ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell saveHierarchyState(state); 21511ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell return state; 21611ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell } 21711ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell 21811ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell @Override 21911ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell public void onRestoreInstanceState(Parcelable state) { 22011ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell restoreHierarchyState((Bundle) state); 22111ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell } 222696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 223696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell private class MenuAdapter extends BaseAdapter { 224275702c2f47ed87ab642462530092d9777f32ecdAdam Powell private int mExpandedIndex = -1; 225275702c2f47ed87ab642462530092d9777f32ecdAdam Powell 226275702c2f47ed87ab642462530092d9777f32ecdAdam Powell public MenuAdapter() { 227275702c2f47ed87ab642462530092d9777f32ecdAdam Powell findExpandedIndex(); 228275702c2f47ed87ab642462530092d9777f32ecdAdam Powell } 229275702c2f47ed87ab642462530092d9777f32ecdAdam Powell 230696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public int getCount() { 23151195b56ff6d3d589abefde27f0a99b5a9a04ff8Adam Powell ArrayList<MenuItemImpl> items = mMenu.getNonActionItems(); 232275702c2f47ed87ab642462530092d9777f32ecdAdam Powell int count = items.size() - mItemIndexOffset; 233275702c2f47ed87ab642462530092d9777f32ecdAdam Powell if (mExpandedIndex < 0) { 234275702c2f47ed87ab642462530092d9777f32ecdAdam Powell return count; 235275702c2f47ed87ab642462530092d9777f32ecdAdam Powell } 236275702c2f47ed87ab642462530092d9777f32ecdAdam Powell return count - 1; 237696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 238696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 239696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public MenuItemImpl getItem(int position) { 24051195b56ff6d3d589abefde27f0a99b5a9a04ff8Adam Powell ArrayList<MenuItemImpl> items = mMenu.getNonActionItems(); 241275702c2f47ed87ab642462530092d9777f32ecdAdam Powell position += mItemIndexOffset; 242275702c2f47ed87ab642462530092d9777f32ecdAdam Powell if (mExpandedIndex >= 0 && position >= mExpandedIndex) { 243275702c2f47ed87ab642462530092d9777f32ecdAdam Powell position++; 244275702c2f47ed87ab642462530092d9777f32ecdAdam Powell } 245275702c2f47ed87ab642462530092d9777f32ecdAdam Powell return items.get(position); 246696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 247696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 248696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public long getItemId(int position) { 249696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell // Since a menu item's ID is optional, we'll use the position as an 250696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell // ID for the item in the AdapterView 251696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell return position; 252696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 253696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 254696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell public View getView(int position, View convertView, ViewGroup parent) { 255696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell if (convertView == null) { 256696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell convertView = mInflater.inflate(mItemLayoutRes, parent, false); 257696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 258696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell 259696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell MenuView.ItemView itemView = (MenuView.ItemView) convertView; 260696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell itemView.initialize(getItem(position), 0); 261696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell return convertView; 262696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 263275702c2f47ed87ab642462530092d9777f32ecdAdam Powell 264275702c2f47ed87ab642462530092d9777f32ecdAdam Powell void findExpandedIndex() { 265275702c2f47ed87ab642462530092d9777f32ecdAdam Powell final MenuItemImpl expandedItem = mMenu.getExpandedItem(); 266275702c2f47ed87ab642462530092d9777f32ecdAdam Powell if (expandedItem != null) { 267275702c2f47ed87ab642462530092d9777f32ecdAdam Powell final ArrayList<MenuItemImpl> items = mMenu.getNonActionItems(); 268275702c2f47ed87ab642462530092d9777f32ecdAdam Powell final int count = items.size(); 269275702c2f47ed87ab642462530092d9777f32ecdAdam Powell for (int i = 0; i < count; i++) { 270275702c2f47ed87ab642462530092d9777f32ecdAdam Powell final MenuItemImpl item = items.get(i); 271275702c2f47ed87ab642462530092d9777f32ecdAdam Powell if (item == expandedItem) { 272275702c2f47ed87ab642462530092d9777f32ecdAdam Powell mExpandedIndex = i; 273275702c2f47ed87ab642462530092d9777f32ecdAdam Powell return; 274275702c2f47ed87ab642462530092d9777f32ecdAdam Powell } 275275702c2f47ed87ab642462530092d9777f32ecdAdam Powell } 276275702c2f47ed87ab642462530092d9777f32ecdAdam Powell } 277275702c2f47ed87ab642462530092d9777f32ecdAdam Powell mExpandedIndex = -1; 278275702c2f47ed87ab642462530092d9777f32ecdAdam Powell } 279275702c2f47ed87ab642462530092d9777f32ecdAdam Powell 280275702c2f47ed87ab642462530092d9777f32ecdAdam Powell @Override 28176889f3482d6391b17f0961f7356c1e8169c8813Adam Powell public void notifyDataSetChanged() { 28276889f3482d6391b17f0961f7356c1e8169c8813Adam Powell findExpandedIndex(); 28376889f3482d6391b17f0961f7356c1e8169c8813Adam Powell super.notifyDataSetChanged(); 284275702c2f47ed87ab642462530092d9777f32ecdAdam Powell } 285696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell } 286696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell} 287