149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/*
249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Copyright (C) 2014 The Android Open Source Project
349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * you may not use this file except in compliance with the License.
649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * You may obtain a copy of the License at
749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
1049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Unless required by applicable law or agreed to in writing, software
1149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
1249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * See the License for the specific language governing permissions and
1449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * limitations under the License.
1549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */
1649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
1749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
1866698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banespackage android.support.v7.widget;
1949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
2049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.app.ActionBar;
2149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.Context;
2249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.graphics.drawable.Drawable;
2349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.os.Parcelable;
24c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo;
2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewCompat;
26acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banesimport android.support.v4.view.ViewPropertyAnimatorCompat;
2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
2866698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.app.WindowDecorActionBar;
2949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.appcompat.R;
304c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banesimport android.support.v7.content.res.AppCompatResources;
3166698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.ActionMenuItem;
3266698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuBuilder;
3366698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuPresenter;
3449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.text.TextUtils;
3549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.util.Log;
3649c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.util.SparseArray;
3749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Gravity;
3849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.LayoutInflater;
3949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Menu;
4049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.View;
4149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.ViewGroup;
4249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Window;
43f933672168f6deff5e3636584bec735416b5a93bChris Banesimport android.widget.AdapterView;
44f933672168f6deff5e3636584bec735416b5a93bChris Banesimport android.widget.Spinner;
4549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.widget.SpinnerAdapter;
4649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
47c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport static android.support.annotation.RestrictTo.Scope.GROUP_ID;
48c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette
4949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/**
5049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Internal class used to interact with the Toolbar widget without
5149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * exposing interface methods to the public API.
5249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
5349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * <p>ToolbarWidgetWrapper manages the differences between Toolbar and ActionBarView
5449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * so that either variant acting as a
5566698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banes * {@link WindowDecorActionBar WindowDecorActionBar} can behave
5649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * in the same way.</p>
5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide
5949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */
60c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette@RestrictTo(GROUP_ID)
6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banespublic class ToolbarWidgetWrapper implements DecorToolbar {
6249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private static final String TAG = "ToolbarWidgetWrapper";
6349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private static final int AFFECTS_LOGO_MASK =
6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO;
66acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    // Default fade duration for fading in/out tool bar.
67acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    private static final long DEFAULT_FADE_DURATION_MS = 200;
6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
692c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    Toolbar mToolbar;
7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private int mDisplayOpts;
7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private View mTabView;
73f933672168f6deff5e3636584bec735416b5a93bChris Banes    private Spinner mSpinner;
7449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private View mCustomView;
7549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private Drawable mIcon;
7749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private Drawable mLogo;
7849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private Drawable mNavIcon;
7949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
8049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private boolean mTitleSet;
812c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    CharSequence mTitle;
8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private CharSequence mSubtitle;
83b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar    private CharSequence mHomeDescription;
8449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
852c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    Window.Callback mWindowCallback;
862c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    boolean mMenuPrepared;
8749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private ActionMenuPresenter mActionMenuPresenter;
8849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
8949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private int mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD;
9049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
91b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar    private int mDefaultNavigationContentDescription = 0;
92acf94897e0924ff5fcd3c5b371ab1aa620cb1dc6Chris Banes    private Drawable mDefaultNavigationIcon;
93469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
94a2c72b87007d10202c25e78e904938f770c6337dChris Banes    public ToolbarWidgetWrapper(Toolbar toolbar, boolean style) {
95acf94897e0924ff5fcd3c5b371ab1aa620cb1dc6Chris Banes        this(toolbar, style, R.string.abc_action_bar_up_description,
96eb648620b291eabbb5523f649baef5abb2e4687bAlan Viverette                R.drawable.abc_ic_ab_back_material);
97b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar    }
9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
99b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar    public ToolbarWidgetWrapper(Toolbar toolbar, boolean style,
100acf94897e0924ff5fcd3c5b371ab1aa620cb1dc6Chris Banes            int defaultNavigationContentDescription, int defaultNavigationIcon) {
101b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        mToolbar = toolbar;
10249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTitle = toolbar.getTitle();
10349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSubtitle = toolbar.getSubtitle();
1045b84d15b2f5fb9b10532298c57eaebed32e3740aAdam Powell        mTitleSet = mTitle != null;
105a8780d0cb9eb258569d7fc70749c08b5ce9a8c93Chris Banes        mNavIcon = toolbar.getNavigationIcon();
106d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes        final TintTypedArray a = TintTypedArray.obtainStyledAttributes(toolbar.getContext(),
107469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes                    null, R.styleable.ActionBar, R.attr.actionBarStyle, 0);
108d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes        mDefaultNavigationIcon = a.getDrawable(R.styleable.ActionBar_homeAsUpIndicator);
109d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes        if (style) {
110a2c72b87007d10202c25e78e904938f770c6337dChris Banes            final CharSequence title = a.getText(R.styleable.ActionBar_title);
111a2c72b87007d10202c25e78e904938f770c6337dChris Banes            if (!TextUtils.isEmpty(title)) {
112a2c72b87007d10202c25e78e904938f770c6337dChris Banes                setTitle(title);
113a2c72b87007d10202c25e78e904938f770c6337dChris Banes            }
11449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
115a2c72b87007d10202c25e78e904938f770c6337dChris Banes            final CharSequence subtitle = a.getText(R.styleable.ActionBar_subtitle);
116a2c72b87007d10202c25e78e904938f770c6337dChris Banes            if (!TextUtils.isEmpty(subtitle)) {
117a2c72b87007d10202c25e78e904938f770c6337dChris Banes                setSubtitle(subtitle);
118a2c72b87007d10202c25e78e904938f770c6337dChris Banes            }
11949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
120a2c72b87007d10202c25e78e904938f770c6337dChris Banes            final Drawable logo = a.getDrawable(R.styleable.ActionBar_logo);
121a2c72b87007d10202c25e78e904938f770c6337dChris Banes            if (logo != null) {
122a2c72b87007d10202c25e78e904938f770c6337dChris Banes                setLogo(logo);
123a2c72b87007d10202c25e78e904938f770c6337dChris Banes            }
12449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
125a2c72b87007d10202c25e78e904938f770c6337dChris Banes            final Drawable icon = a.getDrawable(R.styleable.ActionBar_icon);
126d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes            if (icon != null) {
127a2c72b87007d10202c25e78e904938f770c6337dChris Banes                setIcon(icon);
128a2c72b87007d10202c25e78e904938f770c6337dChris Banes            }
129d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes            if (mNavIcon == null && mDefaultNavigationIcon != null) {
130d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes                setNavigationIcon(mDefaultNavigationIcon);
131a2c72b87007d10202c25e78e904938f770c6337dChris Banes            }
132a2c72b87007d10202c25e78e904938f770c6337dChris Banes            setDisplayOptions(a.getInt(R.styleable.ActionBar_displayOptions, 0));
13349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
134a2c72b87007d10202c25e78e904938f770c6337dChris Banes            final int customNavId = a.getResourceId(
135a2c72b87007d10202c25e78e904938f770c6337dChris Banes                    R.styleable.ActionBar_customNavigationLayout, 0);
136a2c72b87007d10202c25e78e904938f770c6337dChris Banes            if (customNavId != 0) {
137a2c72b87007d10202c25e78e904938f770c6337dChris Banes                setCustomView(LayoutInflater.from(mToolbar.getContext()).inflate(customNavId,
138a2c72b87007d10202c25e78e904938f770c6337dChris Banes                        mToolbar, false));
139a2c72b87007d10202c25e78e904938f770c6337dChris Banes                setDisplayOptions(mDisplayOpts | ActionBar.DISPLAY_SHOW_CUSTOM);
140a2c72b87007d10202c25e78e904938f770c6337dChris Banes            }
14149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
142a2c72b87007d10202c25e78e904938f770c6337dChris Banes            final int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0);
143a2c72b87007d10202c25e78e904938f770c6337dChris Banes            if (height > 0) {
144a2c72b87007d10202c25e78e904938f770c6337dChris Banes                final ViewGroup.LayoutParams lp = mToolbar.getLayoutParams();
145a2c72b87007d10202c25e78e904938f770c6337dChris Banes                lp.height = height;
146a2c72b87007d10202c25e78e904938f770c6337dChris Banes                mToolbar.setLayoutParams(lp);
147a2c72b87007d10202c25e78e904938f770c6337dChris Banes            }
14849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
149a2c72b87007d10202c25e78e904938f770c6337dChris Banes            final int contentInsetStart = a.getDimensionPixelOffset(
150a2c72b87007d10202c25e78e904938f770c6337dChris Banes                    R.styleable.ActionBar_contentInsetStart, -1);
151a2c72b87007d10202c25e78e904938f770c6337dChris Banes            final int contentInsetEnd = a.getDimensionPixelOffset(
152a2c72b87007d10202c25e78e904938f770c6337dChris Banes                    R.styleable.ActionBar_contentInsetEnd, -1);
153a2c72b87007d10202c25e78e904938f770c6337dChris Banes            if (contentInsetStart >= 0 || contentInsetEnd >= 0) {
154a2c72b87007d10202c25e78e904938f770c6337dChris Banes                mToolbar.setContentInsetsRelative(Math.max(contentInsetStart, 0),
155a2c72b87007d10202c25e78e904938f770c6337dChris Banes                        Math.max(contentInsetEnd, 0));
156a2c72b87007d10202c25e78e904938f770c6337dChris Banes            }
15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
158a2c72b87007d10202c25e78e904938f770c6337dChris Banes            final int titleTextStyle = a.getResourceId(R.styleable.ActionBar_titleTextStyle, 0);
159a2c72b87007d10202c25e78e904938f770c6337dChris Banes            if (titleTextStyle != 0) {
160a2c72b87007d10202c25e78e904938f770c6337dChris Banes                mToolbar.setTitleTextAppearance(mToolbar.getContext(), titleTextStyle);
161a2c72b87007d10202c25e78e904938f770c6337dChris Banes            }
16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
163a2c72b87007d10202c25e78e904938f770c6337dChris Banes            final int subtitleTextStyle = a.getResourceId(
164a2c72b87007d10202c25e78e904938f770c6337dChris Banes                    R.styleable.ActionBar_subtitleTextStyle, 0);
165a2c72b87007d10202c25e78e904938f770c6337dChris Banes            if (subtitleTextStyle != 0) {
166a2c72b87007d10202c25e78e904938f770c6337dChris Banes                mToolbar.setSubtitleTextAppearance(mToolbar.getContext(), subtitleTextStyle);
167a2c72b87007d10202c25e78e904938f770c6337dChris Banes            }
16849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
169a2c72b87007d10202c25e78e904938f770c6337dChris Banes            final int popupTheme = a.getResourceId(R.styleable.ActionBar_popupTheme, 0);
170a2c72b87007d10202c25e78e904938f770c6337dChris Banes            if (popupTheme != 0) {
171a2c72b87007d10202c25e78e904938f770c6337dChris Banes                mToolbar.setPopupTheme(popupTheme);
172a2c72b87007d10202c25e78e904938f770c6337dChris Banes            }
173ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes        } else {
174ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes            mDisplayOpts = detectDisplayOptions();
175a2c72b87007d10202c25e78e904938f770c6337dChris Banes        }
176d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes        a.recycle();
17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
178b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        setDefaultNavigationContentDescription(defaultNavigationContentDescription);
179b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        mHomeDescription = mToolbar.getNavigationContentDescription();
18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            final ActionMenuItem mNavItem = new ActionMenuItem(mToolbar.getContext(),
18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    0, android.R.id.home, 0, 0, mTitle);
18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            @Override
18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            public void onClick(View v) {
18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if (mWindowCallback != null && mMenuPrepared) {
18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mNavItem);
18849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
18949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
19049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        });
19149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
19249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
193b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar    @Override
194b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar    public void setDefaultNavigationContentDescription(int defaultNavigationContentDescription) {
195b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        if (defaultNavigationContentDescription == mDefaultNavigationContentDescription) {
196b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar            return;
197b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        }
198b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        mDefaultNavigationContentDescription = defaultNavigationContentDescription;
199b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        if (TextUtils.isEmpty(mToolbar.getNavigationContentDescription())) {
200b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar            setNavigationContentDescription(mDefaultNavigationContentDescription);
201b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        }
202b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar    }
203b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar
204ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    private int detectDisplayOptions() {
205ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes        int opts = ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME |
206ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes                ActionBar.DISPLAY_USE_LOGO;
207ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes        if (mToolbar.getNavigationIcon() != null) {
208ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes            opts |= ActionBar.DISPLAY_HOME_AS_UP;
209d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes            mDefaultNavigationIcon = mToolbar.getNavigationIcon();
210ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes        }
211ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes        return opts;
212ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    }
213ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes
21449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
21549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public ViewGroup getViewGroup() {
21649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar;
21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
21849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
21949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
22049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Context getContext() {
22149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.getContext();
22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasExpandedActionView() {
22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.hasExpandedActionView();
22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void collapseActionView() {
23149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.collapseActionView();
23249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
235f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes    public void setWindowCallback(Window.Callback cb) {
23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mWindowCallback = cb;
23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
23949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
24049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setWindowTitle(CharSequence title) {
24149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // "Real" title always trumps window title.
24249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!mTitleSet) {
24349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setTitleInt(title);
24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public CharSequence getTitle() {
24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.getTitle();
25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
25349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setTitle(CharSequence title) {
25449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTitleSet = true;
25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setTitleInt(title);
25649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
25849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void setTitleInt(CharSequence title) {
25949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTitle = title;
26049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
26149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.setTitle(title);
26249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
26349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
26549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public CharSequence getSubtitle() {
26749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.getSubtitle();
26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
26949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
27049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
27149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSubtitle(CharSequence subtitle) {
27249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSubtitle = subtitle;
27349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
27449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.setSubtitle(subtitle);
27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
27649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void initProgress() {
28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        Log.i(TAG, "Progress display unsupported");
28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
28249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
28349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void initIndeterminateProgress() {
28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        Log.i(TAG, "Progress display unsupported");
28649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasIcon() {
29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mIcon != null;
29149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasLogo() {
29549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mLogo != null;
29649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
29749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
29949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(int resId) {
3004c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banes        setIcon(resId != 0 ? AppCompatResources.getDrawable(getContext(), resId) : null);
30149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
30249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
30349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
30449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(Drawable d) {
30549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mIcon = d;
30649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        updateToolbarLogo();
30749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
30849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
30949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
31049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(int resId) {
3114c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banes        setLogo(resId != 0 ? AppCompatResources.getDrawable(getContext(), resId) : null);
31249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
31349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
31449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
31549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(Drawable d) {
31649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mLogo = d;
31749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        updateToolbarLogo();
31849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
31949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
32049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void updateToolbarLogo() {
32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        Drawable logo = null;
32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_HOME) != 0) {
32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if ((mDisplayOpts & ActionBar.DISPLAY_USE_LOGO) != 0) {
32449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                logo = mLogo != null ? mLogo : mIcon;
32549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            } else {
32649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                logo = mIcon;
32749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
32849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
32949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.setLogo(logo);
33049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
33149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
33249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
33349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean canShowOverflowMenu() {
33449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.canShowOverflowMenu();
33549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
33649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
33749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
33849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isOverflowMenuShowing() {
33949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.isOverflowMenuShowing();
34049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
34149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
34249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
34349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isOverflowMenuShowPending() {
34449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.isOverflowMenuShowPending();
34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
34849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean showOverflowMenu() {
34949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.showOverflowMenu();
35049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
35149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
35249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
35349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hideOverflowMenu() {
35449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.hideOverflowMenu();
35549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
35649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
35749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
35849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setMenuPrepared() {
35949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mMenuPrepared = true;
36049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
36149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
36249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
36349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setMenu(Menu menu, MenuPresenter.Callback cb) {
36449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mActionMenuPresenter == null) {
36549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mActionMenuPresenter = new ActionMenuPresenter(mToolbar.getContext());
36649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mActionMenuPresenter.setId(R.id.action_menu_presenter);
36749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
36849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mActionMenuPresenter.setCallback(cb);
36949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.setMenu((MenuBuilder) menu, mActionMenuPresenter);
37049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
37149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
37249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
37349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void dismissPopupMenus() {
37449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.dismissPopupMenus();
37549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
37649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
37749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
37849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getDisplayOptions() {
37949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDisplayOpts;
38049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
38149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
38249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
38349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayOptions(int newOpts) {
38449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int oldOpts = mDisplayOpts;
38549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int changed = oldOpts ^ newOpts;
38649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDisplayOpts = newOpts;
38749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (changed != 0) {
38849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if ((changed & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
38949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if ((newOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
390b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar                    updateHomeAccessibility();
39149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
392d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes                updateNavigationIcon();
39349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
39449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
39549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if ((changed & AFFECTS_LOGO_MASK) != 0) {
39649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                updateToolbarLogo();
39749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
39849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
39949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if ((changed & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
40049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if ((newOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
40149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.setTitle(mTitle);
40249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.setSubtitle(mSubtitle);
40349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                } else {
40449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.setTitle(null);
40549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.setSubtitle(null);
40649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
40749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
40849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
40949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if ((changed & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomView != null) {
41049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if ((newOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) {
41149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.addView(mCustomView);
41249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                } else {
41349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.removeView(mCustomView);
41449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
41549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
41649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
41749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
41849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
41949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
42049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setEmbeddedTabView(ScrollingTabContainerView tabView) {
42149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mTabView != null && mTabView.getParent() == mToolbar) {
42249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.removeView(mTabView);
42349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
42449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTabView = tabView;
42549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (tabView != null && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) {
42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.addView(mTabView, 0);
42749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams();
42849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            lp.width = ViewGroup.LayoutParams.WRAP_CONTENT;
42949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
43049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            lp.gravity = Gravity.START | Gravity.BOTTOM;
43149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            tabView.setAllowCollapse(true);
43249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
43349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
43449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
43549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
43649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasEmbeddedTabs() {
43749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mTabView != null;
43849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
43949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
44049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
44149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isTitleTruncated() {
44249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.isTitleTruncated();
44349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
44449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
44549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
44649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCollapsible(boolean collapsible) {
44749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.setCollapsible(collapsible);
44849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
44949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
45049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
45149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeButtonEnabled(boolean enable) {
45249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Ignore
45349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
45449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
45549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
45649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getNavigationMode() {
45749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mNavigationMode;
45849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
45949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
46049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
46149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationMode(int mode) {
46249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int oldMode = mNavigationMode;
46349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mode != oldMode) {
46449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            switch (oldMode) {
46549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                case ActionBar.NAVIGATION_MODE_LIST:
46649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    if (mSpinner != null && mSpinner.getParent() == mToolbar) {
46749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        mToolbar.removeView(mSpinner);
46849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    }
46949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    break;
47049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                case ActionBar.NAVIGATION_MODE_TABS:
47149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    if (mTabView != null && mTabView.getParent() == mToolbar) {
47249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        mToolbar.removeView(mTabView);
47349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    }
47449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    break;
47549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
47649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
47749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mNavigationMode = mode;
47849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
47949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            switch (mode) {
48049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                case ActionBar.NAVIGATION_MODE_STANDARD:
48149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    break;
48249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                case ActionBar.NAVIGATION_MODE_LIST:
48349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    ensureSpinner();
48449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.addView(mSpinner, 0);
48549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    break;
48649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                case ActionBar.NAVIGATION_MODE_TABS:
48749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    if (mTabView != null) {
48849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        mToolbar.addView(mTabView, 0);
48949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams();
49049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        lp.width = ViewGroup.LayoutParams.WRAP_CONTENT;
49149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
49249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        lp.gravity = Gravity.START | Gravity.BOTTOM;
49349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    }
49449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    break;
49549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                default:
49649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    throw new IllegalArgumentException("Invalid navigation mode " + mode);
49749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
49849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
49949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
50049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
50149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void ensureSpinner() {
50249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mSpinner == null) {
503f933672168f6deff5e3636584bec735416b5a93bChris Banes            mSpinner = new AppCompatSpinner(getContext(), null, R.attr.actionDropDownStyle);
50449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            Toolbar.LayoutParams lp = new Toolbar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
50549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL);
50649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mSpinner.setLayoutParams(lp);
50749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
50849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
50949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
51049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
51149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDropdownParams(SpinnerAdapter adapter,
512f933672168f6deff5e3636584bec735416b5a93bChris Banes            AdapterView.OnItemSelectedListener listener) {
51349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ensureSpinner();
51449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSpinner.setAdapter(adapter);
51549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSpinner.setOnItemSelectedListener(listener);
51649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
51749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
51849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
51949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDropdownSelectedPosition(int position) {
52049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mSpinner == null) {
52149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalStateException(
52249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    "Can't set dropdown selected position without an adapter");
52349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
52449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSpinner.setSelection(position);
52549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
52649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
52749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
52849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getDropdownSelectedPosition() {
52949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mSpinner != null ? mSpinner.getSelectedItemPosition() : 0;
53049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
53149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
53249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
53349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getDropdownItemCount() {
53449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mSpinner != null ? mSpinner.getCount() : 0;
53549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
53649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
53749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
53849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(View view) {
53949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mCustomView != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) {
54049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.removeView(mCustomView);
54149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
54249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mCustomView = view;
54349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (view != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) {
54449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.addView(mCustomView);
54549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
54649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
54749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
54849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
54949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public View getCustomView() {
55049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mCustomView;
55149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
55249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
55349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
55449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void animateToVisibility(int visibility) {
555acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        ViewPropertyAnimatorCompat anim = setupAnimatorToVisibility(visibility,
556acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes                DEFAULT_FADE_DURATION_MS);
557acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        if (anim != null) {
558acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes            anim.start();
559acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        }
560acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    }
561acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes
562acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    @Override
5635e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes    public ViewPropertyAnimatorCompat setupAnimatorToVisibility(final int visibility,
5645e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes            final long duration) {
5655e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes        return ViewCompat.animate(mToolbar)
5665e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                .alpha(visibility == View.VISIBLE ? 1f : 0f)
5675e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                .setDuration(duration)
5685e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                .setListener(new ViewPropertyAnimatorListenerAdapter() {
5695e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                    private boolean mCanceled = false;
5705e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes
5715e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                    @Override
5725e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                    public void onAnimationStart(View view) {
5735e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                        mToolbar.setVisibility(View.VISIBLE);
574acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes                    }
575acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes
5765e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                    @Override
5775e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                    public void onAnimationEnd(View view) {
5785e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                        if (!mCanceled) {
5795e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                            mToolbar.setVisibility(visibility);
5805e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                        }
5815e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                    }
5825e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes
5835e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                    @Override
5845e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                    public void onAnimationCancel(View view) {
5855e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                        mCanceled = true;
5865e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                    }
5875e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes                });
58849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
58949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
59049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
59149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationIcon(Drawable icon) {
59249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mNavIcon = icon;
593acf94897e0924ff5fcd3c5b371ab1aa620cb1dc6Chris Banes        updateNavigationIcon();
59449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
59549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
59649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
59749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationIcon(int resId) {
5984c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banes        setNavigationIcon(resId != 0 ? AppCompatResources.getDrawable(getContext(), resId) : null);
599d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes    }
600d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes
601d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes    @Override
602d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes    public void setDefaultNavigationIcon(Drawable defaultNavigationIcon) {
603d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes        if (mDefaultNavigationIcon != defaultNavigationIcon) {
604d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes            mDefaultNavigationIcon = defaultNavigationIcon;
605d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes            updateNavigationIcon();
606d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes        }
607d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes    }
608d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes
609d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes    private void updateNavigationIcon() {
610d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes        if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
611d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes            mToolbar.setNavigationIcon(mNavIcon != null ? mNavIcon : mDefaultNavigationIcon);
612d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes        } else {
613d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes            mToolbar.setNavigationIcon(null);
614d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes        }
61549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
61649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
61749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
61849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationContentDescription(CharSequence description) {
619b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        mHomeDescription = description;
620b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        updateHomeAccessibility();
62149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
62249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
62349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
62449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationContentDescription(int resId) {
625b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        setNavigationContentDescription(resId == 0 ? null : getContext().getString(resId));
626b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar    }
627b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar
628b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar    private void updateHomeAccessibility() {
629b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
630b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar            if (TextUtils.isEmpty(mHomeDescription)) {
631b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar                mToolbar.setNavigationContentDescription(mDefaultNavigationContentDescription);
632b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar            } else {
633b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar                mToolbar.setNavigationContentDescription(mHomeDescription);
634b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar            }
635b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        }
63649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
63749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
63849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
63949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void saveHierarchyState(SparseArray<Parcelable> toolbarStates) {
64049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.saveHierarchyState(toolbarStates);
64149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
64249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
64349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
64449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void restoreHierarchyState(SparseArray<Parcelable> toolbarStates) {
64549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.restoreHierarchyState(toolbarStates);
64649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
64749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
6486aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    @Override
6496aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    public void setBackgroundDrawable(Drawable d) {
65047082c30c630c34829439a9eecd1cf7e8d255a86Aurimas Liutikas        ViewCompat.setBackground(mToolbar, d);
6516aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    }
6526aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar
6536aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    @Override
6546aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    public int getHeight() {
6556aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mToolbar.getHeight();
6566aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    }
6576aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar
6586aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    @Override
6596aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    public void setVisibility(int visible) {
6606aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mToolbar.setVisibility(visible);
6616aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    }
6626aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar
6636aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    @Override
6646aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    public int getVisibility() {
6656aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mToolbar.getVisibility();
6666aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    }
6676aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar
6686aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    @Override
6696aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    public void setMenuCallbacks(MenuPresenter.Callback actionMenuPresenterCallback,
6706aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            MenuBuilder.Callback menuBuilderCallback) {
6716aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mToolbar.setMenuCallbacks(actionMenuPresenterCallback, menuBuilderCallback);
6726aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    }
6736aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar
6746aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    @Override
6756aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    public Menu getMenu() {
6766aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mToolbar.getMenu();
6776aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar    }
6786aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar
67949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes}