1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/*
249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Copyright (C) 2014 The Android Open Source Project
3bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *
4bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Licensed under the Apache License, Version 2.0 (the "License");
5bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * you may not use this file except in compliance with the License.
6bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * You may obtain a copy of the License at
7bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *
8bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *      http://www.apache.org/licenses/LICENSE-2.0
9bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *
10bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Unless required by applicable law or agreed to in writing, software
11bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * distributed under the License is distributed on an "AS IS" BASIS,
12bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * See the License for the specific language governing permissions and
14bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * limitations under the License.
15bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */
16bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1749c78900da0d43140fb602431fb93212bd7f6c70Chris Banespackage android.support.v7.internal.app;
18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
19f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banesimport android.app.Activity;
20bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.app.Dialog;
21bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context;
2259ff0428452802ab5565633e637baa12f29834e8Trevor Johnsimport android.content.res.Configuration;
236b730d46a744ec1621bd294eb626b10b11090ffbChris Banesimport android.content.res.Resources;
2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.res.TypedArray;
25bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.graphics.drawable.Drawable;
2649c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.os.Build;
2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.app.FragmentActivity;
28da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v4.app.FragmentTransaction;
2949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewCompat;
3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorCompat;
3149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListener;
3249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
3349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorUpdateListener;
3449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.app.ActionBar;
35da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.appcompat.R;
36da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.view.ActionBarPolicy;
37d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.internal.view.SupportMenuInflater;
38acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banesimport android.support.v7.internal.view.ViewPropertyAnimatorCompatSet;
39da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.view.menu.MenuBuilder;
4049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.view.menu.MenuPopupHelper;
41da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.view.menu.SubMenuBuilder;
42da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.widget.ActionBarContainer;
43da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.widget.ActionBarContextView;
44da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.widget.ActionBarOverlayLayout;
4549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.widget.DecorToolbar;
46da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.widget.ScrollingTabContainerView;
47acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banesimport android.support.v7.internal.widget.TintManager;
4830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.support.v7.view.ActionMode;
4949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.Toolbar;
506b730d46a744ec1621bd294eb626b10b11090ffbChris Banesimport android.util.TypedValue;
516b730d46a744ec1621bd294eb626b10b11090ffbChris Banesimport android.view.ContextThemeWrapper;
52bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.LayoutInflater;
5330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.Menu;
5430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuInflater;
5530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem;
56bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View;
5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.ViewParent;
5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Window;
59bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.accessibility.AccessibilityEvent;
60acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banesimport android.view.animation.AccelerateInterpolator;
61a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banesimport android.view.animation.AnimationUtils;
62acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banesimport android.view.animation.DecelerateInterpolator;
63acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banesimport android.view.animation.Interpolator;
64bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.widget.SpinnerAdapter;
65bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
66bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport java.lang.ref.WeakReference;
67bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport java.util.ArrayList;
68bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
6949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/**
7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * WindowDecorActionBar is the ActionBar implementation used
7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * by devices of all screen sizes as part of the window decor layout.
7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
7349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide
7449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */
7549c78900da0d43140fb602431fb93212bd7f6c70Chris Banespublic class WindowDecorActionBar extends ActionBar implements
7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ActionBarOverlayLayout.ActionBarVisibilityCallback {
7749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private static final String TAG = "WindowDecorActionBar";
7849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
79acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    private static final Interpolator sHideInterpolator = new AccelerateInterpolator();
80acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    private static final Interpolator sShowInterpolator = new DecelerateInterpolator();
81acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes
828939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes    /**
838939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes     * Only allow show/hide animations on ICS+, as that is what ViewPropertyAnimatorCompat supports
848939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes     */
858939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes    private static final boolean ALLOW_SHOW_HIDE_ANIMATIONS = Build.VERSION.SDK_INT >= 14;
868939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes
87bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private Context mContext;
88bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private Context mThemedContext;
89f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes    private Activity mActivity;
90bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private Dialog mDialog;
91bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
92bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private ActionBarOverlayLayout mOverlayLayout;
93bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private ActionBarContainer mContainerView;
9449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private DecorToolbar mDecorToolbar;
95bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private ActionBarContextView mContextView;
96bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private View mContentView;
97bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private ScrollingTabContainerView mTabScrollView;
98bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
99bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private ArrayList<TabImpl> mTabs = new ArrayList<TabImpl>();
100bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
101bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private TabImpl mSelectedTab;
102bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private int mSavedTabPosition = INVALID_POSITION;
103ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
104bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mDisplayHomeAsUpSet;
105bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
106bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    ActionModeImpl mActionMode;
107bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    ActionMode mDeferredDestroyActionMode;
108bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    ActionMode.Callback mDeferredModeDestroyCallback;
109ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
110bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mLastMenuVisibility;
111bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private ArrayList<OnMenuVisibilityListener> mMenuVisibilityListeners =
11220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            new ArrayList<OnMenuVisibilityListener>();
113bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
114bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private static final int INVALID_POSITION = -1;
115bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
116acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    // The fade duration for toolbar and action bar when entering/exiting action mode.
117acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    private static final long FADE_OUT_DURATION_MS = 100;
118acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    private static final long FADE_IN_DURATION_MS = 200;
119acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes
120bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mHasEmbeddedTabs;
121bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
122bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private int mCurWindowVisibility = View.VISIBLE;
123bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
12449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private boolean mContentAnimations = true;
125bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mHiddenByApp;
126bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mHiddenBySystem;
127bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mShowingForMode;
128bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
129bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mNowShowing = true;
13049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
13155b8ae653ab9402efb19d6309155d18fbebb849eChris Banes    private ViewPropertyAnimatorCompatSet mCurrentShowAnim;
132bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mShowHideAnimationEnabled;
13349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    boolean mHideOnContentScroll;
13449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
135469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    private TintManager mTintManager;
136469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    final ViewPropertyAnimatorListener mHideListener = new ViewPropertyAnimatorListenerAdapter() {
13849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
13949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void onAnimationEnd(View view) {
14049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mContentAnimations && mContentView != null) {
14149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.setTranslationY(mContentView, 0f);
14249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.setTranslationY(mContainerView, 0f);
14349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
14449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContainerView.setVisibility(View.GONE);
14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContainerView.setTransitioning(false);
14649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim = null;
14749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            completeDeferredDestroyActionMode();
14849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mOverlayLayout != null) {
14949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.requestApplyInsets(mOverlayLayout);
15049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
15149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
15249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    };
153bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
15449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    final ViewPropertyAnimatorListener mShowListener = new ViewPropertyAnimatorListenerAdapter() {
15549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
15649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void onAnimationEnd(View view) {
15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim = null;
15849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContainerView.requestLayout();
15949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    };
16149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    final ViewPropertyAnimatorUpdateListener mUpdateListener =
16349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            new ViewPropertyAnimatorUpdateListener() {
16449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                @Override
16549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                public void onAnimationUpdate(View view) {
16649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    final ViewParent parent = mContainerView.getParent();
16749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    ((View) parent).invalidate();
16849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
16949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            };
170bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
171f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes    public WindowDecorActionBar(Activity activity, boolean overlayMode) {
172bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        mActivity = activity;
17349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        Window window = activity.getWindow();
17449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        View decor = window.getDecorView();
17549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        init(decor);
17649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!overlayMode) {
17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContentView = decor.findViewById(android.R.id.content);
17849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
17949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public WindowDecorActionBar(Dialog dialog) {
18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDialog = dialog;
18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        init(dialog.getWindow().getDecorView());
18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * Only for edit mode.
18849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @hide
18949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
19049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public WindowDecorActionBar(View layout) {
19149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        assert layout.isInEditMode();
19249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        init(layout);
19359ff0428452802ab5565633e637baa12f29834e8Trevor Johns    }
19459ff0428452802ab5565633e637baa12f29834e8Trevor Johns
19549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void init(View decor) {
19649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout = (ActionBarOverlayLayout) decor.findViewById(R.id.decor_content_parent);
19759ff0428452802ab5565633e637baa12f29834e8Trevor Johns        if (mOverlayLayout != null) {
19849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mOverlayLayout.setActionBarVisibilityCallback(this);
19959ff0428452802ab5565633e637baa12f29834e8Trevor Johns        }
20049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar = getDecorToolbar(decor.findViewById(R.id.action_bar));
20149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContextView = (ActionBarContextView) decor.findViewById(
20249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                R.id.action_context_bar);
20349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContainerView = (ActionBarContainer) decor.findViewById(
20449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                R.id.action_bar_container);
20549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
20649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mDecorToolbar == null || mContextView == null || mContainerView == null) {
20759ff0428452802ab5565633e637baa12f29834e8Trevor Johns            throw new IllegalStateException(getClass().getSimpleName() + " can only be used " +
20859ff0428452802ab5565633e637baa12f29834e8Trevor Johns                    "with a compatible window decor layout");
20959ff0428452802ab5565633e637baa12f29834e8Trevor Johns        }
21059ff0428452802ab5565633e637baa12f29834e8Trevor Johns
21149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContext = mDecorToolbar.getContext();
21259ff0428452802ab5565633e637baa12f29834e8Trevor Johns
21359ff0428452802ab5565633e637baa12f29834e8Trevor Johns        // This was initially read from the action bar style
21449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int current = mDecorToolbar.getDisplayOptions();
21559ff0428452802ab5565633e637baa12f29834e8Trevor Johns        final boolean homeAsUp = (current & DISPLAY_HOME_AS_UP) != 0;
21659ff0428452802ab5565633e637baa12f29834e8Trevor Johns        if (homeAsUp) {
21759ff0428452802ab5565633e637baa12f29834e8Trevor Johns            mDisplayHomeAsUpSet = true;
21859ff0428452802ab5565633e637baa12f29834e8Trevor Johns        }
21959ff0428452802ab5565633e637baa12f29834e8Trevor Johns
22059ff0428452802ab5565633e637baa12f29834e8Trevor Johns        ActionBarPolicy abp = ActionBarPolicy.get(mContext);
22159ff0428452802ab5565633e637baa12f29834e8Trevor Johns        setHomeButtonEnabled(abp.enableHomeButtonByDefault() || homeAsUp);
22259ff0428452802ab5565633e637baa12f29834e8Trevor Johns        setHasEmbeddedTabs(abp.hasEmbeddedTabs());
22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final TypedArray a = mContext.obtainStyledAttributes(null,
22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                R.styleable.ActionBar,
22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                R.attr.actionBarStyle, 0);
22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (a.getBoolean(R.styleable.ActionBar_hideOnContentScroll, false)) {
22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setHideOnContentScrollEnabled(true);
22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int elevation = a.getDimensionPixelSize(R.styleable.ActionBar_elevation, 0);
23149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (elevation != 0) {
23249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setElevation(elevation);
23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        a.recycle();
23549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private DecorToolbar getDecorToolbar(View view) {
23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (view instanceof DecorToolbar) {
23949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return (DecorToolbar) view;
24049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else if (view instanceof Toolbar) {
24149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return ((Toolbar) view).getWrapper();
24249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
24349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalStateException("Can't make a decor toolbar out of " +
244a9279663ecb98b85bf95a5ba1ebc145756fc13a2Chris Banes                    view != null ? view.getClass().getSimpleName() : "null");
24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setElevation(float elevation) {
25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ViewCompat.setElevation(mContainerView, elevation);
25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
25349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
25449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public float getElevation() {
25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return ViewCompat.getElevation(mContainerView);
25659ff0428452802ab5565633e637baa12f29834e8Trevor Johns    }
25759ff0428452802ab5565633e637baa12f29834e8Trevor Johns
25859ff0428452802ab5565633e637baa12f29834e8Trevor Johns    public void onConfigurationChanged(Configuration newConfig) {
25959ff0428452802ab5565633e637baa12f29834e8Trevor Johns        setHasEmbeddedTabs(ActionBarPolicy.get(mContext).hasEmbeddedTabs());
26059ff0428452802ab5565633e637baa12f29834e8Trevor Johns    }
26159ff0428452802ab5565633e637baa12f29834e8Trevor Johns
26259ff0428452802ab5565633e637baa12f29834e8Trevor Johns    private void setHasEmbeddedTabs(boolean hasEmbeddedTabs) {
26359ff0428452802ab5565633e637baa12f29834e8Trevor Johns        mHasEmbeddedTabs = hasEmbeddedTabs;
26459ff0428452802ab5565633e637baa12f29834e8Trevor Johns        // Switch tab layout configuration if needed
26559ff0428452802ab5565633e637baa12f29834e8Trevor Johns        if (!mHasEmbeddedTabs) {
26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDecorToolbar.setEmbeddedTabView(null);
26759ff0428452802ab5565633e637baa12f29834e8Trevor Johns            mContainerView.setTabContainer(mTabScrollView);
26859ff0428452802ab5565633e637baa12f29834e8Trevor Johns        } else {
26959ff0428452802ab5565633e637baa12f29834e8Trevor Johns            mContainerView.setTabContainer(null);
27049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDecorToolbar.setEmbeddedTabView(mTabScrollView);
27159ff0428452802ab5565633e637baa12f29834e8Trevor Johns        }
27259ff0428452802ab5565633e637baa12f29834e8Trevor Johns        final boolean isInTabMode = getNavigationMode() == NAVIGATION_MODE_TABS;
27359ff0428452802ab5565633e637baa12f29834e8Trevor Johns        if (mTabScrollView != null) {
27459ff0428452802ab5565633e637baa12f29834e8Trevor Johns            if (isInTabMode) {
27559ff0428452802ab5565633e637baa12f29834e8Trevor Johns                mTabScrollView.setVisibility(View.VISIBLE);
27649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if (mOverlayLayout != null) {
27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    ViewCompat.requestApplyInsets(mOverlayLayout);
27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
27959ff0428452802ab5565633e637baa12f29834e8Trevor Johns            } else {
28059ff0428452802ab5565633e637baa12f29834e8Trevor Johns                mTabScrollView.setVisibility(View.GONE);
28159ff0428452802ab5565633e637baa12f29834e8Trevor Johns            }
28259ff0428452802ab5565633e637baa12f29834e8Trevor Johns        }
28349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setCollapsible(!mHasEmbeddedTabs && isInTabMode);
28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout.setHasNonEmbeddedTabs(!mHasEmbeddedTabs && isInTabMode);
28559ff0428452802ab5565633e637baa12f29834e8Trevor Johns    }
28659ff0428452802ab5565633e637baa12f29834e8Trevor Johns
28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void ensureTabsExist() {
28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mTabScrollView != null) {
28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return;
29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
29149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ScrollingTabContainerView tabScroller = new ScrollingTabContainerView(mContext);
29349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mHasEmbeddedTabs) {
29549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            tabScroller.setVisibility(View.VISIBLE);
29649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDecorToolbar.setEmbeddedTabView(tabScroller);
29749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
29849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (getNavigationMode() == NAVIGATION_MODE_TABS) {
29949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                tabScroller.setVisibility(View.VISIBLE);
30049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if (mOverlayLayout != null) {
30149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    ViewCompat.requestApplyInsets(mOverlayLayout);
30249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
30349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            } else {
30449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                tabScroller.setVisibility(View.GONE);
30549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
30649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContainerView.setTabContainer(tabScroller);
30749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
30849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTabScrollView = tabScroller;
309bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
310bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
31149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    void completeDeferredDestroyActionMode() {
31249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mDeferredModeDestroyCallback != null) {
31349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDeferredModeDestroyCallback.onDestroyActionMode(mDeferredDestroyActionMode);
31449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDeferredDestroyActionMode = null;
31549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDeferredModeDestroyCallback = null;
31649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
317bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
318bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
31949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void onWindowVisibilityChanged(int visibility) {
32049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mCurWindowVisibility = visibility;
32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
32449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * Enables or disables animation between show/hide states.
32549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * If animation is disabled using this method, animations in progress
32649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * will be finished.
32749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     *
32849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @param enabled true to animate, false to not animate.
32949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
33049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setShowHideAnimationEnabled(boolean enabled) {
33149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mShowHideAnimationEnabled = enabled;
33249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!enabled && mCurrentShowAnim != null) {
33349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim.cancel();
33449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
33549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
33649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
33749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
33849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mMenuVisibilityListeners.add(listener);
33949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
34049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
34149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
34249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mMenuVisibilityListeners.remove(listener);
34349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
344bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void dispatchMenuVisibilityChanged(boolean isVisible) {
34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (isVisible == mLastMenuVisibility) {
34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return;
34849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
34949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mLastMenuVisibility = isVisible;
35049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
35149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int count = mMenuVisibilityListeners.size();
35249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        for (int i = 0; i < count; i++) {
35349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible);
35449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
355bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
356bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
357bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
358bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setCustomView(int resId) {
35949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setCustomView(LayoutInflater.from(getThemedContext()).inflate(resId,
36049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorToolbar.getViewGroup(), false));
361bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
362bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
363bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
36449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayUseLogoEnabled(boolean useLogo) {
36549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(useLogo ? DISPLAY_USE_LOGO : 0, DISPLAY_USE_LOGO);
366bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
367bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
368bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
36949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowHomeEnabled(boolean showHome) {
37049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME);
371bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
372bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
373bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
37449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) {
37549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP);
376bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
377bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
378bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
37949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowTitleEnabled(boolean showTitle) {
38049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE);
381bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
382bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
383bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
38449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowCustomEnabled(boolean showCustom) {
38549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM);
38649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
38749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
38849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
38949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeButtonEnabled(boolean enable) {
39049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setHomeButtonEnabled(enable);
39149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
39249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
39349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
39449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setTitle(int resId) {
39549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setTitle(mContext.getString(resId));
396bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
397bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
398bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
39949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSubtitle(int resId) {
40049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setSubtitle(mContext.getString(resId));
40149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
40249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
403bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setSelectedNavigationItem(int position) {
40449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (mDecorToolbar.getNavigationMode()) {
405ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            case NAVIGATION_MODE_TABS:
406ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                selectTab(mTabs.get(position));
407ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                break;
408ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            case NAVIGATION_MODE_LIST:
40949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorToolbar.setDropdownSelectedPosition(position);
410ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                break;
411ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            default:
412ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                throw new IllegalStateException(
41320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        "setSelectedNavigationIndex not valid for current navigation mode");
414bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
415bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
416bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
41749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeAllTabs() {
41849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        cleanupTabs();
419bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
420bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
42149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void cleanupTabs() {
42249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mSelectedTab != null) {
42349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            selectTab(null);
42449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
42549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTabs.clear();
42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mTabScrollView != null) {
42749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mTabScrollView.removeAllTabs();
428bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
42949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSavedTabPosition = INVALID_POSITION;
430bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
431bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
432bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setTitle(CharSequence title) {
43349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setTitle(title);
434bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
435bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
436ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    @Override
437ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    public void setWindowTitle(CharSequence title) {
438ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes        mDecorToolbar.setWindowTitle(title);
439ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    }
440ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes
441bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setSubtitle(CharSequence subtitle) {
44249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setSubtitle(subtitle);
443bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
444bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
445bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setDisplayOptions(int options) {
446bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if ((options & DISPLAY_HOME_AS_UP) != 0) {
447bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mDisplayHomeAsUpSet = true;
448bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
44949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setDisplayOptions(options);
450bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
451bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
452bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setDisplayOptions(int options, int mask) {
45349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int current = mDecorToolbar.getDisplayOptions();
454bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if ((mask & DISPLAY_HOME_AS_UP) != 0) {
455bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mDisplayHomeAsUpSet = true;
456bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
45749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setDisplayOptions((options & mask) | (current & ~mask));
458bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
459bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
460bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setBackgroundDrawable(Drawable d) {
461bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        mContainerView.setPrimaryBackground(d);
462bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
463bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
4649eed03ba03beca1add9f1382f02c23439f937e1cChris Banes    public void setStackedBackgroundDrawable(Drawable d) {
4659eed03ba03beca1add9f1382f02c23439f937e1cChris Banes        mContainerView.setStackedBackground(d);
4669eed03ba03beca1add9f1382f02c23439f937e1cChris Banes    }
4679eed03ba03beca1add9f1382f02c23439f937e1cChris Banes
4689eed03ba03beca1add9f1382f02c23439f937e1cChris Banes    public void setSplitBackgroundDrawable(Drawable d) {
469acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        // no-op. We don't support split action bars
4709eed03ba03beca1add9f1382f02c23439f937e1cChris Banes    }
471bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
472bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public View getCustomView() {
47349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getCustomView();
474bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
475bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
476bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public CharSequence getTitle() {
47749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getTitle();
478bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
479bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
480bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public CharSequence getSubtitle() {
48149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getSubtitle();
482bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
483bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
484bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public int getNavigationMode() {
48549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getNavigationMode();
486bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
487bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
48849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getDisplayOptions() {
48949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getDisplayOptions();
49049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
49149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
49249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public ActionMode startActionMode(ActionMode.Callback callback) {
49349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mActionMode != null) {
49449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mActionMode.finish();
495bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
49649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
49749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout.setHideOnContentScrollEnabled(false);
49849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContextView.killMode();
499087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes        ActionModeImpl mode = new ActionModeImpl(mContextView.getContext(), callback);
50049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mode.dispatchOnCreate()) {
50149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mode.invalidate();
50249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContextView.initForMode(mode);
50349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            animateToMode(true);
50449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
50549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mActionMode = mode;
50649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mode;
507bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
50849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return null;
509bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
510bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
51149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void configureTab(Tab tab, int position) {
51249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final TabImpl tabi = (TabImpl) tab;
51349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final ActionBar.TabListener callback = tabi.getCallback();
514bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
51549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (callback == null) {
51649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalStateException("Action Bar Tab must have a Callback");
51749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
51849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
51949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        tabi.setPosition(position);
52049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTabs.add(position, tabi);
52149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
52249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int count = mTabs.size();
52349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        for (int i = position + 1; i < count; i++) {
52449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mTabs.get(i).setPosition(i);
52549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
526bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
527bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
528bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
529bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void addTab(Tab tab) {
530bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        addTab(tab, mTabs.isEmpty());
531bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
532bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
533bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
53449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addTab(Tab tab, int position) {
53549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        addTab(tab, position, mTabs.isEmpty());
53649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
53749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
53849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
539bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void addTab(Tab tab, boolean setSelected) {
540bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        ensureTabsExist();
541bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        mTabScrollView.addTab(tab, setSelected);
542bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        configureTab(tab, mTabs.size());
543bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (setSelected) {
544bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            selectTab(tab);
545bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
546bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
547bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
548bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
549bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void addTab(Tab tab, int position, boolean setSelected) {
550bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        ensureTabsExist();
551bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        mTabScrollView.addTab(tab, position, setSelected);
552bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        configureTab(tab, position);
553bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (setSelected) {
554bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            selectTab(tab);
555bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
556bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
557bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
558bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
55949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Tab newTab() {
56049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return new TabImpl();
56149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
56249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
56349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
56449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeTab(Tab tab) {
565bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        removeTabAt(tab.getPosition());
566bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
567bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
568bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
569bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void removeTabAt(int position) {
570bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (mTabScrollView == null) {
571bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            // No tabs around to remove
572bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            return;
573bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
574bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
575bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        int selectedTabPosition = mSelectedTab != null
57620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                ? mSelectedTab.getPosition() : mSavedTabPosition;
577bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        mTabScrollView.removeTabAt(position);
578bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        TabImpl removedTab = mTabs.remove(position);
579bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (removedTab != null) {
580bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            removedTab.setPosition(-1);
581bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
582bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
583bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        final int newTabCount = mTabs.size();
584bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        for (int i = position; i < newTabCount; i++) {
585bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mTabs.get(i).setPosition(i);
586bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
587bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
588bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (selectedTabPosition == position) {
589bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            selectTab(mTabs.isEmpty() ? null : mTabs.get(Math.max(0, position - 1)));
590bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
591bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
592bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
593bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
594bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void selectTab(Tab tab) {
595bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (getNavigationMode() != NAVIGATION_MODE_TABS) {
596bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mSavedTabPosition = tab != null ? tab.getPosition() : INVALID_POSITION;
597bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            return;
598bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
599bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
600f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes        final FragmentTransaction trans;
601f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes        if (mActivity instanceof FragmentActivity && !mDecorToolbar.getViewGroup().isInEditMode()) {
602f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes            // If we're not in edit mode and our Activity is a FragmentActivity, start a tx
603f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes            trans = ((FragmentActivity) mActivity).getSupportFragmentManager()
604f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes                    .beginTransaction().disallowAddToBackStack();
605f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes        } else {
606f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes            trans = null;
607f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes        }
608bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
609bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (mSelectedTab == tab) {
610bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            if (mSelectedTab != null) {
611bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell                mSelectedTab.getCallback().onTabReselected(mSelectedTab, trans);
612bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell                mTabScrollView.animateToTab(tab.getPosition());
613bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            }
614bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        } else {
615bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mTabScrollView.setTabSelected(tab != null ? tab.getPosition() : Tab.INVALID_POSITION);
616bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            if (mSelectedTab != null) {
617bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell                mSelectedTab.getCallback().onTabUnselected(mSelectedTab, trans);
618bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            }
619bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mSelectedTab = (TabImpl) tab;
620bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            if (mSelectedTab != null) {
621bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell                mSelectedTab.getCallback().onTabSelected(mSelectedTab, trans);
622bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            }
623bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
624bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
62549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (trans != null && !trans.isEmpty()) {
626bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            trans.commit();
627bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
628bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
629bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
630bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
631bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public Tab getSelectedTab() {
632bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        return mSelectedTab;
633bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
634bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
635bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
636bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public int getHeight() {
637bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        return mContainerView.getHeight();
638bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
639bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
64049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void enableContentAnimations(boolean enabled) {
64149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContentAnimations = enabled;
64249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
64349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
644bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
645bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void show() {
646bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (mHiddenByApp) {
647bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mHiddenByApp = false;
648bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            updateVisibility(false);
649bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
650bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
651bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
65249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void showForActionMode() {
653d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (!mShowingForMode) {
654d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mShowingForMode = true;
65549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mOverlayLayout != null) {
65649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mOverlayLayout.setShowingForActionMode(true);
65749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
658d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            updateVisibility(false);
659d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
660d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
661d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
66249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void showForSystem() {
66349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mHiddenBySystem) {
66449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mHiddenBySystem = false;
66549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            updateVisibility(true);
66649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
66749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
66849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
669bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
670bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void hide() {
671bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (!mHiddenByApp) {
672bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mHiddenByApp = true;
673bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            updateVisibility(false);
674bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
675bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
676bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
67749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void hideForActionMode() {
678d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mShowingForMode) {
679d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mShowingForMode = false;
68049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mOverlayLayout != null) {
68149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mOverlayLayout.setShowingForActionMode(false);
68249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
683d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            updateVisibility(false);
684d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
685d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
686d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
68749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void hideForSystem() {
68849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!mHiddenBySystem) {
68949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mHiddenBySystem = true;
69049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            updateVisibility(true);
69149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
692bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
693bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
694bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
69549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) {
69649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (hideOnContentScroll && !mOverlayLayout.isInOverlayMode()) {
69749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalStateException("Action bar must be in overlay mode " +
69849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    "(Window.FEATURE_OVERLAY_ACTION_BAR) to enable hide on content scroll");
69949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
70049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mHideOnContentScroll = hideOnContentScroll;
70149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout.setHideOnContentScrollEnabled(hideOnContentScroll);
702bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
703bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
704bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
70549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isHideOnContentScrollEnabled() {
70649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mOverlayLayout.isHideOnContentScrollEnabled();
707bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
708bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
70949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
71049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getHideOffset() {
71149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mOverlayLayout.getActionBarHideOffset();
71249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
713d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
71449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
71549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHideOffset(int offset) {
71649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (offset != 0 && !mOverlayLayout.isInOverlayMode()) {
71749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalStateException("Action bar must be in overlay mode " +
71849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    "(Window.FEATURE_OVERLAY_ACTION_BAR) to set a non-zero hide offset");
719d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
72049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout.setActionBarHideOffset(offset);
721d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
722d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
72349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private static boolean checkShowingFlags(boolean hiddenByApp, boolean hiddenBySystem,
72449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            boolean showingForMode) {
72549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (showingForMode) {
72649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return true;
72749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else if (hiddenByApp || hiddenBySystem) {
72849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return false;
729d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        } else {
73049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return true;
731d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
732d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
733d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
73449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void updateVisibility(boolean fromSystem) {
73549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Based on the current state, should we be hidden or shown?
73649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final boolean shown = checkShowingFlags(mHiddenByApp, mHiddenBySystem,
73749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mShowingForMode);
738bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
73949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (shown) {
74049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (!mNowShowing) {
74149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mNowShowing = true;
74249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                doShow(fromSystem);
74349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
74449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
74549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mNowShowing) {
74649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mNowShowing = false;
74749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                doHide(fromSystem);
74849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
749ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
75049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
751bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
75249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void doShow(boolean fromSystem) {
75349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mCurrentShowAnim != null) {
75449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim.cancel();
75549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
75649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContainerView.setVisibility(View.VISIBLE);
75749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
7588939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes        if (mCurWindowVisibility == View.VISIBLE && ALLOW_SHOW_HIDE_ANIMATIONS &&
7598939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes                (mShowHideAnimationEnabled || fromSystem)) {
76049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // because we're about to ask its window loc
76149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.setTranslationY(mContainerView, 0f);
76249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            float startingY = -mContainerView.getHeight();
76349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (fromSystem) {
76449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                int topLeft[] = {0, 0};
76549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mContainerView.getLocationInWindow(topLeft);
76649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                startingY -= topLeft[1];
76749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
76849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.setTranslationY(mContainerView, startingY);
76955b8ae653ab9402efb19d6309155d18fbebb849eChris Banes            ViewPropertyAnimatorCompatSet anim = new ViewPropertyAnimatorCompatSet();
77049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorCompat a = ViewCompat.animate(mContainerView).translationY(0f);
77149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            a.setUpdateListener(mUpdateListener);
77249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.play(a);
77349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mContentAnimations && mContentView != null) {
77449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.setTranslationY(mContentView, startingY);
77549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                anim.play(ViewCompat.animate(mContentView).translationY(0f));
77649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
777acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes            anim.setInterpolator(sShowInterpolator);
77849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.setDuration(250);
77949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // If this is being shown from the system, add a small delay.
78049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // This is because we will also be animating in the status bar,
78149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // and these two elements can't be done in lock-step.  So we give
78249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // a little time for the status bar to start its animation before
78349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // the action bar animates.  (This corresponds to the corresponding
78449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // case when hiding, where the status bar has a small delay before
78549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // starting.)
78649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.setListener(mShowListener);
78749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim = anim;
78849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.start();
78949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
79049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.setAlpha(mContainerView, 1f);
79149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.setTranslationY(mContainerView, 0);
79249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mContentAnimations && mContentView != null) {
79349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.setTranslationY(mContentView, 0);
79449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
79549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mShowListener.onAnimationEnd(null);
796ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
79749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mOverlayLayout != null) {
79849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.requestApplyInsets(mOverlayLayout);
799ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
80049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
801bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
80249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void doHide(boolean fromSystem) {
80349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mCurrentShowAnim != null) {
80449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim.cancel();
80549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
80649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
8078939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes        if (mCurWindowVisibility == View.VISIBLE && ALLOW_SHOW_HIDE_ANIMATIONS &&
8088939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes                (mShowHideAnimationEnabled || fromSystem)) {
80949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.setAlpha(mContainerView, 1f);
81049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContainerView.setTransitioning(true);
81155b8ae653ab9402efb19d6309155d18fbebb849eChris Banes            ViewPropertyAnimatorCompatSet anim = new ViewPropertyAnimatorCompatSet();
81249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            float endingY = -mContainerView.getHeight();
81349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (fromSystem) {
81449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                int topLeft[] = {0, 0};
81549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mContainerView.getLocationInWindow(topLeft);
81649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                endingY -= topLeft[1];
817ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
81849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorCompat a = ViewCompat.animate(mContainerView).translationY(endingY);
81949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            a.setUpdateListener(mUpdateListener);
82049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.play(a);
82149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mContentAnimations && mContentView != null) {
82249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                anim.play(ViewCompat.animate(mContentView).translationY(endingY));
82349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
824acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes            anim.setInterpolator(sHideInterpolator);
82549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.setDuration(250);
82649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.setListener(mHideListener);
82749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim = anim;
82849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.start();
82949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
83049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mHideListener.onAnimationEnd(null);
831ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
83249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
833bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
83449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isShowing() {
83549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int height = getHeight();
83649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Take into account the case where the bar has a 0 height due to not being measured yet.
83749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mNowShowing && (height == 0 || getHideOffset() < height);
83849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
839bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
84049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void animateToMode(boolean toActionMode) {
84149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (toActionMode) {
84249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            showForActionMode();
84349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
84449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            hideForActionMode();
845ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
846bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
847acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        ViewPropertyAnimatorCompat fadeIn, fadeOut;
848acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        if (toActionMode) {
849acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes            fadeOut = mDecorToolbar.setupAnimatorToVisibility(View.GONE,
850acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes                    FADE_OUT_DURATION_MS);
851acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes            fadeIn = mContextView.setupAnimatorToVisibility(View.VISIBLE,
852acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes                    FADE_IN_DURATION_MS);
853acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        } else {
854acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes            fadeIn = mDecorToolbar.setupAnimatorToVisibility(View.VISIBLE,
855acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes                    FADE_IN_DURATION_MS);
856acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes            fadeOut = mContextView.setupAnimatorToVisibility(View.GONE,
857acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes                    FADE_OUT_DURATION_MS);
858acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        }
859acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet();
860acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        set.playSequentially(fadeOut, fadeIn);
861acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        set.start();
862c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar        // mTabScrollView's visibility is not affected by action mode.
86349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
864bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
86549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Context getThemedContext() {
86649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mThemedContext == null) {
86749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            TypedValue outValue = new TypedValue();
86849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            Resources.Theme currentTheme = mContext.getTheme();
86949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            currentTheme.resolveAttribute(R.attr.actionBarWidgetTheme, outValue, true);
87049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            final int targetThemeRes = outValue.resourceId;
871bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
87249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (targetThemeRes != 0) {
87349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mThemedContext = new ContextThemeWrapper(mContext, targetThemeRes);
87449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            } else {
87549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mThemedContext = mContext;
876ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
877ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
87849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mThemedContext;
87949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
880bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
88149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
88249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isTitleTruncated() {
88349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar != null && mDecorToolbar.isTitleTruncated();
88449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
885bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
88649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
88749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeAsUpIndicator(Drawable indicator) {
88849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationIcon(indicator);
88949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
890bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
89149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
89249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeAsUpIndicator(int resId) {
89349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationIcon(resId);
89449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
895bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
89649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
89749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeActionContentDescription(CharSequence description) {
89849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationContentDescription(description);
89949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
900bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
90149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
90249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeActionContentDescription(int resId) {
90349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationContentDescription(resId);
90449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
905bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
90649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
90749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void onContentScrollStarted() {
90849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mCurrentShowAnim != null) {
90949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim.cancel();
91049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim = null;
911ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
912bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
913bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
91449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
91549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void onContentScrollStopped() {
91649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
91720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
918e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes    @Override
919e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes    public boolean collapseActionView() {
920e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes        if (mDecorToolbar != null && mDecorToolbar.hasExpandedActionView()) {
921e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes            mDecorToolbar.collapseActionView();
922e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes            return true;
923e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes        }
924e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes        return false;
925e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes    }
926e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes
92749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
92849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @hide
92949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
93049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public class ActionModeImpl extends ActionMode implements MenuBuilder.Callback {
931087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes        private final Context mActionModeContext;
932087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes        private final MenuBuilder mMenu;
933087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes
934ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        private ActionMode.Callback mCallback;
935ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        private WeakReference<View> mCustomView;
936ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
937087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes        public ActionModeImpl(Context context, ActionMode.Callback callback) {
938087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes            mActionModeContext = context;
939ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mCallback = callback;
940087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes            mMenu = new MenuBuilder(context)
94149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
942ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mMenu.setCallback(this);
943ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
944bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
945ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
946ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public MenuInflater getMenuInflater() {
947087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes            return new SupportMenuInflater(mActionModeContext);
948ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
949bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
950ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
951ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public Menu getMenu() {
952ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return mMenu;
953ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
954b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns
955ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
956ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void finish() {
957ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (mActionMode != this) {
958ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                // Not the active action mode - no-op
959ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return;
960ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
961bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
962ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            // If this change in state is going to cause the action bar
963ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            // to be hidden, defer the onDestroy callback until the animation
964ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            // is finished and associated relayout is about to happen. This lets
965ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            // apps better anticipate visibility and layout behavior.
966ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (!checkShowingFlags(mHiddenByApp, mHiddenBySystem, false)) {
967ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                // With the current state but the action bar hidden, our
968ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                // overall showing state is going to be false.
969ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                mDeferredDestroyActionMode = this;
970ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                mDeferredModeDestroyCallback = mCallback;
971ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            } else {
972ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                mCallback.onDestroyActionMode(this);
973ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
974ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mCallback = null;
975d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            animateToMode(false);
976bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
977ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            // Clear out the context mode views after the animation finishes
978ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.closeMode();
97949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDecorToolbar.getViewGroup().sendAccessibilityEvent(
98049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
98149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mOverlayLayout.setHideOnContentScrollEnabled(mHideOnContentScroll);
982bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
983ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mActionMode = null;
984ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
985bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
986ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
987ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void invalidate() {
988789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes            if (mActionMode != this) {
989789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes                // Not the active action mode - no-op. It's possible we are
990789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes                // currently deferring onDestroy, so the app doesn't yet know we
991789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes                // are going away and is trying to use us. That's also a no-op.
992789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes                return;
993789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes            }
994789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes
995d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mMenu.stopDispatchingItemsChanged();
996ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            try {
997ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                mCallback.onPrepareActionMode(this, mMenu);
998ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            } finally {
999ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                mMenu.startDispatchingItemsChanged();
1000ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1001ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1002bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1003ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public boolean dispatchOnCreate() {
1004ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mMenu.stopDispatchingItemsChanged();
1005ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            try {
1006ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return mCallback.onCreateActionMode(this, mMenu);
1007ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            } finally {
1008d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                mMenu.startDispatchingItemsChanged();
1009ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1010ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1011bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1012ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1013ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setCustomView(View view) {
1014ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.setCustomView(view);
1015ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mCustomView = new WeakReference<View>(view);
1016ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1017bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1018ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1019ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setSubtitle(CharSequence subtitle) {
1020ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.setSubtitle(subtitle);
1021ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1022bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1023ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1024ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setTitle(CharSequence title) {
1025ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.setTitle(title);
1026ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1027bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1028ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1029ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setTitle(int resId) {
1030ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            setTitle(mContext.getResources().getString(resId));
1031ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1032bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1033ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1034ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setSubtitle(int resId) {
1035ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            setSubtitle(mContext.getResources().getString(resId));
1036ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1037bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1038ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1039ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public CharSequence getTitle() {
1040ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return mContextView.getTitle();
1041ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1042bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1043ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1044ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public CharSequence getSubtitle() {
1045ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return mContextView.getSubtitle();
1046ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1047bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1048ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1049ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setTitleOptionalHint(boolean titleOptional) {
1050ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            super.setTitleOptionalHint(titleOptional);
1051ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.setTitleOptional(titleOptional);
1052ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1053bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1054ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1055ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public boolean isTitleOptional() {
1056ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return mContextView.isTitleOptional();
1057ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1058bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1059ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1060ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public View getCustomView() {
1061ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return mCustomView != null ? mCustomView.get() : null;
1062ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1063bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1064ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
1065ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (mCallback != null) {
1066ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return mCallback.onActionItemClicked(this, item);
1067ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            } else {
1068ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return false;
1069ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1070ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1071bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1072ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
1073ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1074bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1075ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
1076ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (mCallback == null) {
1077ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return false;
1078ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1079bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1080ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (!subMenu.hasVisibleItems()) {
1081ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return true;
1082ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1083ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
108449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            new MenuPopupHelper(getThemedContext(), subMenu).show();
1085ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return true;
1086ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1087ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
1088ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void onCloseSubMenu(SubMenuBuilder menu) {
1089ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1090ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
109149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void onMenuModeChange(MenuBuilder menu) {
1092ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (mCallback == null) {
1093ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return;
1094ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1095ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            invalidate();
1096ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.showOverflowMenu();
1097ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1098b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns    }
1099b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns
110049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
110149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @hide
110249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
110349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public class TabImpl extends ActionBar.Tab {
110449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private ActionBar.TabListener mCallback;
110549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private Object mTag;
110649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private Drawable mIcon;
110749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private CharSequence mText;
110849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private CharSequence mContentDesc;
110949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private int mPosition = -1;
111049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private View mCustomView;
111149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
111249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
111349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Object getTag() {
111449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mTag;
1115ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1116ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
111749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
111849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setTag(Object tag) {
111949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mTag = tag;
112049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
112149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
1122ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
112349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public ActionBar.TabListener getCallback() {
112449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mCallback;
1125ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1126bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
112749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
112849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setTabListener(ActionBar.TabListener callback) {
112949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCallback = callback;
113049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
113149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
1132ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
113349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
113449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public View getCustomView() {
113549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mCustomView;
1136ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1137bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
113849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
113949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setCustomView(View view) {
114049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCustomView = view;
114149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mPosition >= 0) {
114249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.updateTab(mPosition);
114349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
114449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
114549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
1146bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
114749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
114849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setCustomView(int layoutResId) {
114949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return setCustomView(LayoutInflater.from(getThemedContext())
115049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    .inflate(layoutResId, null));
1151ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1152bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
115349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
115449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Drawable getIcon() {
115549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mIcon;
1156ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
115749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
115849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
115949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public int getPosition() {
116049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mPosition;
1161ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1162bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
116349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void setPosition(int position) {
116449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mPosition = position;
1165ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1166bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
116749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
116849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public CharSequence getText() {
116949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mText;
117049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
1171bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
117249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
117349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setIcon(Drawable icon) {
117449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mIcon = icon;
117549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mPosition >= 0) {
117649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.updateTab(mPosition);
1177ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
117849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
1179ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1180bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
118149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
118249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setIcon(int resId) {
1183469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes            return setIcon(getTintManager().getDrawable(resId));
118449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
118549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
118649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
118749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setText(CharSequence text) {
118849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mText = text;
118949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mPosition >= 0) {
119049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.updateTab(mPosition);
1191a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            }
119249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
1193a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
1194a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
119549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
119649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setText(int resId) {
119749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return setText(mContext.getResources().getText(resId));
1198a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
1199a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
120049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
120149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void select() {
120249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            selectTab(this);
120349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
12048123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
120549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
120649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setContentDescription(int resId) {
120749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return setContentDescription(mContext.getResources().getText(resId));
1208a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
1209a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
121049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
121149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setContentDescription(CharSequence contentDesc) {
121249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContentDesc = contentDesc;
121349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mPosition >= 0) {
121449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.updateTab(mPosition);
1215a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            }
121649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
1217a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
1218bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
121949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
122049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public CharSequence getContentDescription() {
122149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mContentDesc;
1222a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
122349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
122449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
122549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
122649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(View view) {
122749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setCustomView(view);
122849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
122949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
123049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
123149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(View view, LayoutParams layoutParams) {
123249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        view.setLayoutParams(layoutParams);
123349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setCustomView(view);
123449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
1235a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
123649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
123749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) {
123849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setDropdownParams(adapter, new NavItemSelectedListener(callback));
123949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
12408123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
124149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
124249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getSelectedNavigationIndex() {
124349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (mDecorToolbar.getNavigationMode()) {
124449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_TABS:
124549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return mSelectedTab != null ? mSelectedTab.getPosition() : -1;
124649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_LIST:
124749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return mDecorToolbar.getDropdownSelectedPosition();
124849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            default:
124949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return -1;
125049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
125149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
125249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
125349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
125449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getNavigationItemCount() {
125549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (mDecorToolbar.getNavigationMode()) {
125649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_TABS:
125749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return mTabs.size();
125849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_LIST:
125949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return mDecorToolbar.getDropdownItemCount();
126049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            default:
126149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return 0;
1262a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
126349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
126449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
126549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
126649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getTabCount() {
126749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mTabs.size();
126849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
1269a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
127049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
127149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationMode(int mode) {
127249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int oldMode = mDecorToolbar.getNavigationMode();
127349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (oldMode) {
127449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_TABS:
127549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mSavedTabPosition = getSelectedNavigationIndex();
127649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                selectTab(null);
127749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.setVisibility(View.GONE);
127849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                break;
127949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
128049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (oldMode != mode && !mHasEmbeddedTabs) {
128149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mOverlayLayout != null) {
128249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.requestApplyInsets(mOverlayLayout);
1283a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            }
1284a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
128549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationMode(mode);
128649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (mode) {
128749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_TABS:
128849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ensureTabsExist();
128949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.setVisibility(View.VISIBLE);
129049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if (mSavedTabPosition != INVALID_POSITION) {
129149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    setSelectedNavigationItem(mSavedTabPosition);
129249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mSavedTabPosition = INVALID_POSITION;
129349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
129449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                break;
129549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
129649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setCollapsible(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs);
129749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout.setHasNonEmbeddedTabs(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs);
129849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
129949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
130049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
130149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Tab getTabAt(int index) {
130249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mTabs.get(index);
130349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
130449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
130549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
130649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
130749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(int resId) {
130849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setIcon(resId);
1309ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani    }
1310bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
131149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
131249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(Drawable icon) {
131349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setIcon(icon);
131449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
131549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
131649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasIcon() {
131749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.hasIcon();
131849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
131949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
132049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
132149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(int resId) {
132249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setLogo(resId);
132349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
132449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
132549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
132649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(Drawable logo) {
132749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setLogo(logo);
132849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
132949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
133049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasLogo() {
133149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.hasLogo();
133249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
133349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
133449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDefaultDisplayHomeAsUpEnabled(boolean enable) {
133549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!mDisplayHomeAsUpSet) {
133649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setDisplayHomeAsUpEnabled(enable);
133749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
13388123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    }
13398123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
1340469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    TintManager getTintManager() {
1341469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        if (mTintManager == null) {
1342cd6e77607caba0b3b26163791a361938afb8b9c5Chris Banes            mTintManager = TintManager.get(mContext);
1343469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        }
1344469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mTintManager;
1345469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
1346469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
13477fa6a00a4600aac591402398c23fea97721adf26Chris Banes}
1348