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
19696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.content.Context;
20275702c2f47ed87ab642462530092d9777f32ecdAdam Powellimport android.database.DataSetObserver;
21696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.os.Bundle;
22696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.os.Parcelable;
23696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.util.SparseArray;
24696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.view.ContextThemeWrapper;
25696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.view.LayoutInflater;
26696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.view.View;
27696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.view.ViewGroup;
28696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.widget.AdapterView;
29696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.widget.BaseAdapter;
30696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport android.widget.ListAdapter;
31696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
32696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellimport java.util.ArrayList;
33696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
34696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell/**
35696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell * MenuPresenter for list-style menus.
36696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell */
37696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powellpublic class ListMenuPresenter implements MenuPresenter, AdapterView.OnItemClickListener {
381d07e16c9d9ecaaaf8994ad5691c4063ab31f265Adam Powell    private static final String TAG = "ListMenuPresenter";
391d07e16c9d9ecaaaf8994ad5691c4063ab31f265Adam Powell
40696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    Context mContext;
41696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    LayoutInflater mInflater;
42696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    MenuBuilder mMenu;
43696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
44696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    ExpandedMenuView mMenuView;
45696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
46696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    private int mItemIndexOffset;
47696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    int mThemeRes;
48696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    int mItemLayoutRes;
49696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
50696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    private Callback mCallback;
51275702c2f47ed87ab642462530092d9777f32ecdAdam Powell    MenuAdapter mAdapter;
52696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
5311ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    private int mId;
5411ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell
55696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public static final String VIEWS_TAG = "android:menu:list";
56696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
57696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    /**
58696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     * Construct a new ListMenuPresenter.
59696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     * @param context Context to use for theming. This will supersede the context provided
60696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     *                to initForMenu when this presenter is added.
61696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     * @param itemLayoutRes Layout resource for individual item views.
62696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     */
63696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public ListMenuPresenter(Context context, int itemLayoutRes) {
64696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        this(itemLayoutRes, 0);
65696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mContext = context;
66bc835039994f8fe70e37041a29d21335a2e22479Adam Powell        mInflater = LayoutInflater.from(mContext);
67696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
68696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
69696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    /**
70696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     * Construct a new ListMenuPresenter.
71696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     * @param itemLayoutRes Layout resource for individual item views.
72696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     * @param themeRes Resource ID of a theme to use for views.
73696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     */
74696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public ListMenuPresenter(int itemLayoutRes, int themeRes) {
75696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mItemLayoutRes = itemLayoutRes;
76696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mThemeRes = themeRes;
77696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
78696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
79696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
80696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void initForMenu(Context context, MenuBuilder menu) {
81696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (mThemeRes != 0) {
82696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            mContext = new ContextThemeWrapper(context, mThemeRes);
83bc835039994f8fe70e37041a29d21335a2e22479Adam Powell            mInflater = LayoutInflater.from(mContext);
841d07e16c9d9ecaaaf8994ad5691c4063ab31f265Adam Powell        } else if (mContext != null) {
85696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            mContext = context;
86bc835039994f8fe70e37041a29d21335a2e22479Adam Powell            if (mInflater == null) {
87bc835039994f8fe70e37041a29d21335a2e22479Adam Powell                mInflater = LayoutInflater.from(mContext);
88bc835039994f8fe70e37041a29d21335a2e22479Adam Powell            }
89696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
90696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mMenu = menu;
9128048d011cb0887cd641977ca37e5f2fde04d191Adam Powell        if (mAdapter != null) {
9228048d011cb0887cd641977ca37e5f2fde04d191Adam Powell            mAdapter.notifyDataSetChanged();
9328048d011cb0887cd641977ca37e5f2fde04d191Adam Powell        }
94696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
95696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
96696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
97696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public MenuView getMenuView(ViewGroup root) {
98696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (mMenuView == null) {
99696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            mMenuView = (ExpandedMenuView) mInflater.inflate(
100696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell                    com.android.internal.R.layout.expanded_menu_layout, root, false);
101696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            if (mAdapter == null) {
102696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell                mAdapter = new MenuAdapter();
103696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            }
104696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            mMenuView.setAdapter(mAdapter);
105696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            mMenuView.setOnItemClickListener(this);
106696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
107696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        return mMenuView;
108696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
109696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
110696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    /**
111696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     * Call this instead of getMenuView if you want to manage your own ListView.
112696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     * For proper operation, the ListView hosting this adapter should add
113696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     * this presenter as an OnItemClickListener.
114696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     *
115696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     * @return A ListAdapter containing the items in the menu.
116696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell     */
117696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public ListAdapter getAdapter() {
118696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (mAdapter == null) {
119696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            mAdapter = new MenuAdapter();
120696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
121696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        return mAdapter;
122696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
123696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
124696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
125696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void updateMenuView(boolean cleared) {
126696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (mAdapter != null) mAdapter.notifyDataSetChanged();
127696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
128696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
129696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
130696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void setCallback(Callback cb) {
131696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mCallback = cb;
132696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
133696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
134696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
135696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
136696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (!subMenu.hasVisibleItems()) return false;
137696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
138696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        // The window manager will give us a token.
139696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        new MenuDialogHelper(subMenu).show(null);
140696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (mCallback != null) {
141696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            mCallback.onOpenSubMenu(subMenu);
142696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
143696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        return true;
144696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
145696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
146696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
147696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
148696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (mCallback != null) {
149696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            mCallback.onCloseMenu(menu, allMenusAreClosing);
150696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
151696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
152696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
153696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    int getItemIndexOffset() {
154696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        return mItemIndexOffset;
155696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
156696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
157696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void setItemIndexOffset(int offset) {
158696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mItemIndexOffset = offset;
159696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (mMenuView != null) {
160696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            updateMenuView(false);
161696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
162696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
163696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
164696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
165696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
166696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        mMenu.performItemAction(mAdapter.getItem(position), 0);
167696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
168696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
169696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    @Override
170696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public boolean flagActionItems() {
171696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        return false;
172696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
173696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
1748d02deabac62c4a68a335a7b3141795466362b89Adam Powell    public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) {
1758d02deabac62c4a68a335a7b3141795466362b89Adam Powell        return false;
1768d02deabac62c4a68a335a7b3141795466362b89Adam Powell    }
1778d02deabac62c4a68a335a7b3141795466362b89Adam Powell
1788d02deabac62c4a68a335a7b3141795466362b89Adam Powell    public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) {
1798d02deabac62c4a68a335a7b3141795466362b89Adam Powell        return false;
1808d02deabac62c4a68a335a7b3141795466362b89Adam Powell    }
1818d02deabac62c4a68a335a7b3141795466362b89Adam Powell
182696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void saveHierarchyState(Bundle outState) {
183696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        SparseArray<Parcelable> viewStates = new SparseArray<Parcelable>();
184696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (mMenuView != null) {
185696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            ((View) mMenuView).saveHierarchyState(viewStates);
186696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
187696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        outState.putSparseParcelableArray(VIEWS_TAG, viewStates);
188696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
189696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
190696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    public void restoreHierarchyState(Bundle inState) {
191696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        SparseArray<Parcelable> viewStates = inState.getSparseParcelableArray(VIEWS_TAG);
192f1a4549604639e3d9eafc406426ddc252d427b57Adam Powell        if (viewStates != null) {
193f1a4549604639e3d9eafc406426ddc252d427b57Adam Powell            ((View) mMenuView).restoreHierarchyState(viewStates);
194f1a4549604639e3d9eafc406426ddc252d427b57Adam Powell        }
195696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
19611ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell
19711ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    public void setId(int id) {
19811ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell        mId = id;
19911ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    }
20011ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell
20111ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    @Override
20211ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    public int getId() {
20311ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell        return mId;
20411ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    }
20511ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell
20611ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    @Override
20711ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    public Parcelable onSaveInstanceState() {
20811ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell        if (mMenuView == null) {
20911ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell            return null;
21011ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell        }
21111ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell
21211ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell        Bundle state = new Bundle();
21311ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell        saveHierarchyState(state);
21411ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell        return state;
21511ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    }
21611ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell
21711ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    @Override
21811ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    public void onRestoreInstanceState(Parcelable state) {
21911ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell        restoreHierarchyState((Bundle) state);
22011ed1d6cae9214335c92ac38498a4e6c7d1c8324Adam Powell    }
221696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
222696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    private class MenuAdapter extends BaseAdapter {
223275702c2f47ed87ab642462530092d9777f32ecdAdam Powell        private int mExpandedIndex = -1;
224275702c2f47ed87ab642462530092d9777f32ecdAdam Powell
225275702c2f47ed87ab642462530092d9777f32ecdAdam Powell        public MenuAdapter() {
226275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            findExpandedIndex();
227275702c2f47ed87ab642462530092d9777f32ecdAdam Powell        }
228275702c2f47ed87ab642462530092d9777f32ecdAdam Powell
229696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        public int getCount() {
23051195b56ff6d3d589abefde27f0a99b5a9a04ff8Adam Powell            ArrayList<MenuItemImpl> items = mMenu.getNonActionItems();
231275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            int count = items.size() - mItemIndexOffset;
232275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            if (mExpandedIndex < 0) {
233275702c2f47ed87ab642462530092d9777f32ecdAdam Powell                return count;
234275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            }
235275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            return count - 1;
236696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
237696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
238696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        public MenuItemImpl getItem(int position) {
23951195b56ff6d3d589abefde27f0a99b5a9a04ff8Adam Powell            ArrayList<MenuItemImpl> items = mMenu.getNonActionItems();
240275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            position += mItemIndexOffset;
241275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            if (mExpandedIndex >= 0 && position >= mExpandedIndex) {
242275702c2f47ed87ab642462530092d9777f32ecdAdam Powell                position++;
243275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            }
244275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            return items.get(position);
245696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
246696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
247696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        public long getItemId(int position) {
248696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            // Since a menu item's ID is optional, we'll use the position as an
249696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            // ID for the item in the AdapterView
250696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            return position;
251696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
252696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
253696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        public View getView(int position, View convertView, ViewGroup parent) {
254696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            if (convertView == null) {
255696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell                convertView = mInflater.inflate(mItemLayoutRes, parent, false);
256696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            }
257696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
258696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            MenuView.ItemView itemView = (MenuView.ItemView) convertView;
259696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            itemView.initialize(getItem(position), 0);
260696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            return convertView;
261696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        }
262275702c2f47ed87ab642462530092d9777f32ecdAdam Powell
263275702c2f47ed87ab642462530092d9777f32ecdAdam Powell        void findExpandedIndex() {
264275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            final MenuItemImpl expandedItem = mMenu.getExpandedItem();
265275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            if (expandedItem != null) {
266275702c2f47ed87ab642462530092d9777f32ecdAdam Powell                final ArrayList<MenuItemImpl> items = mMenu.getNonActionItems();
267275702c2f47ed87ab642462530092d9777f32ecdAdam Powell                final int count = items.size();
268275702c2f47ed87ab642462530092d9777f32ecdAdam Powell                for (int i = 0; i < count; i++) {
269275702c2f47ed87ab642462530092d9777f32ecdAdam Powell                    final MenuItemImpl item = items.get(i);
270275702c2f47ed87ab642462530092d9777f32ecdAdam Powell                    if (item == expandedItem) {
271275702c2f47ed87ab642462530092d9777f32ecdAdam Powell                        mExpandedIndex = i;
272275702c2f47ed87ab642462530092d9777f32ecdAdam Powell                        return;
273275702c2f47ed87ab642462530092d9777f32ecdAdam Powell                    }
274275702c2f47ed87ab642462530092d9777f32ecdAdam Powell                }
275275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            }
276275702c2f47ed87ab642462530092d9777f32ecdAdam Powell            mExpandedIndex = -1;
277275702c2f47ed87ab642462530092d9777f32ecdAdam Powell        }
278275702c2f47ed87ab642462530092d9777f32ecdAdam Powell
279275702c2f47ed87ab642462530092d9777f32ecdAdam Powell        @Override
28076889f3482d6391b17f0961f7356c1e8169c8813Adam Powell        public void notifyDataSetChanged() {
28176889f3482d6391b17f0961f7356c1e8169c8813Adam Powell            findExpandedIndex();
28276889f3482d6391b17f0961f7356c1e8169c8813Adam Powell            super.notifyDataSetChanged();
283275702c2f47ed87ab642462530092d9777f32ecdAdam Powell        }
284696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    }
285696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell}
286