ToolbarWidgetWrapper.java revision 49c78900da0d43140fb602431fb93212bd7f6c70
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
1849c78900da0d43140fb602431fb93212bd7f6c70Chris Banespackage android.support.v7.internal.widget;
1949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
2049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.app.ActionBar;
2149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.Context;
2249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.res.TypedArray;
2349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.graphics.drawable.Drawable;
2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.os.Parcelable;
2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewCompat;
2649c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.appcompat.R;
2849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.app.WindowCallback;
2949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.view.menu.ActionMenuItem;
3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.ActionMenuPresenter;
3149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.view.menu.MenuBuilder;
3249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.view.menu.MenuPresenter;
3349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.Toolbar;
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;
4349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.widget.SpinnerAdapter;
4449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
4549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/**
4649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Internal class used to interact with the Toolbar widget without
4749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * exposing interface methods to the public API.
4849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
4949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * <p>ToolbarWidgetWrapper manages the differences between Toolbar and ActionBarView
5049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * so that either variant acting as a
5149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * {@link android.support.v7.internal.app.WindowDecorActionBar WindowDecorActionBar} can behave
5249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * in the same way.</p>
5349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
5449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide
5549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */
5649c78900da0d43140fb602431fb93212bd7f6c70Chris Banespublic class ToolbarWidgetWrapper implements DecorToolbar {
5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private static final String TAG = "ToolbarWidgetWrapper";
5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
5949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private static final int AFFECTS_LOGO_MASK =
6049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO;
6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
6249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private Toolbar mToolbar;
6349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private int mDisplayOpts;
6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private View mTabView;
6649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private SpinnerCompat mSpinner;
6749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private View mCustomView;
6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
6949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private Drawable mIcon;
7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private Drawable mLogo;
7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private Drawable mNavIcon;
7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
7349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private boolean mTitleSet;
7449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private CharSequence mTitle;
7549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private CharSequence mSubtitle;
7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
7749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private WindowCallback mWindowCallback;
7849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private boolean mMenuPrepared;
7949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private ActionMenuPresenter mActionMenuPresenter;
8049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
8149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private int mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD;
8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
8349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public ToolbarWidgetWrapper(Toolbar toolbar) {
8449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar = toolbar;
8549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
8649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTitle = toolbar.getTitle();
8749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSubtitle = toolbar.getSubtitle();
8849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTitleSet = !TextUtils.isEmpty(mTitle);
8949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
9049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final TypedArray a = toolbar.getContext().obtainStyledAttributes(null,
9149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                R.styleable.ActionBar, R.attr.actionBarStyle, 0);
9249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
9349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final CharSequence title = a.getText(R.styleable.ActionBar_title);
9449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!TextUtils.isEmpty(title)) {
9549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setTitle(title);
9649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
9749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final CharSequence subtitle = a.getText(R.styleable.ActionBar_subtitle);
9949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!TextUtils.isEmpty(subtitle)) {
10049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setSubtitle(subtitle);
10149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
10249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
10349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final Drawable logo = a.getDrawable(R.styleable.ActionBar_logo);
10449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (logo != null) {
10549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setLogo(logo);
10649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
10749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
10849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final Drawable icon = a.getDrawable(R.styleable.ActionBar_icon);
10949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (icon != null) {
11049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setIcon(icon);
11149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
11249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
11349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final Drawable navIcon = a.getDrawable(R.styleable.ActionBar_homeAsUpIndicator);
11449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (navIcon != null) {
11549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setNavigationIcon(navIcon);
11649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
11749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
11849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(a.getInt(R.styleable.ActionBar_displayOptions, 0));
11949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
12049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int customNavId = a.getResourceId(R.styleable.ActionBar_customNavigationLayout, 0);
12149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (customNavId != 0) {
12249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setCustomView(LayoutInflater.from(mToolbar.getContext()).inflate(customNavId,
12349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar, false));
12449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setDisplayOptions(mDisplayOpts | ActionBar.DISPLAY_SHOW_CUSTOM);
12549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
12649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
12749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0);
12849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (height > 0) {
12949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            final ViewGroup.LayoutParams lp = mToolbar.getLayoutParams();
13049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            lp.height = height;
13149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.setLayoutParams(lp);
13249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
13349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
13449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int contentInsetStart = a.getDimensionPixelOffset(
13549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                R.styleable.ActionBar_contentInsetStart, -1);
13649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int contentInsetEnd = a.getDimensionPixelOffset(
13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                R.styleable.ActionBar_contentInsetEnd, -1);
13849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (contentInsetStart >= 0 || contentInsetEnd >= 0) {
13949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.setContentInsetsRelative(Math.max(contentInsetStart, 0),
14049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    Math.max(contentInsetEnd, 0));
14149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
14249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
14349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int titleTextStyle = a.getResourceId(R.styleable.ActionBar_titleTextStyle, 0);
14449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (titleTextStyle != 0) {
14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.setTitleTextAppearance(mToolbar.getContext(), titleTextStyle);
14649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
14749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
14849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int subtitleTextStyle = a.getResourceId(R.styleable.ActionBar_subtitleTextStyle, 0);
14949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (subtitleTextStyle != 0) {
15049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.setSubtitleTextAppearance(mToolbar.getContext(), subtitleTextStyle);
15149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
15249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
15349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        a.recycle();
15449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
15549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (TextUtils.isEmpty(mToolbar.getNavigationContentDescription())) {
15649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.setNavigationContentDescription(
15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    getContext().getResources().getText(R.string.abc_action_bar_up_description));
15849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
15949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
16149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            final ActionMenuItem mNavItem = new ActionMenuItem(mToolbar.getContext(),
16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    0, android.R.id.home, 0, 0, mTitle);
16349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            @Override
16449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            public void onClick(View v) {
16549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if (mWindowCallback != null && mMenuPrepared) {
16649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mNavItem);
16749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
16849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
16949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        });
17049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
17149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
17249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
17349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public ViewGroup getViewGroup() {
17449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar;
17549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
17649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
17849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Context getContext() {
17949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.getContext();
18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isSplit() {
18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return false;
18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
18849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasExpandedActionView() {
18949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.hasExpandedActionView();
19049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
19149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
19249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
19349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void collapseActionView() {
19449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.collapseActionView();
19549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
19649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
19749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
19849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setWindowCallback(WindowCallback cb) {
19949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mWindowCallback = cb;
20049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
20149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
20249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
20349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setWindowTitle(CharSequence title) {
20449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // "Real" title always trumps window title.
20549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!mTitleSet) {
20649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setTitleInt(title);
20749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
20849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
20949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
21049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
21149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public CharSequence getTitle() {
21249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.getTitle();
21349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
21449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
21549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
21649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setTitle(CharSequence title) {
21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTitleSet = true;
21849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setTitleInt(title);
21949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
22049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
22149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void setTitleInt(CharSequence title) {
22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTitle = title;
22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.setTitle(title);
22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public CharSequence getSubtitle() {
23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.getSubtitle();
23149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
23249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSubtitle(CharSequence subtitle) {
23549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSubtitle = subtitle;
23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.setSubtitle(subtitle);
23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
23949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
24049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
24149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
24249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void initProgress() {
24349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        Log.i(TAG, "Progress display unsupported");
24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void initIndeterminateProgress() {
24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        Log.i(TAG, "Progress display unsupported");
24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean canSplit() {
25349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return false;
25449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
25649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSplitView(ViewGroup splitView) {
25849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
25949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
26049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
26149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSplitToolbar(boolean split) {
26249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (split) {
26349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new UnsupportedOperationException("Cannot split an android.widget.Toolbar");
26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
26549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
26749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSplitWhenNarrow(boolean splitWhenNarrow) {
26949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Ignore.
27049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
27149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
27249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
27349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasIcon() {
27449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mIcon != null;
27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
27649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasLogo() {
27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mLogo != null;
28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
28249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
28349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(int resId) {
28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setIcon(resId != 0 ? getContext().getResources().getDrawable(resId) : null);
28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
28649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(Drawable d) {
28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mIcon = d;
29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        updateToolbarLogo();
29149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(int resId) {
29549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setLogo(resId != 0 ? getContext().getResources().getDrawable(resId) : null);
29649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
29749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
29949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(Drawable d) {
30049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mLogo = d;
30149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        updateToolbarLogo();
30249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
30349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
30449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void updateToolbarLogo() {
30549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        Drawable logo = null;
30649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_HOME) != 0) {
30749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if ((mDisplayOpts & ActionBar.DISPLAY_USE_LOGO) != 0) {
30849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                logo = mLogo != null ? mLogo : mIcon;
30949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            } else {
31049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                logo = mIcon;
31149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
31249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
31349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.setLogo(logo);
31449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
31549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
31649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
31749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean canShowOverflowMenu() {
31849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.canShowOverflowMenu();
31949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
32049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isOverflowMenuShowing() {
32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.isOverflowMenuShowing();
32449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
32549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
32649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
32749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isOverflowMenuShowPending() {
32849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.isOverflowMenuShowPending();
32949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
33049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
33149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
33249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean showOverflowMenu() {
33349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.showOverflowMenu();
33449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
33549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
33649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
33749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hideOverflowMenu() {
33849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.hideOverflowMenu();
33949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
34049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
34149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
34249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setMenuPrepared() {
34349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mMenuPrepared = true;
34449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setMenu(Menu menu, MenuPresenter.Callback cb) {
34849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mActionMenuPresenter == null) {
34949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mActionMenuPresenter = new ActionMenuPresenter(mToolbar.getContext());
35049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mActionMenuPresenter.setId(R.id.action_menu_presenter);
35149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
35249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mActionMenuPresenter.setCallback(cb);
35349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.setMenu((MenuBuilder) menu, mActionMenuPresenter);
35449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
35549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
35649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
35749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void dismissPopupMenus() {
35849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.dismissPopupMenus();
35949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
36049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
36149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
36249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getDisplayOptions() {
36349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDisplayOpts;
36449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
36549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
36649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
36749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayOptions(int newOpts) {
36849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int oldOpts = mDisplayOpts;
36949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int changed = oldOpts ^ newOpts;
37049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDisplayOpts = newOpts;
37149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (changed != 0) {
37249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if ((changed & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
37349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if ((newOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
37449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.setNavigationIcon(mNavIcon);
37549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                } else {
37649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.setNavigationIcon(null);
37749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
37849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
37949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
38049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if ((changed & AFFECTS_LOGO_MASK) != 0) {
38149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                updateToolbarLogo();
38249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
38349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
38449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if ((changed & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
38549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if ((newOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
38649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.setTitle(mTitle);
38749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.setSubtitle(mSubtitle);
38849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                } else {
38949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.setTitle(null);
39049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.setSubtitle(null);
39149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
39249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
39349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
39449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if ((changed & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomView != null) {
39549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if ((newOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) {
39649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.addView(mCustomView);
39749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                } else {
39849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.removeView(mCustomView);
39949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
40049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
40149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
40249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
40349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
40449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
40549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setEmbeddedTabView(ScrollingTabContainerView tabView) {
40649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mTabView != null && mTabView.getParent() == mToolbar) {
40749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.removeView(mTabView);
40849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
40949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTabView = tabView;
41049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (tabView != null && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) {
41149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.addView(mTabView, 0);
41249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams();
41349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            lp.width = ViewGroup.LayoutParams.WRAP_CONTENT;
41449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
41549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            lp.gravity = Gravity.START | Gravity.BOTTOM;
41649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            tabView.setAllowCollapse(true);
41749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
41849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
41949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
42049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
42149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasEmbeddedTabs() {
42249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mTabView != null;
42349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
42449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
42549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isTitleTruncated() {
42749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mToolbar.isTitleTruncated();
42849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
42949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
43049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
43149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCollapsible(boolean collapsible) {
43249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.setCollapsible(collapsible);
43349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
43449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
43549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
43649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeButtonEnabled(boolean enable) {
43749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Ignore
43849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
43949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
44049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
44149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getNavigationMode() {
44249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mNavigationMode;
44349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
44449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
44549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
44649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationMode(int mode) {
44749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int oldMode = mNavigationMode;
44849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mode != oldMode) {
44949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            switch (oldMode) {
45049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                case ActionBar.NAVIGATION_MODE_LIST:
45149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    if (mSpinner != null && mSpinner.getParent() == mToolbar) {
45249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        mToolbar.removeView(mSpinner);
45349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    }
45449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    break;
45549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                case ActionBar.NAVIGATION_MODE_TABS:
45649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    if (mTabView != null && mTabView.getParent() == mToolbar) {
45749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        mToolbar.removeView(mTabView);
45849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    }
45949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    break;
46049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
46149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
46249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mNavigationMode = mode;
46349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
46449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            switch (mode) {
46549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                case ActionBar.NAVIGATION_MODE_STANDARD:
46649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    break;
46749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                case ActionBar.NAVIGATION_MODE_LIST:
46849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    ensureSpinner();
46949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mToolbar.addView(mSpinner, 0);
47049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    break;
47149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                case ActionBar.NAVIGATION_MODE_TABS:
47249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    if (mTabView != null) {
47349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        mToolbar.addView(mTabView, 0);
47449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams();
47549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        lp.width = ViewGroup.LayoutParams.WRAP_CONTENT;
47649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
47749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        lp.gravity = Gravity.START | Gravity.BOTTOM;
47849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    }
47949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    break;
48049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                default:
48149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    throw new IllegalArgumentException("Invalid navigation mode " + mode);
48249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
48349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
48449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
48549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
48649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void ensureSpinner() {
48749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mSpinner == null) {
48849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mSpinner = new SpinnerCompat(getContext(), null, R.attr.actionDropDownStyle);
48949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            Toolbar.LayoutParams lp = new Toolbar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
49049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL);
49149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mSpinner.setLayoutParams(lp);
49249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
49349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
49449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
49549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
49649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDropdownParams(SpinnerAdapter adapter,
49749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            AdapterViewCompat.OnItemSelectedListener listener) {
49849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ensureSpinner();
49949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSpinner.setAdapter(adapter);
50049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSpinner.setOnItemSelectedListener(listener);
50149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
50249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
50349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
50449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDropdownSelectedPosition(int position) {
50549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mSpinner == null) {
50649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalStateException(
50749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    "Can't set dropdown selected position without an adapter");
50849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
50949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSpinner.setSelection(position);
51049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
51149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
51249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
51349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getDropdownSelectedPosition() {
51449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mSpinner != null ? mSpinner.getSelectedItemPosition() : 0;
51549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
51649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
51749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
51849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getDropdownItemCount() {
51949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mSpinner != null ? mSpinner.getCount() : 0;
52049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
52149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
52249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
52349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(View view) {
52449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mCustomView != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) {
52549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.removeView(mCustomView);
52649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
52749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mCustomView = view;
52849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (view != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) {
52949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.addView(mCustomView);
53049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
53149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
53249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
53349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
53449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public View getCustomView() {
53549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mCustomView;
53649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
53749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
53849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
53949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void animateToVisibility(int visibility) {
54049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (visibility == View.GONE) {
54149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.animate(mToolbar).translationY(mToolbar.getHeight()).alpha(0)
54249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    .setListener(new ViewPropertyAnimatorListenerAdapter() {
54349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        private boolean mCanceled = false;
54449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        @Override
54549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        public void onAnimationEnd(View view) {
54649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                            if (!mCanceled) {
54749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                                mToolbar.setVisibility(View.GONE);
54849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                            }
54949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        }
55049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
55149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        @Override
55249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        public void onAnimationCancel(View view) {
55349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                            mCanceled = true;
55449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        }
55549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    });
55649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else if (visibility == View.VISIBLE) {
55749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.animate(mToolbar).translationY(0).alpha(1)
55849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    .setListener(new ViewPropertyAnimatorListenerAdapter() {
55949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        @Override
56049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        public void onAnimationStart(View view) {
56149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                            mToolbar.setVisibility(View.VISIBLE);
56249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        }
56349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    });
56449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
56549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
56649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
56749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
56849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationIcon(Drawable icon) {
56949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mNavIcon = icon;
57049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
57149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mToolbar.setNavigationIcon(icon);
57249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
57349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
57449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
57549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
57649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationIcon(int resId) {
57749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setNavigationIcon(resId != 0 ? mToolbar.getContext().getResources().getDrawable(resId) : null);
57849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
57949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
58049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
58149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationContentDescription(CharSequence description) {
58249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.setNavigationContentDescription(description);
58349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
58449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
58549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
58649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationContentDescription(int resId) {
58749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.setNavigationContentDescription(resId);
58849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
58949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
59049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
59149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void saveHierarchyState(SparseArray<Parcelable> toolbarStates) {
59249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.saveHierarchyState(toolbarStates);
59349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
59449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
59549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
59649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void restoreHierarchyState(SparseArray<Parcelable> toolbarStates) {
59749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mToolbar.restoreHierarchyState(toolbarStates);
59849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
59949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
60049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes}