|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 package org.mozilla.gecko.menu; |
|
6 |
|
7 import org.mozilla.gecko.R; |
|
8 import org.mozilla.gecko.widget.GeckoActionProvider; |
|
9 |
|
10 import android.content.Intent; |
|
11 import android.graphics.drawable.Drawable; |
|
12 import android.os.Build; |
|
13 import android.view.ActionProvider; |
|
14 import android.view.ContextMenu; |
|
15 import android.view.MenuItem; |
|
16 import android.view.SubMenu; |
|
17 import android.view.View; |
|
18 |
|
19 public class GeckoMenuItem implements MenuItem { |
|
20 private static final String LOGTAG = "GeckoMenuItem"; |
|
21 |
|
22 public static final int SHOW_AS_ACTION_NEVER = 0; |
|
23 public static final int SHOW_AS_ACTION_IF_ROOM = 1; |
|
24 public static final int SHOW_AS_ACTION_ALWAYS = 2; |
|
25 |
|
26 // A View that can show a MenuItem should be able to initialize from |
|
27 // the properties of the MenuItem. |
|
28 public static interface Layout { |
|
29 public void initialize(GeckoMenuItem item); |
|
30 public void setShowIcon(boolean show); |
|
31 } |
|
32 |
|
33 public static interface OnShowAsActionChangedListener { |
|
34 public boolean hasActionItemBar(); |
|
35 public void onShowAsActionChanged(GeckoMenuItem item); |
|
36 } |
|
37 |
|
38 private int mId; |
|
39 private int mOrder; |
|
40 private View mActionView; |
|
41 private int mActionEnum; |
|
42 private CharSequence mTitle; |
|
43 private CharSequence mTitleCondensed; |
|
44 private boolean mCheckable = false; |
|
45 private boolean mChecked = false; |
|
46 private boolean mVisible = true; |
|
47 private boolean mEnabled = true; |
|
48 private Drawable mIcon; |
|
49 private int mIconRes; |
|
50 private GeckoActionProvider mActionProvider; |
|
51 private GeckoMenu mMenu; |
|
52 private GeckoSubMenu mSubMenu; |
|
53 private MenuItem.OnMenuItemClickListener mMenuItemClickListener = null; |
|
54 private OnShowAsActionChangedListener mShowAsActionChangedListener; |
|
55 |
|
56 public GeckoMenuItem(GeckoMenu menu, int id, int order, int titleRes) { |
|
57 mMenu = menu; |
|
58 mId = id; |
|
59 mOrder = order; |
|
60 setTitle(titleRes); |
|
61 } |
|
62 |
|
63 public GeckoMenuItem(GeckoMenu menu, int id, int order, CharSequence title) { |
|
64 mMenu = menu; |
|
65 mId = id; |
|
66 mOrder = order; |
|
67 setTitle(title); |
|
68 } |
|
69 |
|
70 @Override |
|
71 public boolean collapseActionView() { |
|
72 return false; |
|
73 } |
|
74 |
|
75 @Override |
|
76 public boolean expandActionView() { |
|
77 return false; |
|
78 } |
|
79 |
|
80 public boolean hasActionProvider() { |
|
81 if (Build.VERSION.SDK_INT < 14) { |
|
82 return false; |
|
83 } |
|
84 |
|
85 return (mActionProvider != null); |
|
86 } |
|
87 |
|
88 public int getActionEnum() { |
|
89 return mActionEnum; |
|
90 } |
|
91 |
|
92 public GeckoActionProvider getGeckoActionProvider() { |
|
93 return mActionProvider; |
|
94 } |
|
95 |
|
96 @Override |
|
97 public ActionProvider getActionProvider() { |
|
98 return null; |
|
99 } |
|
100 |
|
101 @Override |
|
102 public View getActionView() { |
|
103 if (mActionProvider != null) { |
|
104 return mActionProvider.getView(); |
|
105 } |
|
106 |
|
107 return mActionView; |
|
108 } |
|
109 |
|
110 @Override |
|
111 public char getAlphabeticShortcut() { |
|
112 return 0; |
|
113 } |
|
114 |
|
115 @Override |
|
116 public int getGroupId() { |
|
117 return 0; |
|
118 } |
|
119 |
|
120 @Override |
|
121 public Drawable getIcon() { |
|
122 if (mIcon == null) { |
|
123 if (mIconRes != 0) |
|
124 return mMenu.getResources().getDrawable(mIconRes); |
|
125 else |
|
126 return null; |
|
127 } else { |
|
128 return mIcon; |
|
129 } |
|
130 } |
|
131 |
|
132 @Override |
|
133 public Intent getIntent() { |
|
134 return null; |
|
135 } |
|
136 |
|
137 @Override |
|
138 public int getItemId() { |
|
139 return mId; |
|
140 } |
|
141 |
|
142 @Override |
|
143 public ContextMenu.ContextMenuInfo getMenuInfo() { |
|
144 return null; |
|
145 } |
|
146 |
|
147 @Override |
|
148 public char getNumericShortcut() { |
|
149 return 0; |
|
150 } |
|
151 |
|
152 @Override |
|
153 public int getOrder() { |
|
154 return mOrder; |
|
155 } |
|
156 |
|
157 @Override |
|
158 public SubMenu getSubMenu() { |
|
159 return mSubMenu; |
|
160 } |
|
161 |
|
162 @Override |
|
163 public CharSequence getTitle() { |
|
164 return mTitle; |
|
165 } |
|
166 |
|
167 @Override |
|
168 public CharSequence getTitleCondensed() { |
|
169 return mTitleCondensed; |
|
170 } |
|
171 |
|
172 @Override |
|
173 public boolean hasSubMenu() { |
|
174 if (mActionProvider != null) |
|
175 return mActionProvider.hasSubMenu(); |
|
176 |
|
177 return (mSubMenu != null); |
|
178 } |
|
179 |
|
180 public boolean isActionItem() { |
|
181 return (mActionEnum > 0); |
|
182 } |
|
183 |
|
184 @Override |
|
185 public boolean isActionViewExpanded() { |
|
186 return false; |
|
187 } |
|
188 |
|
189 @Override |
|
190 public boolean isCheckable() { |
|
191 return mCheckable; |
|
192 } |
|
193 |
|
194 @Override |
|
195 public boolean isChecked() { |
|
196 return mChecked; |
|
197 } |
|
198 |
|
199 @Override |
|
200 public boolean isEnabled() { |
|
201 return mEnabled; |
|
202 } |
|
203 |
|
204 @Override |
|
205 public boolean isVisible() { |
|
206 return mVisible; |
|
207 } |
|
208 |
|
209 @Override |
|
210 public MenuItem setActionProvider(ActionProvider actionProvider) { |
|
211 return this; |
|
212 } |
|
213 |
|
214 public MenuItem setActionProvider(GeckoActionProvider actionProvider) { |
|
215 mActionProvider = actionProvider; |
|
216 if (mActionProvider != null) { |
|
217 actionProvider.setOnTargetSelectedListener(new GeckoActionProvider.OnTargetSelectedListener() { |
|
218 @Override |
|
219 public void onTargetSelected() { |
|
220 mMenu.close(); |
|
221 |
|
222 // Refresh the menu item to show the high frequency apps. |
|
223 mShowAsActionChangedListener.onShowAsActionChanged(GeckoMenuItem.this); |
|
224 } |
|
225 }); |
|
226 } |
|
227 |
|
228 mShowAsActionChangedListener.onShowAsActionChanged(this); |
|
229 return this; |
|
230 } |
|
231 |
|
232 @Override |
|
233 public MenuItem setActionView(int resId) { |
|
234 return this; |
|
235 } |
|
236 |
|
237 @Override |
|
238 public MenuItem setActionView(View view) { |
|
239 return this; |
|
240 } |
|
241 |
|
242 @Override |
|
243 public MenuItem setAlphabeticShortcut(char alphaChar) { |
|
244 return this; |
|
245 } |
|
246 |
|
247 @Override |
|
248 public MenuItem setCheckable(boolean checkable) { |
|
249 mCheckable = checkable; |
|
250 mMenu.onItemChanged(this); |
|
251 return this; |
|
252 } |
|
253 |
|
254 @Override |
|
255 public MenuItem setChecked(boolean checked) { |
|
256 mChecked = checked; |
|
257 mMenu.onItemChanged(this); |
|
258 return this; |
|
259 } |
|
260 |
|
261 @Override |
|
262 public MenuItem setEnabled(boolean enabled) { |
|
263 mEnabled = enabled; |
|
264 mMenu.onItemChanged(this); |
|
265 return this; |
|
266 } |
|
267 |
|
268 @Override |
|
269 public MenuItem setIcon(Drawable icon) { |
|
270 mIcon = icon; |
|
271 mMenu.onItemChanged(this); |
|
272 return this; |
|
273 } |
|
274 |
|
275 @Override |
|
276 public MenuItem setIcon(int iconRes) { |
|
277 mIconRes = iconRes; |
|
278 mMenu.onItemChanged(this); |
|
279 return this; |
|
280 } |
|
281 |
|
282 @Override |
|
283 public MenuItem setIntent(Intent intent) { |
|
284 return this; |
|
285 } |
|
286 |
|
287 @Override |
|
288 public MenuItem setNumericShortcut(char numericChar) { |
|
289 return this; |
|
290 } |
|
291 |
|
292 @Override |
|
293 public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) { |
|
294 return this; |
|
295 } |
|
296 |
|
297 @Override |
|
298 public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener menuItemClickListener) { |
|
299 mMenuItemClickListener = menuItemClickListener; |
|
300 return this; |
|
301 } |
|
302 |
|
303 @Override |
|
304 public MenuItem setShortcut(char numericChar, char alphaChar) { |
|
305 return this; |
|
306 } |
|
307 |
|
308 @Override |
|
309 public void setShowAsAction(int actionEnum) { |
|
310 setShowAsAction(actionEnum, 0); |
|
311 } |
|
312 |
|
313 public void setShowAsAction(int actionEnum, int style) { |
|
314 if (mShowAsActionChangedListener == null) |
|
315 return; |
|
316 |
|
317 if (mActionEnum == actionEnum) |
|
318 return; |
|
319 |
|
320 if (actionEnum > 0) { |
|
321 if (!mShowAsActionChangedListener.hasActionItemBar()) |
|
322 return; |
|
323 |
|
324 if (!hasActionProvider()) { |
|
325 // Change the type to just an icon |
|
326 MenuItemActionBar actionView; |
|
327 if (style != 0) { |
|
328 actionView = new MenuItemActionBar(mMenu.getContext(), null, style); |
|
329 } else { |
|
330 if (actionEnum == SHOW_AS_ACTION_ALWAYS) { |
|
331 actionView = new MenuItemActionBar(mMenu.getContext()); |
|
332 } else { |
|
333 actionView = new MenuItemActionBar(mMenu.getContext(), null, R.attr.menuItemSecondaryActionBarStyle); |
|
334 } |
|
335 } |
|
336 |
|
337 actionView.initialize(this); |
|
338 mActionView = actionView; |
|
339 } |
|
340 |
|
341 mActionEnum = actionEnum; |
|
342 } |
|
343 |
|
344 mShowAsActionChangedListener.onShowAsActionChanged(this); |
|
345 } |
|
346 |
|
347 @Override |
|
348 public MenuItem setShowAsActionFlags(int actionEnum) { |
|
349 return this; |
|
350 } |
|
351 |
|
352 public MenuItem setSubMenu(GeckoSubMenu subMenu) { |
|
353 mSubMenu = subMenu; |
|
354 return this; |
|
355 } |
|
356 |
|
357 @Override |
|
358 public MenuItem setTitle(CharSequence title) { |
|
359 mTitle = title; |
|
360 mMenu.onItemChanged(this); |
|
361 return this; |
|
362 } |
|
363 |
|
364 @Override |
|
365 public MenuItem setTitle(int title) { |
|
366 mTitle = mMenu.getResources().getString(title); |
|
367 mMenu.onItemChanged(this); |
|
368 return this; |
|
369 } |
|
370 |
|
371 @Override |
|
372 public MenuItem setTitleCondensed(CharSequence title) { |
|
373 mTitleCondensed = title; |
|
374 return this; |
|
375 } |
|
376 |
|
377 @Override |
|
378 public MenuItem setVisible(boolean visible) { |
|
379 mVisible = visible; |
|
380 mMenu.onItemChanged(this); |
|
381 return this; |
|
382 } |
|
383 |
|
384 public boolean invoke() { |
|
385 if (mMenuItemClickListener != null) |
|
386 return mMenuItemClickListener.onMenuItemClick(this); |
|
387 else |
|
388 return false; |
|
389 } |
|
390 |
|
391 public void setOnShowAsActionChangedListener(OnShowAsActionChangedListener listener) { |
|
392 mShowAsActionChangedListener = listener; |
|
393 } |
|
394 } |