1/*
2 * Copyright (C) 2013 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 androidx.core.internal.view;
18
19import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
20
21import android.content.res.ColorStateList;
22import android.graphics.PorterDuff;
23import android.graphics.drawable.Drawable;
24import android.view.MenuItem;
25import android.view.View;
26
27import androidx.annotation.RestrictTo;
28import androidx.core.view.ActionProvider;
29
30/**
31 * Interface for direct access to a previously created menu item.
32 *
33 * This version extends the one available in the framework to ensures that any necessary
34 * elements added in later versions of the framework, are available for all platforms.
35 *
36 * @see android.view.MenuItem
37 * @hide
38 */
39@RestrictTo(LIBRARY_GROUP)
40public interface SupportMenuItem extends android.view.MenuItem {
41    /*
42    * These should be kept in sync with attrs.xml enum constants for showAsAction
43    */
44    /**
45     * Never show this item as a button in an Action Bar.
46     */
47    int SHOW_AS_ACTION_NEVER = 0;
48    /**
49     * Show this item as a button in an Action Bar if the system decides there is room for it.
50     */
51    int SHOW_AS_ACTION_IF_ROOM = 1;
52    /**
53     * Always show this item as a button in an Action Bar.
54     * Use sparingly! If too many items are set to always show in the Action Bar it can
55     * crowd the Action Bar and degrade the user experience on devices with smaller screens.
56     * A good rule of thumb is to have no more than 2 items set to always show at a time.
57     */
58    int SHOW_AS_ACTION_ALWAYS = 2;
59
60    /**
61     * When this item is in the action bar, always show it with a text label even if it also has an
62     * icon specified.
63     */
64    int SHOW_AS_ACTION_WITH_TEXT = 4;
65
66    /**
67     * This item's action view collapses to a normal menu item. When expanded, the action view
68     * temporarily takes over a larger segment of its container.
69     */
70    int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8;
71
72    /**
73     * Sets how this item should display in the presence of an Action Bar. The parameter actionEnum
74     * is a flag set. One of {@link #SHOW_AS_ACTION_ALWAYS}, {@link #SHOW_AS_ACTION_IF_ROOM}, or
75     * {@link #SHOW_AS_ACTION_NEVER} should be used, and you may optionally OR the value with {@link
76     * #SHOW_AS_ACTION_WITH_TEXT}. SHOW_AS_ACTION_WITH_TEXT requests that when the item is shown as
77     * an action, it should be shown with a text label.
78     *
79     * @param actionEnum How the item should display. One of {@link #SHOW_AS_ACTION_ALWAYS}, {@link
80     *                   #SHOW_AS_ACTION_IF_ROOM}, or {@link #SHOW_AS_ACTION_NEVER}.
81     *                   SHOW_AS_ACTION_NEVER is the default.
82     * @see android.app.ActionBar
83     * @see #setActionView(View)
84     */
85    @Override
86    void setShowAsAction(int actionEnum);
87
88    /**
89     * Sets how this item should display in the presence of an Action Bar.
90     * The parameter actionEnum is a flag set. One of {@link #SHOW_AS_ACTION_ALWAYS},
91     * {@link #SHOW_AS_ACTION_IF_ROOM}, or {@link #SHOW_AS_ACTION_NEVER} should
92     * be used, and you may optionally OR the value with {@link #SHOW_AS_ACTION_WITH_TEXT}.
93     * SHOW_AS_ACTION_WITH_TEXT requests that when the item is shown as an action,
94     * it should be shown with a text label.
95     *
96     * <p>Note: This method differs from {@link #setShowAsAction(int)} only in that it
97     * returns the current MenuItem instance for call chaining.
98     *
99     * @param actionEnum How the item should display. One of {@link #SHOW_AS_ACTION_ALWAYS}, {@link
100     *                   #SHOW_AS_ACTION_IF_ROOM}, or {@link #SHOW_AS_ACTION_NEVER}.
101     *                   SHOW_AS_ACTION_NEVER is the default.
102     * @return This MenuItem instance for call chaining.
103     * @see android.app.ActionBar
104     * @see #setActionView(View)
105     */
106    @Override
107    MenuItem setShowAsActionFlags(int actionEnum);
108
109    /**
110     * Set an action view for this menu item. An action view will be displayed in place
111     * of an automatically generated menu item element in the UI when this item is shown
112     * as an action within a parent.
113     *
114     * <p><strong>Note:</strong> Setting an action view overrides the action provider
115     * provider set via {@link #setSupportActionProvider(androidx.core.view.ActionProvider)}. </p>
116     *
117     * @param view View to use for presenting this item to the user.
118     * @return This Item so additional setters can be called.
119     * @see #setShowAsAction(int)
120     */
121    @Override
122    MenuItem setActionView(View view);
123
124    /**
125     * Set an action view for this menu item. An action view will be displayed in place
126     * of an automatically generated menu item element in the UI when this item is shown
127     * as an action within a parent.
128     *
129     * <p><strong>Note:</strong> Setting an action view overrides the action provider
130     * provider set via {@link #setSupportActionProvider(androidx.core.view.ActionProvider)}. </p>
131     *
132     * @param resId Layout resource to use for presenting this item to the user.
133     * @return This Item so additional setters can be called.
134     * @see #setShowAsAction(int)
135     */
136    @Override
137    MenuItem setActionView(int resId);
138
139    /**
140     * Returns the currently set action view for this menu item.
141     *
142     * @return This item's action view
143     * @see #setActionView(View)
144     * @see #setShowAsAction(int)
145     */
146    @Override
147    View getActionView();
148
149    /**
150     * Sets the {@link androidx.core.view.ActionProvider} responsible for creating an action view if
151     * the item is placed on the action bar. The provider also provides a default
152     * action invoked if the item is placed in the overflow menu.
153     *
154     * <p><strong>Note:</strong> Setting an action provider overrides the action view
155     * set via {@link #setActionView(int)} or {@link #setActionView(View)}.
156     * </p>
157     *
158     * @param actionProvider The action provider.
159     * @return This Item so additional setters can be called.
160     * @see androidx.core.view.ActionProvider
161     */
162    SupportMenuItem setSupportActionProvider(ActionProvider actionProvider);
163
164    /**
165     * Gets the {@link ActionProvider}.
166     *
167     * @return The action provider.
168     * @see ActionProvider
169     * @see #setSupportActionProvider(ActionProvider)
170     */
171    ActionProvider getSupportActionProvider();
172
173    /**
174     * Expand the action view associated with this menu item. The menu item must have an action view
175     * set, as well as the showAsAction flag {@link #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}. If a
176     * listener has been set using
177     * {@link #setSupportOnActionExpandListener(MenuItem.OnActionExpandListener)}
178     * it will have its {@link MenuItem.OnActionExpandListener#onMenuItemActionExpand(MenuItem)}
179     * method invoked. The listener may return false from this method to prevent expanding the
180     * action view.
181     *
182     * @return true if the action view was expanded, false otherwise.
183     */
184    @Override
185    boolean expandActionView();
186
187    /**
188     * Collapse the action view associated with this menu item. The menu item must have an action
189     * view set, as well as the showAsAction flag {@link #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}. If a
190     * listener has been set using
191     * {@link #setSupportOnActionExpandListener(MenuItem.OnActionExpandListener)}
192     * it will have its {@link MenuItem.OnActionExpandListener#onMenuItemActionCollapse(MenuItem)}
193     * method invoked. The listener may return false from this method to prevent collapsing the
194     * action view.
195     *
196     * @return true if the action view was collapsed, false otherwise.
197     */
198    @Override
199    boolean collapseActionView();
200
201    /**
202     * Returns true if this menu item's action view has been expanded.
203     *
204     * @return true if the item's action view is expanded, false otherwise.
205     * @see #expandActionView()
206     * @see #collapseActionView()
207     * @see #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW
208     * @see MenuItem.OnActionExpandListener
209     */
210    @Override
211    boolean isActionViewExpanded();
212
213    /**
214     * Change the content description associated with this menu item.
215     *
216     * @param contentDescription The new content description.
217     * @return This menu item instance for call chaining.
218     */
219    @Override
220    SupportMenuItem setContentDescription(CharSequence contentDescription);
221
222    /**
223     * Retrieve the content description associated with this menu item.
224     *
225     * @return The content description.
226     */
227    @Override
228    CharSequence getContentDescription();
229
230    /**
231     * Change the tooltip text associated with this menu item.
232     *
233     * @param tooltipText The new tooltip text.
234     * @return This menu item instance for call chaining.
235     */
236    @Override
237    SupportMenuItem setTooltipText(CharSequence tooltipText);
238
239    /**
240     * Retrieve the tooltip text associated with this menu item.
241     *
242     * @return The tooltip text.
243     */
244    @Override
245    CharSequence getTooltipText();
246
247    /**
248     * Change both the numeric and alphabetic shortcut associated with this
249     * item. Note that the shortcut will be triggered when the key that
250     * generates the given character is pressed along with the corresponding
251     * modifier key. Also note that case is not significant and that alphabetic
252     * shortcut characters will be handled in lower case.
253     * <p>
254     * See {@link Menu} for the menu types that support shortcuts.
255     *
256     * @param numericChar The numeric shortcut key. This is the shortcut when
257     *        using a numeric (e.g., 12-key) keyboard.
258     * @param numericModifiers The numeric modifier associated with the shortcut. It should
259     *        be a combination of {@link KeyEvent#META_META_ON}, {@link KeyEvent#META_CTRL_ON},
260     *        {@link KeyEvent#META_ALT_ON}, {@link KeyEvent#META_SHIFT_ON},
261     *        {@link KeyEvent#META_SYM_ON}, {@link KeyEvent#META_FUNCTION_ON}.
262     * @param alphaChar The alphabetic shortcut key. This is the shortcut when
263     *        using a keyboard with alphabetic keys.
264     * @param alphaModifiers The alphabetic modifier associated with the shortcut. It should
265     *        be a combination of {@link KeyEvent#META_META_ON}, {@link KeyEvent#META_CTRL_ON},
266     *        {@link KeyEvent#META_ALT_ON}, {@link KeyEvent#META_SHIFT_ON},
267     *        {@link KeyEvent#META_SYM_ON}, {@link KeyEvent#META_FUNCTION_ON}.
268     * @return This Item so additional setters can be called.
269     */
270    @Override
271    MenuItem setShortcut(char numericChar, char alphaChar, int numericModifiers,
272            int alphaModifiers);
273
274    /**
275     * Change the numeric shortcut and modifiers associated with this item.
276     * <p>
277     * See {@link Menu} for the menu types that support shortcuts.
278     *
279     * @param numericChar The numeric shortcut key.  This is the shortcut when
280     *                 using a 12-key (numeric) keyboard.
281     * @param numericModifiers The modifier associated with the shortcut. It should
282     *        be a combination of {@link KeyEvent#META_META_ON}, {@link KeyEvent#META_CTRL_ON},
283     *        {@link KeyEvent#META_ALT_ON}, {@link KeyEvent#META_SHIFT_ON},
284     *        {@link KeyEvent#META_SYM_ON}, {@link KeyEvent#META_FUNCTION_ON}.
285     * @return This Item so additional setters can be called.
286     */
287    @Override
288    MenuItem setNumericShortcut(char numericChar, int numericModifiers);
289
290    /**
291     * Return the modifiers for this menu item's numeric (12-key) shortcut.
292     * The modifier is a combination of {@link KeyEvent#META_META_ON},
293     * {@link KeyEvent#META_CTRL_ON}, {@link KeyEvent#META_ALT_ON},
294     * {@link KeyEvent#META_SHIFT_ON}, {@link KeyEvent#META_SYM_ON},
295     * {@link KeyEvent#META_FUNCTION_ON}.
296     * For example, {@link KeyEvent#META_FUNCTION_ON}|{@link KeyEvent#META_CTRL_ON}
297     *
298     * @return Modifier associated with the numeric shortcut.
299     */
300    @Override
301    int getNumericModifiers();
302
303    /**
304     * Change the alphabetic shortcut associated with this item. The shortcut
305     * will be triggered when the key that generates the given character is
306     * pressed along with the modifier keys. Case is not significant and shortcut
307     * characters will be displayed in lower case. Note that menu items with
308     * the characters '\b' or '\n' as shortcuts will get triggered by the
309     * Delete key or Carriage Return key, respectively.
310     * <p>
311     * See {@link Menu} for the menu types that support shortcuts.
312     *
313     * @param alphaChar The alphabetic shortcut key. This is the shortcut when
314     *        using a keyboard with alphabetic keys.
315     * @param alphaModifiers The modifier associated with the shortcut. It should
316     *        be a combination of {@link KeyEvent#META_META_ON}, {@link KeyEvent#META_CTRL_ON},
317     *        {@link KeyEvent#META_ALT_ON}, {@link KeyEvent#META_SHIFT_ON},
318     *        {@link KeyEvent#META_SYM_ON}, {@link KeyEvent#META_FUNCTION_ON}.
319     * @return This Item so additional setters can be called.
320     */
321    @Override
322    MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers);
323
324    /**
325     * Return the modifier for this menu item's alphabetic shortcut.
326     * The modifier is a combination of {@link KeyEvent#META_META_ON},
327     * {@link KeyEvent#META_CTRL_ON}, {@link KeyEvent#META_ALT_ON},
328     * {@link KeyEvent#META_SHIFT_ON}, {@link KeyEvent#META_SYM_ON},
329     * {@link KeyEvent#META_FUNCTION_ON}.
330     * For example, {@link KeyEvent#META_FUNCTION_ON}|{@link KeyEvent#META_CTRL_ON}
331     *
332     * @return Modifier associated with the keyboard shortcut.
333     */
334    @Override
335    int getAlphabeticModifiers();
336
337    /**
338     * Applies a tint to this item's icon. Does not modify the
339     * current tint mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
340     * <p>
341     * Subsequent calls to {@link MenuItem#setIcon(Drawable)} or {@link MenuItem#setIcon(int)} will
342     * automatically mutate the icon and apply the specified tint and
343     * tint mode.
344     *
345     * @param tint the tint to apply, may be {@code null} to clear tint
346     *
347     * @see #getIconTintList()
348     */
349    @Override
350    MenuItem setIconTintList(ColorStateList tint);
351
352    /**
353     * @return the tint applied to this item's icon
354     * @see #setIconTintList(ColorStateList)
355     */
356    @Override
357    ColorStateList getIconTintList();
358
359    /**
360     * Specifies the blending mode used to apply the tint specified by
361     * {@link #setIconTintList(ColorStateList)} to this item's icon. The default mode is
362     * {@link PorterDuff.Mode#SRC_IN}.
363     *
364     * @param tintMode the blending mode used to apply the tint, may be
365     *                 {@code null} to clear tint
366     * @see #setIconTintList(ColorStateList)
367     */
368    @Override
369    MenuItem setIconTintMode(PorterDuff.Mode tintMode);
370
371    /**
372     * Returns the blending mode used to apply the tint to this item's icon, if specified.
373     *
374     * @return the blending mode used to apply the tint to this item's icon
375     * @see #setIconTintMode(PorterDuff.Mode)
376     */
377    @Override
378    PorterDuff.Mode getIconTintMode();
379}