1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.support.v7.internal.view.menu;
18
19import android.content.Context;
20import android.content.Intent;
21import android.graphics.drawable.Drawable;
22import android.support.v4.content.ContextCompat;
23import android.support.v4.view.ActionProvider;
24import android.support.v4.internal.view.SupportMenuItem;
25import android.support.v4.view.MenuItemCompat;
26import android.view.ContextMenu.ContextMenuInfo;
27import android.view.MenuItem;
28import android.view.SubMenu;
29import android.view.View;
30
31/**
32 * @hide
33 */
34public class ActionMenuItem implements SupportMenuItem {
35
36    private final int mId;
37    private final int mGroup;
38    private final int mCategoryOrder;
39    private final int mOrdering;
40
41    private CharSequence mTitle;
42    private CharSequence mTitleCondensed;
43    private Intent mIntent;
44    private char mShortcutNumericChar;
45    private char mShortcutAlphabeticChar;
46
47    private Drawable mIconDrawable;
48    private int mIconResId = NO_ICON;
49
50    private Context mContext;
51
52    private SupportMenuItem.OnMenuItemClickListener mClickListener;
53
54    private static final int NO_ICON = 0;
55
56    private int mFlags = ENABLED;
57    private static final int CHECKABLE = 0x00000001;
58    private static final int CHECKED = 0x00000002;
59    private static final int EXCLUSIVE = 0x00000004;
60    private static final int HIDDEN = 0x00000008;
61    private static final int ENABLED = 0x00000010;
62
63    public ActionMenuItem(Context context, int group, int id, int categoryOrder, int ordering,
64            CharSequence title) {
65        mContext = context;
66        mId = id;
67        mGroup = group;
68        mCategoryOrder = categoryOrder;
69        mOrdering = ordering;
70        mTitle = title;
71    }
72
73    public char getAlphabeticShortcut() {
74        return mShortcutAlphabeticChar;
75    }
76
77    public int getGroupId() {
78        return mGroup;
79    }
80
81    public Drawable getIcon() {
82        return mIconDrawable;
83    }
84
85    public Intent getIntent() {
86        return mIntent;
87    }
88
89    public int getItemId() {
90        return mId;
91    }
92
93    public ContextMenuInfo getMenuInfo() {
94        return null;
95    }
96
97    public char getNumericShortcut() {
98        return mShortcutNumericChar;
99    }
100
101    public int getOrder() {
102        return mOrdering;
103    }
104
105    public SubMenu getSubMenu() {
106        return null;
107    }
108
109    public CharSequence getTitle() {
110        return mTitle;
111    }
112
113    public CharSequence getTitleCondensed() {
114        return mTitleCondensed != null ? mTitleCondensed : mTitle;
115    }
116
117    public boolean hasSubMenu() {
118        return false;
119    }
120
121    public boolean isCheckable() {
122        return (mFlags & CHECKABLE) != 0;
123    }
124
125    public boolean isChecked() {
126        return (mFlags & CHECKED) != 0;
127    }
128
129    public boolean isEnabled() {
130        return (mFlags & ENABLED) != 0;
131    }
132
133    public boolean isVisible() {
134        return (mFlags & HIDDEN) == 0;
135    }
136
137    public MenuItem setAlphabeticShortcut(char alphaChar) {
138        mShortcutAlphabeticChar = alphaChar;
139        return this;
140    }
141
142    public MenuItem setCheckable(boolean checkable) {
143        mFlags = (mFlags & ~CHECKABLE) | (checkable ? CHECKABLE : 0);
144        return this;
145    }
146
147    public ActionMenuItem setExclusiveCheckable(boolean exclusive) {
148        mFlags = (mFlags & ~EXCLUSIVE) | (exclusive ? EXCLUSIVE : 0);
149        return this;
150    }
151
152    public MenuItem setChecked(boolean checked) {
153        mFlags = (mFlags & ~CHECKED) | (checked ? CHECKED : 0);
154        return this;
155    }
156
157    public MenuItem setEnabled(boolean enabled) {
158        mFlags = (mFlags & ~ENABLED) | (enabled ? ENABLED : 0);
159        return this;
160    }
161
162    public MenuItem setIcon(Drawable icon) {
163        mIconDrawable = icon;
164        mIconResId = NO_ICON;
165        return this;
166    }
167
168    public MenuItem setIcon(int iconRes) {
169        mIconResId = iconRes;
170        mIconDrawable = ContextCompat.getDrawable(mContext, iconRes);
171        return this;
172    }
173
174    public MenuItem setIntent(Intent intent) {
175        mIntent = intent;
176        return this;
177    }
178
179    public MenuItem setNumericShortcut(char numericChar) {
180        mShortcutNumericChar = numericChar;
181        return this;
182    }
183
184    public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {
185        mClickListener = menuItemClickListener;
186        return this;
187    }
188
189    public MenuItem setShortcut(char numericChar, char alphaChar) {
190        mShortcutNumericChar = numericChar;
191        mShortcutAlphabeticChar = alphaChar;
192        return this;
193    }
194
195    public MenuItem setTitle(CharSequence title) {
196        mTitle = title;
197        return this;
198    }
199
200    public MenuItem setTitle(int title) {
201        mTitle = mContext.getResources().getString(title);
202        return this;
203    }
204
205    public MenuItem setTitleCondensed(CharSequence title) {
206        mTitleCondensed = title;
207        return this;
208    }
209
210    public MenuItem setVisible(boolean visible) {
211        mFlags = (mFlags & HIDDEN) | (visible ? 0 : HIDDEN);
212        return this;
213    }
214
215    public boolean invoke() {
216        if (mClickListener != null && mClickListener.onMenuItemClick(this)) {
217            return true;
218        }
219
220        if (mIntent != null) {
221            mContext.startActivity(mIntent);
222            return true;
223        }
224
225        return false;
226    }
227
228    public void setShowAsAction(int show) {
229        // Do nothing. ActionMenuItems always show as action buttons.
230    }
231
232    public SupportMenuItem setActionView(View actionView) {
233        throw new UnsupportedOperationException();
234    }
235
236    public View getActionView() {
237        return null;
238    }
239
240    @Override
241    public MenuItem setActionProvider(android.view.ActionProvider actionProvider) {
242        throw new UnsupportedOperationException();
243    }
244
245    @Override
246    public android.view.ActionProvider getActionProvider() {
247        throw new UnsupportedOperationException();
248    }
249
250    @Override
251    public SupportMenuItem setActionView(int resId) {
252        throw new UnsupportedOperationException();
253    }
254
255    @Override
256    public ActionProvider getSupportActionProvider() {
257        return null;
258    }
259
260    @Override
261    public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) {
262        throw new UnsupportedOperationException();
263    }
264
265    @Override
266    public SupportMenuItem setShowAsActionFlags(int actionEnum) {
267        setShowAsAction(actionEnum);
268        return this;
269    }
270
271    @Override
272    public boolean expandActionView() {
273        return false;
274    }
275
276    @Override
277    public boolean collapseActionView() {
278        return false;
279    }
280
281    @Override
282    public boolean isActionViewExpanded() {
283        return false;
284    }
285
286    @Override
287    public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) {
288        throw new UnsupportedOperationException();
289    }
290
291    @Override
292    public SupportMenuItem setSupportOnActionExpandListener(MenuItemCompat.OnActionExpandListener listener) {
293        // No need to save the listener; ActionMenuItem does not support collapsing items.
294        return this;
295    }
296}
297