1/*
2 * Copyright (C) 2012 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.app;
18
19import android.content.Context;
20import android.content.res.Configuration;
21import android.content.res.TypedArray;
22import android.graphics.drawable.Drawable;
23import android.support.annotation.DrawableRes;
24import android.support.annotation.IntDef;
25import android.support.annotation.NonNull;
26import android.support.annotation.Nullable;
27import android.support.annotation.StringRes;
28import android.support.v4.app.Fragment;
29import android.support.v4.app.FragmentManager;
30import android.support.v4.app.FragmentTransaction;
31import android.support.v4.view.GravityCompat;
32import android.support.v7.appcompat.R;
33import android.support.v7.view.ActionMode;
34import android.util.AttributeSet;
35import android.view.Gravity;
36import android.view.KeyEvent;
37import android.view.View;
38import android.view.ViewGroup;
39import android.view.Window;
40import android.widget.SpinnerAdapter;
41
42import java.lang.annotation.Retention;
43import java.lang.annotation.RetentionPolicy;
44
45/**
46 * A primary toolbar within the activity that may display the activity title, application-level
47 * navigation affordances, and other interactive items.
48 *
49 * <p>The action bar appears at the top of an activity's window when the activity uses the
50 * AppCompat's {@link R.style#Theme_AppCompat AppCompat} theme (or one of its descendant themes).
51 * You may otherwise add the action bar by calling {@link
52 * AppCompatDelegate#requestWindowFeature(int)  requestFeature(FEATURE_SUPPORT_ACTION_BAR)} or by
53 * declaring it in a custom theme with the {@link R.styleable#Theme_windowActionBar windowActionBar}
54 * property.
55 * </p>
56 *
57 * <p>The action bar may be represented by any Toolbar widget within the application layout.
58 * The application may signal to the Activity which Toolbar should be treated as the Activity's
59 * action bar. Activities that use this feature should use one of the supplied
60 * <code>.NoActionBar</code> themes, set the
61 * {@link R.styleable#Theme_windowActionBar windowActionBar} attribute to <code>false</code>
62 * or otherwise not request the window feature.</p>
63 *
64 * <p>If your activity has an options menu, you can make select items accessible directly from the
65 * action bar as "action items". You can also  modify various characteristics of the action bar or
66 * remove it completely.</p>
67 *
68 * <p>The navigation button (formerly "Home") takes over the space previously occupied by the
69 * application icon. Apps wishing to express a stronger branding should use their brand colors
70 * heavily in the action bar and other application chrome or use a {@link #setLogo(int) logo}
71 * in place of their standard title text.</p>
72 *
73 * <p>From your activity, you can retrieve an instance of {@link ActionBar} by calling {@link
74 * AppCompatActivity#getSupportActionBar()}  getSupportActionBar()}.</p>
75 *
76 * <p>In some cases, the action bar may be overlayed by another bar that enables contextual actions,
77 * using an {@link ActionMode}. For example, when the user selects one or more items in
78 * your activity, you can enable an action mode that offers actions specific to the selected
79 * items, with a UI that temporarily replaces the action bar. Although the UI may occupy the
80 * same space, the {@link ActionMode} APIs are distinct and independent from those for
81 * {@link ActionBar}.</p>
82 *
83 * <div class="special reference">
84 * <h3>Developer Guides</h3>
85 * <p>For information about how to use the action bar, including how to add action items, navigation
86 * modes and more, read the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action
87 * Bar</a> developer guide.</p>
88 * </div>
89 */
90public abstract class ActionBar {
91
92    /** @hide */
93    @Retention(RetentionPolicy.SOURCE)
94    @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
95    public @interface NavigationMode {}
96
97    /**
98     * Standard navigation mode. Consists of either a logo or icon
99     * and title text with an optional subtitle. Clicking any of these elements
100     * will dispatch onOptionsItemSelected to the host Activity with
101     * a MenuItem with item ID android.R.id.home.
102     *
103     * @deprecated Action bar navigation modes are deprecated and not supported by inline
104     * toolbar action bars. Consider using other
105     * <a href="http://developer.android.com/design/patterns/navigation.html">common
106     * navigation patterns</a> instead.
107     */
108    public static final int NAVIGATION_MODE_STANDARD = 0;
109
110    /**
111     * List navigation mode. Instead of static title text this mode
112     * presents a list menu for navigation within the activity.
113     * e.g. this might be presented to the user as a dropdown list.
114     *
115     * @deprecated Action bar navigation modes are deprecated and not supported by inline
116     * toolbar action bars. Consider using other
117     * <a href="http://developer.android.com/design/patterns/navigation.html">common
118     * navigation patterns</a> instead.
119     */
120    public static final int NAVIGATION_MODE_LIST = 1;
121
122    /**
123     * Tab navigation mode. Instead of static title text this mode
124     * presents a series of tabs for navigation within the activity.
125     *
126     * @deprecated Action bar navigation modes are deprecated and not supported by inline
127     * toolbar action bars. Consider using other
128     * <a href="http://developer.android.com/design/patterns/navigation.html">common
129     * navigation patterns</a> instead.
130     */
131    public static final int NAVIGATION_MODE_TABS = 2;
132
133    /** @hide */
134    @IntDef(flag=true, value={
135            DISPLAY_USE_LOGO,
136            DISPLAY_SHOW_HOME,
137            DISPLAY_HOME_AS_UP,
138            DISPLAY_SHOW_TITLE,
139            DISPLAY_SHOW_CUSTOM
140    })
141    @Retention(RetentionPolicy.SOURCE)
142    public @interface DisplayOptions {}
143
144    /**
145     * Use logo instead of icon if available. This flag will cause appropriate
146     * navigation modes to use a wider logo in place of the standard icon.
147     *
148     * @see #setDisplayOptions(int)
149     * @see #setDisplayOptions(int, int)
150     */
151    public static final int DISPLAY_USE_LOGO = 0x1;
152
153    /**
154     * Show 'home' elements in this action bar, leaving more space for other
155     * navigation elements. This includes logo and icon.
156     *
157     * @see #setDisplayOptions(int)
158     * @see #setDisplayOptions(int, int)
159     */
160    public static final int DISPLAY_SHOW_HOME = 0x2;
161
162    /**
163     * Display the 'home' element such that it appears as an 'up' affordance.
164     * e.g. show an arrow to the left indicating the action that will be taken.
165     *
166     * Set this flag if selecting the 'home' button in the action bar to return
167     * up by a single level in your UI rather than back to the top level or front page.
168     *
169     * <p>Setting this option will implicitly enable interaction with the home/up
170     * button. See {@link #setHomeButtonEnabled(boolean)}.
171     *
172     * @see #setDisplayOptions(int)
173     * @see #setDisplayOptions(int, int)
174     */
175    public static final int DISPLAY_HOME_AS_UP = 0x4;
176
177    /**
178     * Show the activity title and subtitle, if present.
179     *
180     * @see #setTitle(CharSequence)
181     * @see #setTitle(int)
182     * @see #setSubtitle(CharSequence)
183     * @see #setSubtitle(int)
184     * @see #setDisplayOptions(int)
185     * @see #setDisplayOptions(int, int)
186     */
187    public static final int DISPLAY_SHOW_TITLE = 0x8;
188
189    /**
190     * Show the custom view if one has been set.
191     *
192     * @see #setCustomView(View)
193     * @see #setDisplayOptions(int)
194     * @see #setDisplayOptions(int, int)
195     */
196    public static final int DISPLAY_SHOW_CUSTOM = 0x10;
197
198    /**
199     * Set the action bar into custom navigation mode, supplying a view
200     * for custom navigation.
201     *
202     * Custom navigation views appear between the application icon and
203     * any action buttons and may use any space available there. Common
204     * use cases for custom navigation views might include an auto-suggesting
205     * address bar for a browser or other navigation mechanisms that do not
206     * translate well to provided navigation modes.
207     *
208     * @param view Custom navigation view to place in the ActionBar.
209     */
210    public abstract void setCustomView(View view);
211
212    /**
213     * Set the action bar into custom navigation mode, supplying a view
214     * for custom navigation.
215     *
216     * <p>Custom navigation views appear between the application icon and
217     * any action buttons and may use any space available there. Common
218     * use cases for custom navigation views might include an auto-suggesting
219     * address bar for a browser or other navigation mechanisms that do not
220     * translate well to provided navigation modes.</p>
221     *
222     * <p>The display option {@link #DISPLAY_SHOW_CUSTOM} must be set for
223     * the custom view to be displayed.</p>
224     *
225     * @param view Custom navigation view to place in the ActionBar.
226     * @param layoutParams How this custom view should layout in the bar.
227     *
228     * @see #setDisplayOptions(int, int)
229     */
230    public abstract void setCustomView(View view, LayoutParams layoutParams);
231
232    /**
233     * Set the action bar into custom navigation mode, supplying a view
234     * for custom navigation.
235     *
236     * <p>Custom navigation views appear between the application icon and
237     * any action buttons and may use any space available there. Common
238     * use cases for custom navigation views might include an auto-suggesting
239     * address bar for a browser or other navigation mechanisms that do not
240     * translate well to provided navigation modes.</p>
241     *
242     * <p>The display option {@link #DISPLAY_SHOW_CUSTOM} must be set for
243     * the custom view to be displayed.</p>
244     *
245     * @param resId Resource ID of a layout to inflate into the ActionBar.
246     *
247     * @see #setDisplayOptions(int, int)
248     */
249    public abstract void setCustomView(int resId);
250
251    /**
252     * Set the icon to display in the 'home' section of the action bar.
253     * The action bar will use an icon specified by its style or the
254     * activity icon by default.
255     *
256     * Whether the home section shows an icon or logo is controlled
257     * by the display option {@link #DISPLAY_USE_LOGO}.
258     *
259     * @param resId Resource ID of a drawable to show as an icon.
260     *
261     * @see #setDisplayUseLogoEnabled(boolean)
262     * @see #setDisplayShowHomeEnabled(boolean)
263     */
264    public abstract void setIcon(@DrawableRes int resId);
265
266    /**
267     * Set the icon to display in the 'home' section of the action bar.
268     * The action bar will use an icon specified by its style or the
269     * activity icon by default.
270     *
271     * Whether the home section shows an icon or logo is controlled
272     * by the display option {@link #DISPLAY_USE_LOGO}.
273     *
274     * @param icon Drawable to show as an icon.
275     *
276     * @see #setDisplayUseLogoEnabled(boolean)
277     * @see #setDisplayShowHomeEnabled(boolean)
278     */
279    public abstract void setIcon(Drawable icon);
280
281    /**
282     * Set the logo to display in the 'home' section of the action bar.
283     * The action bar will use a logo specified by its style or the
284     * activity logo by default.
285     *
286     * Whether the home section shows an icon or logo is controlled
287     * by the display option {@link #DISPLAY_USE_LOGO}.
288     *
289     * @param resId Resource ID of a drawable to show as a logo.
290     *
291     * @see #setDisplayUseLogoEnabled(boolean)
292     * @see #setDisplayShowHomeEnabled(boolean)
293     */
294    public abstract void setLogo(@DrawableRes int resId);
295
296    /**
297     * Set the logo to display in the 'home' section of the action bar.
298     * The action bar will use a logo specified by its style or the
299     * activity logo by default.
300     *
301     * Whether the home section shows an icon or logo is controlled
302     * by the display option {@link #DISPLAY_USE_LOGO}.
303     *
304     * @param logo Drawable to show as a logo.
305     *
306     * @see #setDisplayUseLogoEnabled(boolean)
307     * @see #setDisplayShowHomeEnabled(boolean)
308     */
309    public abstract void setLogo(Drawable logo);
310
311    /**
312     * Set the adapter and navigation callback for list navigation mode.
313     *
314     * The supplied adapter will provide views for the expanded list as well as
315     * the currently selected item. (These may be displayed differently.)
316     *
317     * The supplied OnNavigationListener will alert the application when the user
318     * changes the current list selection.
319     *
320     * @param adapter An adapter that will provide views both to display
321     *                the current navigation selection and populate views
322     *                within the dropdown navigation menu.
323     * @param callback An OnNavigationListener that will receive events when the user
324     *                 selects a navigation item.
325     *
326     * @deprecated Action bar navigation modes are deprecated and not supported by inline
327     * toolbar action bars. Consider using other
328     * <a href="http://developer.android.com/design/patterns/navigation.html">common
329     * navigation patterns</a> instead.
330     */
331    public abstract void setListNavigationCallbacks(SpinnerAdapter adapter,
332            OnNavigationListener callback);
333
334    /**
335     * Set the selected navigation item in list or tabbed navigation modes.
336     *
337     * @param position Position of the item to select.
338     *
339     * @deprecated Action bar navigation modes are deprecated and not supported by inline
340     * toolbar action bars. Consider using other
341     * <a href="http://developer.android.com/design/patterns/navigation.html">common
342     * navigation patterns</a> instead.
343     */
344    public abstract void setSelectedNavigationItem(int position);
345
346    /**
347     * Get the position of the selected navigation item in list or tabbed navigation modes.
348     *
349     * @return Position of the selected item.
350     *
351     * @deprecated Action bar navigation modes are deprecated and not supported by inline
352     * toolbar action bars. Consider using other
353     * <a href="http://developer.android.com/design/patterns/navigation.html">common
354     * navigation patterns</a> instead.
355     */
356    public abstract int getSelectedNavigationIndex();
357
358    /**
359     * Get the number of navigation items present in the current navigation mode.
360     *
361     * @return Number of navigation items.
362     *
363     * @deprecated Action bar navigation modes are deprecated and not supported by inline
364     * toolbar action bars. Consider using other
365     * <a href="http://developer.android.com/design/patterns/navigation.html">common
366     * navigation patterns</a> instead.
367     */
368    public abstract int getNavigationItemCount();
369
370    /**
371     * Set the action bar's title. This will only be displayed if
372     * {@link #DISPLAY_SHOW_TITLE} is set.
373     *
374     * @param title Title to set
375     *
376     * @see #setTitle(int)
377     * @see #setDisplayOptions(int, int)
378     */
379    public abstract void setTitle(CharSequence title);
380
381    /**
382     * Set the action bar's title. This will only be displayed if
383     * {@link #DISPLAY_SHOW_TITLE} is set.
384     *
385     * @param resId Resource ID of title string to set
386     *
387     * @see #setTitle(CharSequence)
388     * @see #setDisplayOptions(int, int)
389     */
390    public abstract void setTitle(@StringRes int resId);
391
392    /**
393     * Set the action bar's subtitle. This will only be displayed if
394     * {@link #DISPLAY_SHOW_TITLE} is set. Set to null to disable the
395     * subtitle entirely.
396     *
397     * @param subtitle Subtitle to set
398     *
399     * @see #setSubtitle(int)
400     * @see #setDisplayOptions(int, int)
401     */
402    public abstract void setSubtitle(CharSequence subtitle);
403
404    /**
405     * Set the action bar's subtitle. This will only be displayed if
406     * {@link #DISPLAY_SHOW_TITLE} is set.
407     *
408     * @param resId Resource ID of subtitle string to set
409     *
410     * @see #setSubtitle(CharSequence)
411     * @see #setDisplayOptions(int, int)
412     */
413    public abstract void setSubtitle(int resId);
414
415    /**
416     * Set display options. This changes all display option bits at once. To change
417     * a limited subset of display options, see {@link #setDisplayOptions(int, int)}.
418     *
419     * @param options A combination of the bits defined by the DISPLAY_ constants
420     *                defined in ActionBar.
421     */
422    public abstract void setDisplayOptions(@DisplayOptions int options);
423
424    /**
425     * Set selected display options. Only the options specified by mask will be changed.
426     * To change all display option bits at once, see {@link #setDisplayOptions(int)}.
427     *
428     * <p>Example: setDisplayOptions(0, DISPLAY_SHOW_HOME) will disable the
429     * {@link #DISPLAY_SHOW_HOME} option.
430     * setDisplayOptions(DISPLAY_SHOW_HOME, DISPLAY_SHOW_HOME | DISPLAY_USE_LOGO)
431     * will enable {@link #DISPLAY_SHOW_HOME} and disable {@link #DISPLAY_USE_LOGO}.
432     *
433     * @param options A combination of the bits defined by the DISPLAY_ constants
434     *                defined in ActionBar.
435     * @param mask A bit mask declaring which display options should be changed.
436     */
437    public abstract void setDisplayOptions(@DisplayOptions int options, @DisplayOptions int mask);
438
439    /**
440     * Set whether to display the activity logo rather than the activity icon.
441     * A logo is often a wider, more detailed image.
442     *
443     * <p>To set several display options at once, see the setDisplayOptions methods.
444     *
445     * @param useLogo true to use the activity logo, false to use the activity icon.
446     *
447     * @see #setDisplayOptions(int)
448     * @see #setDisplayOptions(int, int)
449     */
450    public abstract void setDisplayUseLogoEnabled(boolean useLogo);
451
452    /**
453     * Set whether to include the application home affordance in the action bar.
454     * Home is presented as either an activity icon or logo.
455     *
456     * <p>To set several display options at once, see the setDisplayOptions methods.
457     *
458     * @param showHome true to show home, false otherwise.
459     *
460     * @see #setDisplayOptions(int)
461     * @see #setDisplayOptions(int, int)
462     */
463    public abstract void setDisplayShowHomeEnabled(boolean showHome);
464
465    /**
466     * Set whether home should be displayed as an "up" affordance.
467     * Set this to true if selecting "home" returns up by a single level in your UI
468     * rather than back to the top level or front page.
469     *
470     * <p>To set several display options at once, see the setDisplayOptions methods.
471     *
472     * @param showHomeAsUp true to show the user that selecting home will return one
473     *                     level up rather than to the top level of the app.
474     *
475     * @see #setDisplayOptions(int)
476     * @see #setDisplayOptions(int, int)
477     */
478    public abstract void setDisplayHomeAsUpEnabled(boolean showHomeAsUp);
479
480    /**
481     * Set whether an activity title/subtitle should be displayed.
482     *
483     * <p>To set several display options at once, see the setDisplayOptions methods.
484     *
485     * @param showTitle true to display a title/subtitle if present.
486     * @see #setDisplayOptions(int)
487     * @see #setDisplayOptions(int, int)
488     */
489    public abstract void setDisplayShowTitleEnabled(boolean showTitle);
490
491    /**
492     * Set whether a custom view should be displayed, if set.
493     *
494     * <p>To set several display options at once, see the setDisplayOptions methods.
495     *
496     * @param showCustom true if the currently set custom view should be displayed, false otherwise.
497     *
498     * @see #setDisplayOptions(int)
499     * @see #setDisplayOptions(int, int)
500     */
501    public abstract void setDisplayShowCustomEnabled(boolean showCustom);
502
503    /**
504     * Set the ActionBar's background. This will be used for the primary
505     * action bar.
506     *
507     * @param d Background drawable
508     * @see #setStackedBackgroundDrawable(Drawable)
509     * @see #setSplitBackgroundDrawable(Drawable)
510     */
511    public abstract void setBackgroundDrawable(@Nullable Drawable d);
512
513    /**
514     * Set the ActionBar's stacked background. This will appear
515     * in the second row/stacked bar on some devices and configurations.
516     *
517     * @param d Background drawable for the stacked row
518     */
519    public void setStackedBackgroundDrawable(Drawable d) { }
520
521    /**
522     * Set the ActionBar's split background. This will appear in
523     * the split action bar containing menu-provided action buttons
524     * on some devices and configurations.
525     * <p>You can enable split action bar with {@link android.R.attr#uiOptions}
526     *
527     * @param d Background drawable for the split bar
528     */
529    public void setSplitBackgroundDrawable(Drawable d) { }
530
531    /**
532     * @return The current custom view.
533     */
534    public abstract View getCustomView();
535
536    /**
537     * Returns the current ActionBar title in standard mode.
538     * Returns null if {@link #getNavigationMode()} would not return
539     * {@link #NAVIGATION_MODE_STANDARD}.
540     *
541     * @return The current ActionBar title or null.
542     */
543    @Nullable
544    public abstract CharSequence getTitle();
545
546    /**
547     * Returns the current ActionBar subtitle in standard mode.
548     * Returns null if {@link #getNavigationMode()} would not return
549     * {@link #NAVIGATION_MODE_STANDARD}.
550     *
551     * @return The current ActionBar subtitle or null.
552     */
553    @Nullable
554    public abstract CharSequence getSubtitle();
555
556    /**
557     * Returns the current navigation mode. The result will be one of:
558     * <ul>
559     * <li>{@link #NAVIGATION_MODE_STANDARD}</li>
560     * <li>{@link #NAVIGATION_MODE_LIST}</li>
561     * <li>{@link #NAVIGATION_MODE_TABS}</li>
562     * </ul>
563     *
564     * @return The current navigation mode.
565     *
566     * @deprecated Action bar navigation modes are deprecated and not supported by inline
567     * toolbar action bars. Consider using other
568     * <a href="http://developer.android.com/design/patterns/navigation.html">common
569     * navigation patterns</a> instead.
570     */
571    @NavigationMode
572    public abstract int getNavigationMode();
573
574    /**
575     * Set the current navigation mode.
576     *
577     * @param mode The new mode to set.
578     * @see #NAVIGATION_MODE_STANDARD
579     * @see #NAVIGATION_MODE_LIST
580     * @see #NAVIGATION_MODE_TABS
581     *
582     * @deprecated Action bar navigation modes are deprecated and not supported by inline
583     * toolbar action bars. Consider using other
584     * <a href="http://developer.android.com/design/patterns/navigation.html">common
585     * navigation patterns</a> instead.
586     */
587    public abstract void setNavigationMode(@NavigationMode int mode);
588
589    /**
590     * @return The current set of display options.
591     */
592    @DisplayOptions
593    public abstract int getDisplayOptions();
594
595    /**
596     * Create and return a new {@link Tab}.
597     * This tab will not be included in the action bar until it is added.
598     *
599     * <p>Very often tabs will be used to switch between {@link Fragment}
600     * objects.  Here is a typical implementation of such tabs:</p>
601     *
602     * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentTabs.java
603     *      complete}
604     *
605     * @return A new Tab
606     *
607     * @see #addTab(Tab)
608     *
609     * @deprecated Action bar navigation modes are deprecated and not supported by inline
610     * toolbar action bars. Consider using other
611     * <a href="http://developer.android.com/design/patterns/navigation.html">common
612     * navigation patterns</a> instead.
613     */
614    public abstract Tab newTab();
615
616    /**
617     * Add a tab for use in tabbed navigation mode. The tab will be added at the end of the list.
618     * If this is the first tab to be added it will become the selected tab.
619     *
620     * @param tab Tab to add
621     *
622     * @deprecated Action bar navigation modes are deprecated and not supported by inline
623     * toolbar action bars. Consider using other
624     * <a href="http://developer.android.com/design/patterns/navigation.html">common
625     * navigation patterns</a> instead.
626     */
627    public abstract void addTab(Tab tab);
628
629    /**
630     * Add a tab for use in tabbed navigation mode. The tab will be added at the end of the list.
631     *
632     * @param tab Tab to add
633     * @param setSelected True if the added tab should become the selected tab.
634     *
635     * @deprecated Action bar navigation modes are deprecated and not supported by inline
636     * toolbar action bars. Consider using other
637     * <a href="http://developer.android.com/design/patterns/navigation.html">common
638     * navigation patterns</a> instead.
639     */
640    public abstract void addTab(Tab tab, boolean setSelected);
641
642    /**
643     * Add a tab for use in tabbed navigation mode. The tab will be inserted at
644     * <code>position</code>. If this is the first tab to be added it will become
645     * the selected tab.
646     *
647     * @param tab The tab to add
648     * @param position The new position of the tab
649     *
650     * @deprecated Action bar navigation modes are deprecated and not supported by inline
651     * toolbar action bars. Consider using other
652     * <a href="http://developer.android.com/design/patterns/navigation.html">common
653     * navigation patterns</a> instead.
654     */
655    public abstract void addTab(Tab tab, int position);
656
657    /**
658     * Add a tab for use in tabbed navigation mode. The tab will be insterted at
659     * <code>position</code>.
660     *
661     * @param tab The tab to add
662     * @param position The new position of the tab
663     * @param setSelected True if the added tab should become the selected tab.
664     *
665     * @deprecated Action bar navigation modes are deprecated and not supported by inline
666     * toolbar action bars. Consider using other
667     * <a href="http://developer.android.com/design/patterns/navigation.html">common
668     * navigation patterns</a> instead.
669     */
670    public abstract void addTab(Tab tab, int position, boolean setSelected);
671
672    /**
673     * Remove a tab from the action bar. If the removed tab was selected it will be deselected
674     * and another tab will be selected if present.
675     *
676     * @param tab The tab to remove
677     *
678     * @deprecated Action bar navigation modes are deprecated and not supported by inline
679     * toolbar action bars. Consider using other
680     * <a href="http://developer.android.com/design/patterns/navigation.html">common
681     * navigation patterns</a> instead.
682     */
683    public abstract void removeTab(Tab tab);
684
685    /**
686     * Remove a tab from the action bar. If the removed tab was selected it will be deselected
687     * and another tab will be selected if present.
688     *
689     * @param position Position of the tab to remove
690     *
691     * @deprecated Action bar navigation modes are deprecated and not supported by inline
692     * toolbar action bars. Consider using other
693     * <a href="http://developer.android.com/design/patterns/navigation.html">common
694     * navigation patterns</a> instead.
695     */
696    public abstract void removeTabAt(int position);
697
698    /**
699     * Remove all tabs from the action bar and deselect the current tab.
700     *
701     * @deprecated Action bar navigation modes are deprecated and not supported by inline
702     * toolbar action bars. Consider using other
703     * <a href="http://developer.android.com/design/patterns/navigation.html">common
704     * navigation patterns</a> instead.
705     */
706    public abstract void removeAllTabs();
707
708    /**
709     * Select the specified tab. If it is not a child of this action bar it will be added.
710     *
711     * <p>Note: If you want to select by index, use {@link #setSelectedNavigationItem(int)}.</p>
712     *
713     * @param tab Tab to select
714     *
715     * @deprecated Action bar navigation modes are deprecated and not supported by inline
716     * toolbar action bars. Consider using other
717     * <a href="http://developer.android.com/design/patterns/navigation.html">common
718     * navigation patterns</a> instead.
719     */
720    public abstract void selectTab(Tab tab);
721
722    /**
723     * Returns the currently selected tab if in tabbed navigation mode and there is at least
724     * one tab present.
725     *
726     * @return The currently selected tab or null
727     *
728     * @deprecated Action bar navigation modes are deprecated and not supported by inline
729     * toolbar action bars. Consider using other
730     * <a href="http://developer.android.com/design/patterns/navigation.html">common
731     * navigation patterns</a> instead.
732     */
733    @Nullable
734    public abstract Tab getSelectedTab();
735
736    /**
737     * Returns the tab at the specified index.
738     *
739     * @param index Index value in the range 0-get
740     * @return
741     *
742     * @deprecated Action bar navigation modes are deprecated and not supported by inline
743     * toolbar action bars. Consider using other
744     * <a href="http://developer.android.com/design/patterns/navigation.html">common
745     * navigation patterns</a> instead.
746     */
747    public abstract Tab getTabAt(int index);
748
749    /**
750     * Returns the number of tabs currently registered with the action bar.
751     *
752     * @return Tab count
753     *
754     * @deprecated Action bar navigation modes are deprecated and not supported by inline
755     * toolbar action bars. Consider using other
756     * <a href="http://developer.android.com/design/patterns/navigation.html">common
757     * navigation patterns</a> instead.
758     */
759    public abstract int getTabCount();
760
761    /**
762     * Retrieve the current height of the ActionBar.
763     *
764     * @return The ActionBar's height
765     */
766    public abstract int getHeight();
767
768    /**
769     * Show the ActionBar if it is not currently showing.
770     * If the window hosting the ActionBar does not have the feature
771     * {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application
772     * content to fit the new space available.
773     *
774     * <p>If you are hiding the ActionBar through
775     * {@link View#SYSTEM_UI_FLAG_FULLSCREEN View.SYSTEM_UI_FLAG_FULLSCREEN},
776     * you should not call this function directly.
777     */
778    public abstract void show();
779
780    /**
781     * Hide the ActionBar if it is currently showing.
782     * If the window hosting the ActionBar does not have the feature
783     * {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application
784     * content to fit the new space available.
785     *
786     * <p>Instead of calling this function directly, you can also cause an
787     * ActionBar using the overlay feature to hide through
788     * {@link View#SYSTEM_UI_FLAG_FULLSCREEN View.SYSTEM_UI_FLAG_FULLSCREEN}.
789     * Hiding the ActionBar through this system UI flag allows you to more
790     * seamlessly hide it in conjunction with other screen decorations.
791     */
792    public abstract void hide();
793
794    /**
795     * @return <code>true</code> if the ActionBar is showing, <code>false</code> otherwise.
796     */
797    public abstract boolean isShowing();
798
799    /**
800     * Add a listener that will respond to menu visibility change events.
801     *
802     * @param listener The new listener to add
803     */
804    public abstract void addOnMenuVisibilityListener(OnMenuVisibilityListener listener);
805
806    /**
807     * Remove a menu visibility listener. This listener will no longer receive menu
808     * visibility change events.
809     *
810     * @param listener A listener to remove that was previously added
811     */
812    public abstract void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener);
813
814    /**
815     * Enable or disable the "home" button in the corner of the action bar. (Note that this
816     * is the application home/up affordance on the action bar, not the systemwide home
817     * button.)
818     *
819     * <p>This defaults to true for packages targeting &lt; API 14. For packages targeting
820     * API 14 or greater, the application should call this method to enable interaction
821     * with the home/up affordance.
822     *
823     * <p>Setting the {@link #DISPLAY_HOME_AS_UP} display option will automatically enable
824     * the home button.
825     *
826     * @param enabled true to enable the home button, false to disable the home button.
827     */
828    public void setHomeButtonEnabled(boolean enabled) { }
829
830    /**
831     * Returns a {@link Context} with an appropriate theme for creating views that
832     * will appear in the action bar. If you are inflating or instantiating custom views
833     * that will appear in an action bar, you should use the Context returned by this method.
834     * (This includes adapters used for list navigation mode.)
835     * This will ensure that views contrast properly against the action bar.
836     *
837     * @return A themed Context for creating views
838     */
839    public Context getThemedContext() {
840        return null;
841    }
842
843    /**
844     * Returns true if the Title field has been truncated during layout for lack
845     * of available space.
846     *
847     * @return true if the Title field has been truncated
848     * @hide pending API approval
849     */
850    public boolean isTitleTruncated() { return false; }
851
852    /**
853     * Set an alternate drawable to display next to the icon/logo/title
854     * when {@link #DISPLAY_HOME_AS_UP} is enabled. This can be useful if you are using
855     * this mode to display an alternate selection for up navigation, such as a sliding drawer.
856     *
857     * <p>If you pass <code>null</code> to this method, the default drawable from the theme
858     * will be used.</p>
859     *
860     * <p>If you implement alternate or intermediate behavior around Up, you should also
861     * call {@link #setHomeActionContentDescription(int) setHomeActionContentDescription()}
862     * to provide a correct description of the action for accessibility support.</p>
863     *
864     * @param indicator A drawable to use for the up indicator, or null to use the theme's default
865     *
866     * @see #setDisplayOptions(int, int)
867     * @see #setDisplayHomeAsUpEnabled(boolean)
868     * @see #setHomeActionContentDescription(int)
869     */
870    public void setHomeAsUpIndicator(@Nullable Drawable indicator) {}
871
872    /**
873     * Set an alternate drawable to display next to the icon/logo/title
874     * when {@link #DISPLAY_HOME_AS_UP} is enabled. This can be useful if you are using
875     * this mode to display an alternate selection for up navigation, such as a sliding drawer.
876     *
877     * <p>If you pass <code>0</code> to this method, the default drawable from the theme
878     * will be used.</p>
879     *
880     * <p>If you implement alternate or intermediate behavior around Up, you should also
881     * call {@link #setHomeActionContentDescription(int) setHomeActionContentDescription()}
882     * to provide a correct description of the action for accessibility support.</p>
883     *
884     * @param resId Resource ID of a drawable to use for the up indicator, or 0
885     *              to use the theme's default
886     *
887     * @see #setDisplayOptions(int, int)
888     * @see #setDisplayHomeAsUpEnabled(boolean)
889     * @see #setHomeActionContentDescription(int)
890     */
891    public void setHomeAsUpIndicator(@DrawableRes int resId) {}
892
893    /**
894     * Set an alternate description for the Home/Up action, when enabled.
895     *
896     * <p>This description is commonly used for accessibility/screen readers when
897     * the Home action is enabled. (See {@link #setDisplayHomeAsUpEnabled(boolean)}.)
898     * Examples of this are, "Navigate Home" or "Navigate Up" depending on the
899     * {@link #DISPLAY_HOME_AS_UP} display option. If you have changed the home-as-up
900     * indicator using {@link #setHomeAsUpIndicator(int)} to indicate more specific
901     * functionality such as a sliding drawer, you should also set this to accurately
902     * describe the action.</p>
903     *
904     * <p>Setting this to <code>null</code> will use the system default description.</p>
905     *
906     * @param description New description for the Home action when enabled
907     * @see #setHomeAsUpIndicator(int)
908     * @see #setHomeAsUpIndicator(android.graphics.drawable.Drawable)
909     */
910    public void setHomeActionContentDescription(@Nullable CharSequence description) {}
911
912    /**
913     * Set an alternate description for the Home/Up action, when enabled.
914     *
915     * <p>This description is commonly used for accessibility/screen readers when
916     * the Home action is enabled. (See {@link #setDisplayHomeAsUpEnabled(boolean)}.)
917     * Examples of this are, "Navigate Home" or "Navigate Up" depending on the
918     * {@link #DISPLAY_HOME_AS_UP} display option. If you have changed the home-as-up
919     * indicator using {@link #setHomeAsUpIndicator(int)} to indicate more specific
920     * functionality such as a sliding drawer, you should also set this to accurately
921     * describe the action.</p>
922     *
923     * <p>Setting this to <code>0</code> will use the system default description.</p>
924     *
925     * @param resId Resource ID of a string to use as the new description
926     *              for the Home action when enabled
927     * @see #setHomeAsUpIndicator(int)
928     * @see #setHomeAsUpIndicator(android.graphics.drawable.Drawable)
929     */
930    public void setHomeActionContentDescription(@StringRes int resId) {}
931
932    /**
933     * Enable hiding the action bar on content scroll.
934     *
935     * <p>If enabled, the action bar will scroll out of sight along with a
936     * {@link View#setNestedScrollingEnabled(boolean) nested scrolling child} view's content.
937     * The action bar must be in {@link Window#FEATURE_ACTION_BAR_OVERLAY overlay mode}
938     * to enable hiding on content scroll.</p>
939     *
940     * <p>When partially scrolled off screen the action bar is considered
941     * {@link #hide() hidden}. A call to {@link #show() show} will cause it to return to full view.
942     * </p>
943     * @param hideOnContentScroll true to enable hiding on content scroll.
944     */
945    public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) {
946        if (hideOnContentScroll) {
947            throw new UnsupportedOperationException("Hide on content scroll is not supported in " +
948                    "this action bar configuration.");
949        }
950    }
951
952    /**
953     * Return whether the action bar is configured to scroll out of sight along with
954     * a {@link View#setNestedScrollingEnabled(boolean) nested scrolling child}.
955     *
956     * @return true if hide-on-content-scroll is enabled
957     * @see #setHideOnContentScrollEnabled(boolean)
958     */
959    public boolean isHideOnContentScrollEnabled() {
960        return false;
961    }
962
963    /**
964     * Return the current vertical offset of the action bar.
965     *
966     * <p>The action bar's current hide offset is the distance that the action bar is currently
967     * scrolled offscreen in pixels. The valid range is 0 (fully visible) to the action bar's
968     * current measured {@link #getHeight() height} (fully invisible).</p>
969     *
970     * @return The action bar's offset toward its fully hidden state in pixels
971     */
972    public int getHideOffset() {
973        return 0;
974    }
975
976    /**
977     * Set the current hide offset of the action bar.
978     *
979     * <p>The action bar's current hide offset is the distance that the action bar is currently
980     * scrolled offscreen in pixels. The valid range is 0 (fully visible) to the action bar's
981     * current measured {@link #getHeight() height} (fully invisible).</p>
982     *
983     * @param offset The action bar's offset toward its fully hidden state in pixels.
984     */
985    public void setHideOffset(int offset) {
986        if (offset != 0) {
987            throw new UnsupportedOperationException("Setting an explicit action bar hide offset " +
988                    "is not supported in this action bar configuration.");
989        }
990    }
991
992    /**
993     * Set the Z-axis elevation of the action bar in pixels.
994     *
995     * <p>The action bar's elevation is the distance it is placed from its parent surface. Higher
996     * values are closer to the user.</p>
997     *
998     * @param elevation Elevation value in pixels
999     */
1000    public void setElevation(float elevation) {
1001        if (elevation != 0) {
1002            throw new UnsupportedOperationException("Setting a non-zero elevation is " +
1003                    "not supported in this action bar configuration.");
1004        }
1005    }
1006
1007    /**
1008     * Get the Z-axis elevation of the action bar in pixels.
1009     *
1010     * <p>The action bar's elevation is the distance it is placed from its parent surface. Higher
1011     * values are closer to the user.</p>
1012     *
1013     * @return Elevation value in pixels
1014     */
1015    public float getElevation() {
1016        return 0;
1017    }
1018
1019    /** @hide */
1020    public void setDefaultDisplayHomeAsUpEnabled(boolean enabled) {
1021    }
1022
1023    /** @hide */
1024    public void setShowHideAnimationEnabled(boolean enabled) {
1025    }
1026
1027    /** @hide */
1028    public void onConfigurationChanged(Configuration config) {
1029    }
1030
1031    /** @hide */
1032    public void dispatchMenuVisibilityChanged(boolean visible) {
1033    }
1034
1035    /** @hide */
1036    public ActionMode startActionMode(ActionMode.Callback callback) {
1037        return null;
1038    }
1039
1040    /** @hide */
1041    public boolean openOptionsMenu() {
1042        return false;
1043    }
1044
1045    /** @hide */
1046    public boolean invalidateOptionsMenu() {
1047        return false;
1048    }
1049
1050    /** @hide */
1051    public boolean onMenuKeyEvent(KeyEvent event) {
1052        return false;
1053    }
1054
1055    /** @hide **/
1056    public boolean onKeyShortcut(int keyCode, KeyEvent ev) {
1057        return false;
1058    }
1059
1060    /** @hide */
1061    public boolean collapseActionView() {
1062        return false;
1063    }
1064
1065    /** @hide */
1066    public void setWindowTitle(CharSequence title) {
1067    }
1068
1069    /**
1070     * Listener interface for ActionBar navigation events.
1071     *
1072     * @deprecated Action bar navigation modes are deprecated and not supported by inline
1073     * toolbar action bars. Consider using other
1074     * <a href="http://developer.android.com/design/patterns/navigation.html">common
1075     * navigation patterns</a> instead.
1076     */
1077    public interface OnNavigationListener {
1078        /**
1079         * This method is called whenever a navigation item in your action bar
1080         * is selected.
1081         *
1082         * @param itemPosition Position of the item clicked.
1083         * @param itemId ID of the item clicked.
1084         * @return True if the event was handled, false otherwise.
1085         */
1086        public boolean onNavigationItemSelected(int itemPosition, long itemId);
1087    }
1088
1089    /**
1090     * Listener for receiving events when action bar menus are shown or hidden.
1091     */
1092    public interface OnMenuVisibilityListener {
1093
1094        /**
1095         * Called when an action bar menu is shown or hidden. Applications may want to use
1096         * this to tune auto-hiding behavior for the action bar or pause/resume video playback,
1097         * gameplay, or other activity within the main content area.
1098         *
1099         * @param isVisible True if an action bar menu is now visible, false if no action bar
1100         *                  menus are visible.
1101         */
1102        public void onMenuVisibilityChanged(boolean isVisible);
1103    }
1104
1105    /**
1106     * A tab in the action bar.
1107     *
1108     * <p>Tabs manage the hiding and showing of {@link Fragment}s.
1109     *
1110     * @deprecated Action bar navigation modes are deprecated and not supported by inline
1111     * toolbar action bars. Consider using other
1112     * <a href="http://developer.android.com/design/patterns/navigation.html">common
1113     * navigation patterns</a> instead.
1114     */
1115    public static abstract class Tab {
1116
1117        /**
1118         * An invalid position for a tab.
1119         *
1120         * @see #getPosition()
1121         */
1122        public static final int INVALID_POSITION = -1;
1123
1124        /**
1125         * Return the current position of this tab in the action bar.
1126         *
1127         * @return Current position, or {@link #INVALID_POSITION} if this tab is not currently in
1128         *         the action bar.
1129         */
1130        public abstract int getPosition();
1131
1132        /**
1133         * Return the icon associated with this tab.
1134         *
1135         * @return The tab's icon
1136         */
1137        public abstract Drawable getIcon();
1138
1139        /**
1140         * Return the text of this tab.
1141         *
1142         * @return The tab's text
1143         */
1144        public abstract CharSequence getText();
1145
1146        /**
1147         * Set the icon displayed on this tab.
1148         *
1149         * @param icon The drawable to use as an icon
1150         * @return The current instance for call chaining
1151         */
1152        public abstract Tab setIcon(Drawable icon);
1153
1154        /**
1155         * Set the icon displayed on this tab.
1156         *
1157         * @param resId Resource ID referring to the drawable to use as an icon
1158         * @return The current instance for call chaining
1159         */
1160        public abstract Tab setIcon(@DrawableRes int resId);
1161
1162        /**
1163         * Set the text displayed on this tab. Text may be truncated if there is not
1164         * room to display the entire string.
1165         *
1166         * @param text The text to display
1167         * @return The current instance for call chaining
1168         */
1169        public abstract Tab setText(CharSequence text);
1170
1171        /**
1172         * Set the text displayed on this tab. Text may be truncated if there is not
1173         * room to display the entire string.
1174         *
1175         * @param resId A resource ID referring to the text that should be displayed
1176         * @return The current instance for call chaining
1177         */
1178        public abstract Tab setText(int resId);
1179
1180        /**
1181         * Set a custom view to be used for this tab. This overrides values set by
1182         * {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}.
1183         *
1184         * @param view Custom view to be used as a tab.
1185         * @return The current instance for call chaining
1186         */
1187        public abstract Tab setCustomView(View view);
1188
1189        /**
1190         * Set a custom view to be used for this tab. This overrides values set by
1191         * {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}.
1192         *
1193         * @param layoutResId A layout resource to inflate and use as a custom tab view
1194         * @return The current instance for call chaining
1195         */
1196        public abstract Tab setCustomView(int layoutResId);
1197
1198        /**
1199         * Retrieve a previously set custom view for this tab.
1200         *
1201         * @return The custom view set by {@link #setCustomView(View)}.
1202         */
1203        public abstract View getCustomView();
1204
1205        /**
1206         * Give this Tab an arbitrary object to hold for later use.
1207         *
1208         * @param obj Object to store
1209         * @return The current instance for call chaining
1210         */
1211        public abstract Tab setTag(Object obj);
1212
1213        /**
1214         * @return This Tab's tag object.
1215         */
1216        public abstract Object getTag();
1217
1218        /**
1219         * Set the {@link TabListener} that will handle switching to and from this tab.
1220         * All tabs must have a TabListener set before being added to the ActionBar.
1221         *
1222         * @param listener Listener to handle tab selection events
1223         * @return The current instance for call chaining
1224         */
1225        public abstract Tab setTabListener(TabListener listener);
1226
1227        /**
1228         * Select this tab. Only valid if the tab has been added to the action bar.
1229         */
1230        public abstract void select();
1231
1232        /**
1233         * Set a description of this tab's content for use in accessibility support.
1234         * If no content description is provided the title will be used.
1235         *
1236         * @param resId A resource ID referring to the description text
1237         * @return The current instance for call chaining
1238         * @see #setContentDescription(CharSequence)
1239         * @see #getContentDescription()
1240         */
1241        public abstract Tab setContentDescription(int resId);
1242
1243        /**
1244         * Set a description of this tab's content for use in accessibility support.
1245         * If no content description is provided the title will be used.
1246         *
1247         * @param contentDesc Description of this tab's content
1248         * @return The current instance for call chaining
1249         * @see #setContentDescription(int)
1250         * @see #getContentDescription()
1251         */
1252        public abstract Tab setContentDescription(CharSequence contentDesc);
1253
1254        /**
1255         * Gets a brief description of this tab's content for use in accessibility support.
1256         *
1257         * @return Description of this tab's content
1258         * @see #setContentDescription(CharSequence)
1259         * @see #setContentDescription(int)
1260         */
1261        public abstract CharSequence getContentDescription();
1262    }
1263
1264    /**
1265     * Callback interface invoked when a tab is focused, unfocused, added, or removed.
1266     *
1267     * @deprecated Action bar navigation modes are deprecated and not supported by inline
1268     * toolbar action bars. Consider using other
1269     * <a href="http://developer.android.com/design/patterns/navigation.html">common
1270     * navigation patterns</a> instead.
1271     */
1272    public interface TabListener {
1273
1274        /**
1275         * Called when a tab enters the selected state.
1276         *
1277         * @param tab The tab that was selected
1278         * @param ft A {@link FragmentTransaction} for queuing fragment operations to execute
1279         *        during a tab switch. The previous tab's unselect and this tab's select will be
1280         *        executed in a single transaction. This FragmentTransaction does not support
1281         *        being added to the back stack.
1282         */
1283        public void onTabSelected(Tab tab, FragmentTransaction ft);
1284
1285        /**
1286         * Called when a tab exits the selected state.
1287         *
1288         * @param tab The tab that was unselected
1289         * @param ft A {@link FragmentTransaction} for queuing fragment operations to execute
1290         *        during a tab switch. This tab's unselect and the newly selected tab's select
1291         *        will be executed in a single transaction. This FragmentTransaction does not
1292         *        support being added to the back stack.
1293         */
1294        public void onTabUnselected(Tab tab, FragmentTransaction ft);
1295
1296        /**
1297         * Called when a tab that is already selected is chosen again by the user.
1298         * Some applications may use this action to return to the top level of a category.
1299         *
1300         * @param tab The tab that was reselected.
1301         * @param ft A {@link FragmentTransaction} for queuing fragment operations to execute
1302         *        once this method returns. This FragmentTransaction does not support
1303         *        being added to the back stack.
1304         */
1305        public void onTabReselected(Tab tab, FragmentTransaction ft);
1306    }
1307
1308    /**
1309     * Per-child layout information associated with action bar custom views.
1310     */
1311    public static class LayoutParams extends ViewGroup.MarginLayoutParams {
1312        /**
1313         * Gravity for the view associated with these LayoutParams.
1314         *
1315         * @see android.view.Gravity
1316         */
1317        public int gravity = Gravity.NO_GRAVITY;
1318
1319        public LayoutParams(@NonNull Context c, AttributeSet attrs) {
1320            super(c, attrs);
1321
1322            TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.ActionBarLayout);
1323            gravity = a.getInt(R.styleable.ActionBarLayout_android_layout_gravity, Gravity.NO_GRAVITY);
1324            a.recycle();
1325        }
1326
1327        public LayoutParams(int width, int height) {
1328            super(width, height);
1329            this.gravity = Gravity.CENTER_VERTICAL | GravityCompat.START;
1330        }
1331
1332        public LayoutParams(int width, int height, int gravity) {
1333            super(width, height);
1334            this.gravity = gravity;
1335        }
1336
1337        public LayoutParams(int gravity) {
1338            this(WRAP_CONTENT, MATCH_PARENT, gravity);
1339        }
1340
1341        public LayoutParams(LayoutParams source) {
1342            super(source);
1343
1344            this.gravity = source.gravity;
1345        }
1346
1347        public LayoutParams(ViewGroup.LayoutParams source) {
1348            super(source);
1349        }
1350    }
1351}
1352