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
1766698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banespackage android.support.v7.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;
27c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo;
2849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.app.FragmentActivity;
29da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v4.app.FragmentTransaction;
3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewCompat;
3149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorCompat;
3249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListener;
3349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
3449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorUpdateListener;
35da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.appcompat.R;
364c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banesimport android.support.v7.content.res.AppCompatResources;
3766698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.ActionBarPolicy;
3830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.support.v7.view.ActionMode;
3966698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.SupportMenuInflater;
4066698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.ViewPropertyAnimatorCompatSet;
4166698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuBuilder;
4266698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuPopupHelper;
4366698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.SubMenuBuilder;
4466698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.widget.ActionBarContainer;
4566698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.widget.ActionBarContextView;
4666698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.widget.ActionBarOverlayLayout;
4766698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.widget.DecorToolbar;
4866698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.widget.ScrollingTabContainerView;
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;
57a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mountimport android.view.ViewGroup;
5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.ViewParent;
5949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Window;
60bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.accessibility.AccessibilityEvent;
61acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banesimport android.view.animation.AccelerateInterpolator;
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
69c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport static android.support.annotation.RestrictTo.Scope.GROUP_ID;
70c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette
7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/**
7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * WindowDecorActionBar is the ActionBar implementation used
7349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * by devices of all screen sizes as part of the window decor layout.
7449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
7549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide
7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */
77c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette@RestrictTo(GROUP_ID)
7849c78900da0d43140fb602431fb93212bd7f6c70Chris Banespublic class WindowDecorActionBar extends ActionBar implements
7949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ActionBarOverlayLayout.ActionBarVisibilityCallback {
8049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private static final String TAG = "WindowDecorActionBar";
8149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
82acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    private static final Interpolator sHideInterpolator = new AccelerateInterpolator();
83acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    private static final Interpolator sShowInterpolator = new DecelerateInterpolator();
84acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes
858939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes    /**
868939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes     * Only allow show/hide animations on ICS+, as that is what ViewPropertyAnimatorCompat supports
878939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes     */
888939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes    private static final boolean ALLOW_SHOW_HIDE_ANIMATIONS = Build.VERSION.SDK_INT >= 14;
898939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes
902c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    Context mContext;
91bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private Context mThemedContext;
92f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes    private Activity mActivity;
93bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private Dialog mDialog;
94bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
952c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    ActionBarOverlayLayout mOverlayLayout;
962c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    ActionBarContainer mContainerView;
972c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    DecorToolbar mDecorToolbar;
982c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    ActionBarContextView mContextView;
992c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    View mContentView;
1002c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    ScrollingTabContainerView mTabScrollView;
101bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
102bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private ArrayList<TabImpl> mTabs = new ArrayList<TabImpl>();
103bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
104bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private TabImpl mSelectedTab;
105bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private int mSavedTabPosition = INVALID_POSITION;
106ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
107bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mDisplayHomeAsUpSet;
108bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
109bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    ActionModeImpl mActionMode;
110bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    ActionMode mDeferredDestroyActionMode;
111bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    ActionMode.Callback mDeferredModeDestroyCallback;
112ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
113bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mLastMenuVisibility;
114bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private ArrayList<OnMenuVisibilityListener> mMenuVisibilityListeners =
11520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            new ArrayList<OnMenuVisibilityListener>();
116bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
117bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private static final int INVALID_POSITION = -1;
118bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
119acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    // The fade duration for toolbar and action bar when entering/exiting action mode.
120acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    private static final long FADE_OUT_DURATION_MS = 100;
121acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes    private static final long FADE_IN_DURATION_MS = 200;
122acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes
123bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mHasEmbeddedTabs;
124bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
125bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private int mCurWindowVisibility = View.VISIBLE;
126bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1272c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    boolean mContentAnimations = true;
1282c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    boolean mHiddenByApp;
1292c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    boolean mHiddenBySystem;
130bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mShowingForMode;
131bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
132bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mNowShowing = true;
13349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
1342c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    ViewPropertyAnimatorCompatSet mCurrentShowAnim;
135bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    private boolean mShowHideAnimationEnabled;
13649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    boolean mHideOnContentScroll;
13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
13849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    final ViewPropertyAnimatorListener mHideListener = new ViewPropertyAnimatorListenerAdapter() {
13949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
14049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void onAnimationEnd(View view) {
14149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mContentAnimations && mContentView != null) {
14249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.setTranslationY(mContentView, 0f);
14349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.setTranslationY(mContainerView, 0f);
14449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContainerView.setVisibility(View.GONE);
14649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContainerView.setTransitioning(false);
14749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim = null;
14849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            completeDeferredDestroyActionMode();
14949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mOverlayLayout != null) {
15049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.requestApplyInsets(mOverlayLayout);
15149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
15249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
15349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    };
154bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
15549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    final ViewPropertyAnimatorListener mShowListener = new ViewPropertyAnimatorListenerAdapter() {
15649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void onAnimationEnd(View view) {
15849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim = null;
15949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContainerView.requestLayout();
16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
16149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    };
16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
16349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    final ViewPropertyAnimatorUpdateListener mUpdateListener =
16449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            new ViewPropertyAnimatorUpdateListener() {
16549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                @Override
16649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                public void onAnimationUpdate(View view) {
16749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    final ViewParent parent = mContainerView.getParent();
16849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    ((View) parent).invalidate();
16949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
17049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            };
171bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
172f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes    public WindowDecorActionBar(Activity activity, boolean overlayMode) {
173bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        mActivity = activity;
17449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        Window window = activity.getWindow();
17549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        View decor = window.getDecorView();
17649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        init(decor);
17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!overlayMode) {
17849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContentView = decor.findViewById(android.R.id.content);
17949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public WindowDecorActionBar(Dialog dialog) {
18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDialog = dialog;
18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        init(dialog.getWindow().getDecorView());
18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
18849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * Only for edit mode.
18949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @hide
19049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
191c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette    @RestrictTo(GROUP_ID)
19249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public WindowDecorActionBar(View layout) {
19349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        assert layout.isInEditMode();
19449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        init(layout);
19559ff0428452802ab5565633e637baa12f29834e8Trevor Johns    }
19659ff0428452802ab5565633e637baa12f29834e8Trevor Johns
19749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void init(View decor) {
19849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout = (ActionBarOverlayLayout) decor.findViewById(R.id.decor_content_parent);
19959ff0428452802ab5565633e637baa12f29834e8Trevor Johns        if (mOverlayLayout != null) {
20049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mOverlayLayout.setActionBarVisibilityCallback(this);
20159ff0428452802ab5565633e637baa12f29834e8Trevor Johns        }
20249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar = getDecorToolbar(decor.findViewById(R.id.action_bar));
20349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContextView = (ActionBarContextView) decor.findViewById(
20449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                R.id.action_context_bar);
20549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContainerView = (ActionBarContainer) decor.findViewById(
20649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                R.id.action_bar_container);
20749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
20849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mDecorToolbar == null || mContextView == null || mContainerView == null) {
20959ff0428452802ab5565633e637baa12f29834e8Trevor Johns            throw new IllegalStateException(getClass().getSimpleName() + " can only be used " +
21059ff0428452802ab5565633e637baa12f29834e8Trevor Johns                    "with a compatible window decor layout");
21159ff0428452802ab5565633e637baa12f29834e8Trevor Johns        }
21259ff0428452802ab5565633e637baa12f29834e8Trevor Johns
21349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContext = mDecorToolbar.getContext();
21459ff0428452802ab5565633e637baa12f29834e8Trevor Johns
21559ff0428452802ab5565633e637baa12f29834e8Trevor Johns        // This was initially read from the action bar style
21649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int current = mDecorToolbar.getDisplayOptions();
21759ff0428452802ab5565633e637baa12f29834e8Trevor Johns        final boolean homeAsUp = (current & DISPLAY_HOME_AS_UP) != 0;
21859ff0428452802ab5565633e637baa12f29834e8Trevor Johns        if (homeAsUp) {
21959ff0428452802ab5565633e637baa12f29834e8Trevor Johns            mDisplayHomeAsUpSet = true;
22059ff0428452802ab5565633e637baa12f29834e8Trevor Johns        }
22159ff0428452802ab5565633e637baa12f29834e8Trevor Johns
22259ff0428452802ab5565633e637baa12f29834e8Trevor Johns        ActionBarPolicy abp = ActionBarPolicy.get(mContext);
22359ff0428452802ab5565633e637baa12f29834e8Trevor Johns        setHomeButtonEnabled(abp.enableHomeButtonByDefault() || homeAsUp);
22459ff0428452802ab5565633e637baa12f29834e8Trevor Johns        setHasEmbeddedTabs(abp.hasEmbeddedTabs());
22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final TypedArray a = mContext.obtainStyledAttributes(null,
22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                R.styleable.ActionBar,
22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                R.attr.actionBarStyle, 0);
22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (a.getBoolean(R.styleable.ActionBar_hideOnContentScroll, false)) {
23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setHideOnContentScrollEnabled(true);
23149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
23249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int elevation = a.getDimensionPixelSize(R.styleable.ActionBar_elevation, 0);
23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (elevation != 0) {
23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setElevation(elevation);
23549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        a.recycle();
23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
23949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private DecorToolbar getDecorToolbar(View view) {
24049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (view instanceof DecorToolbar) {
24149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return (DecorToolbar) view;
24249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else if (view instanceof Toolbar) {
24349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return ((Toolbar) view).getWrapper();
24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalStateException("Can't make a decor toolbar out of " +
246a9279663ecb98b85bf95a5ba1ebc145756fc13a2Chris Banes                    view != null ? view.getClass().getSimpleName() : "null");
24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setElevation(float elevation) {
25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ViewCompat.setElevation(mContainerView, elevation);
25349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
25449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
25649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public float getElevation() {
25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return ViewCompat.getElevation(mContainerView);
25859ff0428452802ab5565633e637baa12f29834e8Trevor Johns    }
25959ff0428452802ab5565633e637baa12f29834e8Trevor Johns
26059ff0428452802ab5565633e637baa12f29834e8Trevor Johns    public void onConfigurationChanged(Configuration newConfig) {
26159ff0428452802ab5565633e637baa12f29834e8Trevor Johns        setHasEmbeddedTabs(ActionBarPolicy.get(mContext).hasEmbeddedTabs());
26259ff0428452802ab5565633e637baa12f29834e8Trevor Johns    }
26359ff0428452802ab5565633e637baa12f29834e8Trevor Johns
26459ff0428452802ab5565633e637baa12f29834e8Trevor Johns    private void setHasEmbeddedTabs(boolean hasEmbeddedTabs) {
26559ff0428452802ab5565633e637baa12f29834e8Trevor Johns        mHasEmbeddedTabs = hasEmbeddedTabs;
26659ff0428452802ab5565633e637baa12f29834e8Trevor Johns        // Switch tab layout configuration if needed
26759ff0428452802ab5565633e637baa12f29834e8Trevor Johns        if (!mHasEmbeddedTabs) {
26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDecorToolbar.setEmbeddedTabView(null);
26959ff0428452802ab5565633e637baa12f29834e8Trevor Johns            mContainerView.setTabContainer(mTabScrollView);
27059ff0428452802ab5565633e637baa12f29834e8Trevor Johns        } else {
27159ff0428452802ab5565633e637baa12f29834e8Trevor Johns            mContainerView.setTabContainer(null);
27249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDecorToolbar.setEmbeddedTabView(mTabScrollView);
27359ff0428452802ab5565633e637baa12f29834e8Trevor Johns        }
27459ff0428452802ab5565633e637baa12f29834e8Trevor Johns        final boolean isInTabMode = getNavigationMode() == NAVIGATION_MODE_TABS;
27559ff0428452802ab5565633e637baa12f29834e8Trevor Johns        if (mTabScrollView != null) {
27659ff0428452802ab5565633e637baa12f29834e8Trevor Johns            if (isInTabMode) {
27759ff0428452802ab5565633e637baa12f29834e8Trevor Johns                mTabScrollView.setVisibility(View.VISIBLE);
27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if (mOverlayLayout != null) {
27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    ViewCompat.requestApplyInsets(mOverlayLayout);
28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
28159ff0428452802ab5565633e637baa12f29834e8Trevor Johns            } else {
28259ff0428452802ab5565633e637baa12f29834e8Trevor Johns                mTabScrollView.setVisibility(View.GONE);
28359ff0428452802ab5565633e637baa12f29834e8Trevor Johns            }
28459ff0428452802ab5565633e637baa12f29834e8Trevor Johns        }
28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setCollapsible(!mHasEmbeddedTabs && isInTabMode);
28649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout.setHasNonEmbeddedTabs(!mHasEmbeddedTabs && isInTabMode);
28759ff0428452802ab5565633e637baa12f29834e8Trevor Johns    }
28859ff0428452802ab5565633e637baa12f29834e8Trevor Johns
28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void ensureTabsExist() {
29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mTabScrollView != null) {
29149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return;
29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
29349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ScrollingTabContainerView tabScroller = new ScrollingTabContainerView(mContext);
29549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mHasEmbeddedTabs) {
29749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            tabScroller.setVisibility(View.VISIBLE);
29849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDecorToolbar.setEmbeddedTabView(tabScroller);
29949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
30049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (getNavigationMode() == NAVIGATION_MODE_TABS) {
30149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                tabScroller.setVisibility(View.VISIBLE);
30249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if (mOverlayLayout != null) {
30349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    ViewCompat.requestApplyInsets(mOverlayLayout);
30449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
30549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            } else {
30649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                tabScroller.setVisibility(View.GONE);
30749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
30849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContainerView.setTabContainer(tabScroller);
30949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
31049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTabScrollView = tabScroller;
311bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
312bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
31349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    void completeDeferredDestroyActionMode() {
31449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mDeferredModeDestroyCallback != null) {
31549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDeferredModeDestroyCallback.onDestroyActionMode(mDeferredDestroyActionMode);
31649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDeferredDestroyActionMode = null;
31749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDeferredModeDestroyCallback = null;
31849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
319bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
320bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void onWindowVisibilityChanged(int visibility) {
32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mCurWindowVisibility = visibility;
32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
32449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
32549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
32649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * Enables or disables animation between show/hide states.
32749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * If animation is disabled using this method, animations in progress
32849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * will be finished.
32949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     *
33049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @param enabled true to animate, false to not animate.
33149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
33249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setShowHideAnimationEnabled(boolean enabled) {
33349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mShowHideAnimationEnabled = enabled;
33449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!enabled && mCurrentShowAnim != null) {
33549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim.cancel();
33649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
33749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
33849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
33949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
34049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mMenuVisibilityListeners.add(listener);
34149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
34249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
34349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
34449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mMenuVisibilityListeners.remove(listener);
34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
346bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void dispatchMenuVisibilityChanged(boolean isVisible) {
34849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (isVisible == mLastMenuVisibility) {
34949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return;
35049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
35149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mLastMenuVisibility = isVisible;
35249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
35349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int count = mMenuVisibilityListeners.size();
35449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        for (int i = 0; i < count; i++) {
35549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible);
35649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
357bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
358bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
359bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
360bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setCustomView(int resId) {
36149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setCustomView(LayoutInflater.from(getThemedContext()).inflate(resId,
36249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorToolbar.getViewGroup(), false));
363bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
364bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
365bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
36649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayUseLogoEnabled(boolean useLogo) {
36749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(useLogo ? DISPLAY_USE_LOGO : 0, DISPLAY_USE_LOGO);
368bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
369bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
370bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
37149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowHomeEnabled(boolean showHome) {
37249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME);
373bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
374bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
375bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
37649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) {
37749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP);
378bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
379bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
380bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
38149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowTitleEnabled(boolean showTitle) {
38249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE);
383bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
384bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
385bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
38649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowCustomEnabled(boolean showCustom) {
38749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM);
38849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
38949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
39049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
39149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeButtonEnabled(boolean enable) {
39249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setHomeButtonEnabled(enable);
39349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
39449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
39549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
39649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setTitle(int resId) {
39749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setTitle(mContext.getString(resId));
398bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
399bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
400bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
40149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSubtitle(int resId) {
40249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setSubtitle(mContext.getString(resId));
40349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
40449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
405bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setSelectedNavigationItem(int position) {
40649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (mDecorToolbar.getNavigationMode()) {
407ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            case NAVIGATION_MODE_TABS:
408ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                selectTab(mTabs.get(position));
409ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                break;
410ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            case NAVIGATION_MODE_LIST:
41149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorToolbar.setDropdownSelectedPosition(position);
412ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                break;
413ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            default:
414ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                throw new IllegalStateException(
41520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        "setSelectedNavigationIndex not valid for current navigation mode");
416bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
417bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
418bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
41949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeAllTabs() {
42049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        cleanupTabs();
421bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
422bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
42349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void cleanupTabs() {
42449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mSelectedTab != null) {
42549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            selectTab(null);
42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
42749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTabs.clear();
42849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mTabScrollView != null) {
42949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mTabScrollView.removeAllTabs();
430bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
43149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mSavedTabPosition = INVALID_POSITION;
432bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
433bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
434bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setTitle(CharSequence title) {
43549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setTitle(title);
436bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
437bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
438ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    @Override
439ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    public void setWindowTitle(CharSequence title) {
440ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes        mDecorToolbar.setWindowTitle(title);
441ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    }
442ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes
443a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount    @Override
444a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount    public boolean requestFocus() {
445a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount        final ViewGroup viewGroup = mDecorToolbar.getViewGroup();
446a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount        if (viewGroup != null && !viewGroup.hasFocus()) {
447a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount            viewGroup.requestFocus();
448a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount            return true;
449a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount        }
450a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount        return false;
451a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount    }
452a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount
453bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setSubtitle(CharSequence subtitle) {
45449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setSubtitle(subtitle);
455bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
456bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
457bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setDisplayOptions(int options) {
458bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if ((options & DISPLAY_HOME_AS_UP) != 0) {
459bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mDisplayHomeAsUpSet = true;
460bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
46149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setDisplayOptions(options);
462bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
463bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
464bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setDisplayOptions(int options, int mask) {
46549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int current = mDecorToolbar.getDisplayOptions();
466bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if ((mask & DISPLAY_HOME_AS_UP) != 0) {
467bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mDisplayHomeAsUpSet = true;
468bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
46949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setDisplayOptions((options & mask) | (current & ~mask));
470bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
471bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
472bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void setBackgroundDrawable(Drawable d) {
473bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        mContainerView.setPrimaryBackground(d);
474bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
475bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
4769eed03ba03beca1add9f1382f02c23439f937e1cChris Banes    public void setStackedBackgroundDrawable(Drawable d) {
4779eed03ba03beca1add9f1382f02c23439f937e1cChris Banes        mContainerView.setStackedBackground(d);
4789eed03ba03beca1add9f1382f02c23439f937e1cChris Banes    }
4799eed03ba03beca1add9f1382f02c23439f937e1cChris Banes
4809eed03ba03beca1add9f1382f02c23439f937e1cChris Banes    public void setSplitBackgroundDrawable(Drawable d) {
481acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        // no-op. We don't support split action bars
4829eed03ba03beca1add9f1382f02c23439f937e1cChris Banes    }
483bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
484bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public View getCustomView() {
48549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getCustomView();
486bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
487bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
488bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public CharSequence getTitle() {
48949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getTitle();
490bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
491bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
492bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public CharSequence getSubtitle() {
49349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getSubtitle();
494bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
495bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
496bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public int getNavigationMode() {
49749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getNavigationMode();
498bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
499bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
50049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getDisplayOptions() {
50149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getDisplayOptions();
50249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
50349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
50449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public ActionMode startActionMode(ActionMode.Callback callback) {
50549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mActionMode != null) {
50649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mActionMode.finish();
507bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
50849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
50949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout.setHideOnContentScrollEnabled(false);
51049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContextView.killMode();
511087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes        ActionModeImpl mode = new ActionModeImpl(mContextView.getContext(), callback);
51249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mode.dispatchOnCreate()) {
513bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes            // This needs to be set before invalidate() so that it calls
514bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes            // onPrepareActionMode()
515bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes            mActionMode = mode;
51649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mode.invalidate();
51749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContextView.initForMode(mode);
51849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            animateToMode(true);
51949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
52049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mode;
521bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
52249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return null;
523bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
524bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
52549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void configureTab(Tab tab, int position) {
52649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final TabImpl tabi = (TabImpl) tab;
52749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final ActionBar.TabListener callback = tabi.getCallback();
528bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
52949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (callback == null) {
53049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalStateException("Action Bar Tab must have a Callback");
53149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
53249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
53349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        tabi.setPosition(position);
53449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mTabs.add(position, tabi);
53549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
53649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int count = mTabs.size();
53749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        for (int i = position + 1; i < count; i++) {
53849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mTabs.get(i).setPosition(i);
53949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
540bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
541bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
542bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
543bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void addTab(Tab tab) {
544bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        addTab(tab, mTabs.isEmpty());
545bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
546bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
547bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
54849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addTab(Tab tab, int position) {
54949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        addTab(tab, position, mTabs.isEmpty());
55049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
55149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
55249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
553bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void addTab(Tab tab, boolean setSelected) {
554bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        ensureTabsExist();
555bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        mTabScrollView.addTab(tab, setSelected);
556bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        configureTab(tab, mTabs.size());
557bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (setSelected) {
558bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            selectTab(tab);
559bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
560bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
561bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
562bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
563bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void addTab(Tab tab, int position, boolean setSelected) {
564bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        ensureTabsExist();
565bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        mTabScrollView.addTab(tab, position, setSelected);
566bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        configureTab(tab, position);
567bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (setSelected) {
568bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            selectTab(tab);
569bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
570bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
571bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
572bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
57349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Tab newTab() {
57449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return new TabImpl();
57549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
57649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
57749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
57849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeTab(Tab tab) {
579bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        removeTabAt(tab.getPosition());
580bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
581bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
582bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
583bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void removeTabAt(int position) {
584bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (mTabScrollView == null) {
585bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            // No tabs around to remove
586bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            return;
587bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
588bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
589bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        int selectedTabPosition = mSelectedTab != null
59020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                ? mSelectedTab.getPosition() : mSavedTabPosition;
591bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        mTabScrollView.removeTabAt(position);
592bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        TabImpl removedTab = mTabs.remove(position);
593bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (removedTab != null) {
594bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            removedTab.setPosition(-1);
595bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
596bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
597bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        final int newTabCount = mTabs.size();
598bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        for (int i = position; i < newTabCount; i++) {
599bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mTabs.get(i).setPosition(i);
600bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
601bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
602bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (selectedTabPosition == position) {
603bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            selectTab(mTabs.isEmpty() ? null : mTabs.get(Math.max(0, position - 1)));
604bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
605bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
606bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
607bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
608bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void selectTab(Tab tab) {
609bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (getNavigationMode() != NAVIGATION_MODE_TABS) {
610bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mSavedTabPosition = tab != null ? tab.getPosition() : INVALID_POSITION;
611bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            return;
612bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
613bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
614f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes        final FragmentTransaction trans;
615f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes        if (mActivity instanceof FragmentActivity && !mDecorToolbar.getViewGroup().isInEditMode()) {
616f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes            // If we're not in edit mode and our Activity is a FragmentActivity, start a tx
617f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes            trans = ((FragmentActivity) mActivity).getSupportFragmentManager()
618f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes                    .beginTransaction().disallowAddToBackStack();
619f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes        } else {
620f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes            trans = null;
621f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes        }
622bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
623bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (mSelectedTab == tab) {
624bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            if (mSelectedTab != null) {
625bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell                mSelectedTab.getCallback().onTabReselected(mSelectedTab, trans);
626bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell                mTabScrollView.animateToTab(tab.getPosition());
627bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            }
628bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        } else {
629bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mTabScrollView.setTabSelected(tab != null ? tab.getPosition() : Tab.INVALID_POSITION);
630bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            if (mSelectedTab != null) {
631bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell                mSelectedTab.getCallback().onTabUnselected(mSelectedTab, trans);
632bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            }
633bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mSelectedTab = (TabImpl) tab;
634bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            if (mSelectedTab != null) {
635bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell                mSelectedTab.getCallback().onTabSelected(mSelectedTab, trans);
636bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            }
637bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
638bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
63949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (trans != null && !trans.isEmpty()) {
640bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            trans.commit();
641bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
642bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
643bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
644bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
645bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public Tab getSelectedTab() {
646bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        return mSelectedTab;
647bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
648bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
649bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
650bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public int getHeight() {
651bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        return mContainerView.getHeight();
652bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
653bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
65449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void enableContentAnimations(boolean enabled) {
65549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContentAnimations = enabled;
65649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
65749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
658bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
659bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void show() {
660bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (mHiddenByApp) {
661bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mHiddenByApp = false;
662bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            updateVisibility(false);
663bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
664bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
665bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
66649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void showForActionMode() {
667d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (!mShowingForMode) {
668d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mShowingForMode = true;
66949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mOverlayLayout != null) {
67049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mOverlayLayout.setShowingForActionMode(true);
67149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
672d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            updateVisibility(false);
673d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
674d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
675d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
67649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void showForSystem() {
67749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mHiddenBySystem) {
67849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mHiddenBySystem = false;
67949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            updateVisibility(true);
68049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
68149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
68249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
683bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
684bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    public void hide() {
685bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        if (!mHiddenByApp) {
686bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            mHiddenByApp = true;
687bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell            updateVisibility(false);
688bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
689bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
690bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
69149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void hideForActionMode() {
692d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mShowingForMode) {
693d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mShowingForMode = false;
69449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mOverlayLayout != null) {
69549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mOverlayLayout.setShowingForActionMode(false);
69649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
697d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            updateVisibility(false);
698d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
699d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
700d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
70149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void hideForSystem() {
70249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!mHiddenBySystem) {
70349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mHiddenBySystem = true;
70449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            updateVisibility(true);
70549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
706bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
707bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
708bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
70949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) {
71049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (hideOnContentScroll && !mOverlayLayout.isInOverlayMode()) {
71149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalStateException("Action bar must be in overlay mode " +
71249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    "(Window.FEATURE_OVERLAY_ACTION_BAR) to enable hide on content scroll");
71349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
71449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mHideOnContentScroll = hideOnContentScroll;
71549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout.setHideOnContentScrollEnabled(hideOnContentScroll);
716bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
717bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
718bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    @Override
71949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isHideOnContentScrollEnabled() {
72049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mOverlayLayout.isHideOnContentScrollEnabled();
721bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
722bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
72349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
72449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getHideOffset() {
72549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mOverlayLayout.getActionBarHideOffset();
72649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
727d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
72849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
72949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHideOffset(int offset) {
73049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (offset != 0 && !mOverlayLayout.isInOverlayMode()) {
73149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalStateException("Action bar must be in overlay mode " +
73249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    "(Window.FEATURE_OVERLAY_ACTION_BAR) to set a non-zero hide offset");
733d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
73449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout.setActionBarHideOffset(offset);
735d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
736d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
7372c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    static boolean checkShowingFlags(boolean hiddenByApp, boolean hiddenBySystem,
73849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            boolean showingForMode) {
73949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (showingForMode) {
74049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return true;
74149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else if (hiddenByApp || hiddenBySystem) {
74249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return false;
743d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        } else {
74449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return true;
745d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
746d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
747d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
74849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void updateVisibility(boolean fromSystem) {
74949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Based on the current state, should we be hidden or shown?
75049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final boolean shown = checkShowingFlags(mHiddenByApp, mHiddenBySystem,
75149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mShowingForMode);
752bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
75349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (shown) {
75449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (!mNowShowing) {
75549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mNowShowing = true;
75649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                doShow(fromSystem);
75749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
75849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
75949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mNowShowing) {
76049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mNowShowing = false;
76149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                doHide(fromSystem);
76249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
763ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
76449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
765bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
76649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void doShow(boolean fromSystem) {
76749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mCurrentShowAnim != null) {
76849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim.cancel();
76949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
77049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mContainerView.setVisibility(View.VISIBLE);
77149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
7728939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes        if (mCurWindowVisibility == View.VISIBLE && ALLOW_SHOW_HIDE_ANIMATIONS &&
7738939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes                (mShowHideAnimationEnabled || fromSystem)) {
77449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // because we're about to ask its window loc
77549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.setTranslationY(mContainerView, 0f);
77649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            float startingY = -mContainerView.getHeight();
77749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (fromSystem) {
77849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                int topLeft[] = {0, 0};
77949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mContainerView.getLocationInWindow(topLeft);
78049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                startingY -= topLeft[1];
78149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
78249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.setTranslationY(mContainerView, startingY);
78355b8ae653ab9402efb19d6309155d18fbebb849eChris Banes            ViewPropertyAnimatorCompatSet anim = new ViewPropertyAnimatorCompatSet();
78449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorCompat a = ViewCompat.animate(mContainerView).translationY(0f);
78549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            a.setUpdateListener(mUpdateListener);
78649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.play(a);
78749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mContentAnimations && mContentView != null) {
78849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.setTranslationY(mContentView, startingY);
78949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                anim.play(ViewCompat.animate(mContentView).translationY(0f));
79049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
791acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes            anim.setInterpolator(sShowInterpolator);
79249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.setDuration(250);
79349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // If this is being shown from the system, add a small delay.
79449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // This is because we will also be animating in the status bar,
79549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // and these two elements can't be done in lock-step.  So we give
79649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // a little time for the status bar to start its animation before
79749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // the action bar animates.  (This corresponds to the corresponding
79849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // case when hiding, where the status bar has a small delay before
79949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // starting.)
80049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.setListener(mShowListener);
80149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim = anim;
80249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.start();
80349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
80449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.setAlpha(mContainerView, 1f);
80549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.setTranslationY(mContainerView, 0);
80649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mContentAnimations && mContentView != null) {
80749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.setTranslationY(mContentView, 0);
80849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
80949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mShowListener.onAnimationEnd(null);
810ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
81149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mOverlayLayout != null) {
81249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.requestApplyInsets(mOverlayLayout);
813ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
81449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
815bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
81649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void doHide(boolean fromSystem) {
81749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mCurrentShowAnim != null) {
81849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim.cancel();
81949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
82049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
8218939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes        if (mCurWindowVisibility == View.VISIBLE && ALLOW_SHOW_HIDE_ANIMATIONS &&
8228939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes                (mShowHideAnimationEnabled || fromSystem)) {
82349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewCompat.setAlpha(mContainerView, 1f);
82449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContainerView.setTransitioning(true);
82555b8ae653ab9402efb19d6309155d18fbebb849eChris Banes            ViewPropertyAnimatorCompatSet anim = new ViewPropertyAnimatorCompatSet();
82649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            float endingY = -mContainerView.getHeight();
82749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (fromSystem) {
82849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                int topLeft[] = {0, 0};
82949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mContainerView.getLocationInWindow(topLeft);
83049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                endingY -= topLeft[1];
831ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
83249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorCompat a = ViewCompat.animate(mContainerView).translationY(endingY);
83349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            a.setUpdateListener(mUpdateListener);
83449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.play(a);
83549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mContentAnimations && mContentView != null) {
83649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                anim.play(ViewCompat.animate(mContentView).translationY(endingY));
83749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
838acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes            anim.setInterpolator(sHideInterpolator);
83949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.setDuration(250);
84049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.setListener(mHideListener);
84149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim = anim;
84249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            anim.start();
84349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
84449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mHideListener.onAnimationEnd(null);
845ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
84649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
847bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
84849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isShowing() {
84949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int height = getHeight();
85049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Take into account the case where the bar has a 0 height due to not being measured yet.
85149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mNowShowing && (height == 0 || getHideOffset() < height);
85249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
853bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
85449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void animateToMode(boolean toActionMode) {
85549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (toActionMode) {
85649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            showForActionMode();
85749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else {
85849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            hideForActionMode();
859ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
860bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
86145b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes        if (shouldAnimateContextView()) {
86245b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes            ViewPropertyAnimatorCompat fadeIn, fadeOut;
86345b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes            if (toActionMode) {
86445b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                // We use INVISIBLE for the Toolbar to make sure that the container has a non-zero
86545b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                // height throughout. The context view is GONE initially, so will not have been laid
86645b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                // out when the animation starts. This can lead to the container collapsing to 0px
86745b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                // height for a short period.
86845b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                fadeOut = mDecorToolbar.setupAnimatorToVisibility(View.INVISIBLE,
86945b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                        FADE_OUT_DURATION_MS);
87045b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                fadeIn = mContextView.setupAnimatorToVisibility(View.VISIBLE,
87145b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                        FADE_IN_DURATION_MS);
87245b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes            } else {
87345b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                fadeIn = mDecorToolbar.setupAnimatorToVisibility(View.VISIBLE,
87445b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                        FADE_IN_DURATION_MS);
87545b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                fadeOut = mContextView.setupAnimatorToVisibility(View.GONE,
87645b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                        FADE_OUT_DURATION_MS);
87745b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes            }
87845b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes            ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet();
87945b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes            set.playSequentially(fadeOut, fadeIn);
88045b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes            set.start();
881acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes        } else {
88245b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes            if (toActionMode) {
88345b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                mDecorToolbar.setVisibility(View.INVISIBLE);
88445b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                mContextView.setVisibility(View.VISIBLE);
88545b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes            } else {
88645b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                mDecorToolbar.setVisibility(View.VISIBLE);
88745b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes                mContextView.setVisibility(View.GONE);
88845b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes            }
88945b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes        }
890c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar        // mTabScrollView's visibility is not affected by action mode.
89149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
892bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
89345b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes    private boolean shouldAnimateContextView() {
89445b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes        // We only to animate the action mode in if the container view has already been laid out.
89545b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes        // If it hasn't been laid out, it hasn't been drawn to screen yet.
89645b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes        return ViewCompat.isLaidOut(mContainerView);
89745b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes    }
89845b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes
89949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Context getThemedContext() {
90049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mThemedContext == null) {
90149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            TypedValue outValue = new TypedValue();
90249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            Resources.Theme currentTheme = mContext.getTheme();
90349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            currentTheme.resolveAttribute(R.attr.actionBarWidgetTheme, outValue, true);
90449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            final int targetThemeRes = outValue.resourceId;
905bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
90649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (targetThemeRes != 0) {
90749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mThemedContext = new ContextThemeWrapper(mContext, targetThemeRes);
90849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            } else {
90949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mThemedContext = mContext;
910ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
911ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
91249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mThemedContext;
91349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
914bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
91549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
91649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isTitleTruncated() {
91749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar != null && mDecorToolbar.isTitleTruncated();
91849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
919bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
92049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
92149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeAsUpIndicator(Drawable indicator) {
92249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationIcon(indicator);
92349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
924bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
92549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
92649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeAsUpIndicator(int resId) {
92749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationIcon(resId);
92849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
929bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
93049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
93149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeActionContentDescription(CharSequence description) {
93249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationContentDescription(description);
93349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
934bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
93549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
93649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeActionContentDescription(int resId) {
93749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationContentDescription(resId);
93849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
939bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
94049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
94149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void onContentScrollStarted() {
94249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mCurrentShowAnim != null) {
94349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim.cancel();
94449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCurrentShowAnim = null;
945ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
946bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell    }
947bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
94849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
94949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void onContentScrollStopped() {
95049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
95120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
952e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes    @Override
953e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes    public boolean collapseActionView() {
954e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes        if (mDecorToolbar != null && mDecorToolbar.hasExpandedActionView()) {
955e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes            mDecorToolbar.collapseActionView();
956e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes            return true;
957e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes        }
958e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes        return false;
959e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes    }
960e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes
96149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
96249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @hide
96349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
964c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette    @RestrictTo(GROUP_ID)
96549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public class ActionModeImpl extends ActionMode implements MenuBuilder.Callback {
966087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes        private final Context mActionModeContext;
967087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes        private final MenuBuilder mMenu;
968087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes
969ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        private ActionMode.Callback mCallback;
970ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        private WeakReference<View> mCustomView;
971ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
972087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes        public ActionModeImpl(Context context, ActionMode.Callback callback) {
973087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes            mActionModeContext = context;
974ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mCallback = callback;
975087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes            mMenu = new MenuBuilder(context)
97649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
977ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mMenu.setCallback(this);
978ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
979bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
980ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
981ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public MenuInflater getMenuInflater() {
982087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes            return new SupportMenuInflater(mActionModeContext);
983ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
984bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
985ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
986ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public Menu getMenu() {
987ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return mMenu;
988ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
989b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns
990ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
991ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void finish() {
992ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (mActionMode != this) {
993ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                // Not the active action mode - no-op
994ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return;
995ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
996bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
997ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            // If this change in state is going to cause the action bar
998ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            // to be hidden, defer the onDestroy callback until the animation
999ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            // is finished and associated relayout is about to happen. This lets
1000ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            // apps better anticipate visibility and layout behavior.
1001ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (!checkShowingFlags(mHiddenByApp, mHiddenBySystem, false)) {
1002ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                // With the current state but the action bar hidden, our
1003ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                // overall showing state is going to be false.
1004ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                mDeferredDestroyActionMode = this;
1005ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                mDeferredModeDestroyCallback = mCallback;
1006ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            } else {
1007ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                mCallback.onDestroyActionMode(this);
1008ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1009ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mCallback = null;
1010d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            animateToMode(false);
1011bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1012ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            // Clear out the context mode views after the animation finishes
1013ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.closeMode();
101449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDecorToolbar.getViewGroup().sendAccessibilityEvent(
101549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
101649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mOverlayLayout.setHideOnContentScrollEnabled(mHideOnContentScroll);
1017bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1018ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mActionMode = null;
1019ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1020bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1021ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1022ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void invalidate() {
1023789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes            if (mActionMode != this) {
1024789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes                // Not the active action mode - no-op. It's possible we are
1025789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes                // currently deferring onDestroy, so the app doesn't yet know we
1026789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes                // are going away and is trying to use us. That's also a no-op.
1027789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes                return;
1028789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes            }
1029789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes
1030d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mMenu.stopDispatchingItemsChanged();
1031ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            try {
1032ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                mCallback.onPrepareActionMode(this, mMenu);
1033ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            } finally {
1034ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                mMenu.startDispatchingItemsChanged();
1035ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1036ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1037bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1038ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public boolean dispatchOnCreate() {
1039ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mMenu.stopDispatchingItemsChanged();
1040ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            try {
1041ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return mCallback.onCreateActionMode(this, mMenu);
1042ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            } finally {
1043d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                mMenu.startDispatchingItemsChanged();
1044ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1045ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1046bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1047ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1048ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setCustomView(View view) {
1049ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.setCustomView(view);
1050ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mCustomView = new WeakReference<View>(view);
1051ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1052bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1053ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1054ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setSubtitle(CharSequence subtitle) {
1055ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.setSubtitle(subtitle);
1056ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1057bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1058ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1059ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setTitle(CharSequence title) {
1060ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.setTitle(title);
1061ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1062bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1063ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1064ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setTitle(int resId) {
1065ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            setTitle(mContext.getResources().getString(resId));
1066ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1067bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1068ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1069ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setSubtitle(int resId) {
1070ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            setSubtitle(mContext.getResources().getString(resId));
1071ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1072bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1073ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1074ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public CharSequence getTitle() {
1075ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return mContextView.getTitle();
1076ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1077bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1078ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1079ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public CharSequence getSubtitle() {
1080ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return mContextView.getSubtitle();
1081ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1082bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1083ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1084ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void setTitleOptionalHint(boolean titleOptional) {
1085ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            super.setTitleOptionalHint(titleOptional);
1086ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.setTitleOptional(titleOptional);
1087ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1088bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1089ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1090ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public boolean isTitleOptional() {
1091ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return mContextView.isTitleOptional();
1092ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1093bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1094ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        @Override
1095ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public View getCustomView() {
1096ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return mCustomView != null ? mCustomView.get() : null;
1097ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1098bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1099ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
1100ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (mCallback != null) {
1101ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return mCallback.onActionItemClicked(this, item);
1102ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            } else {
1103ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return false;
1104ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1105ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1106bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1107ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
1108ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1109bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1110ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
1111ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (mCallback == null) {
1112ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return false;
1113ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1114bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1115ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (!subMenu.hasVisibleItems()) {
1116ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return true;
1117ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1118ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
111949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            new MenuPopupHelper(getThemedContext(), subMenu).show();
1120ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            return true;
1121ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1122ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
1123ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        public void onCloseSubMenu(SubMenuBuilder menu) {
1124ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1125ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
112649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void onMenuModeChange(MenuBuilder menu) {
1127ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            if (mCallback == null) {
1128ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani                return;
1129ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
1130ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            invalidate();
1131ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            mContextView.showOverflowMenu();
1132ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1133b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns    }
1134b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns
113549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
113649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @hide
113749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
1138c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette    @RestrictTo(GROUP_ID)
113949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public class TabImpl extends ActionBar.Tab {
114049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private ActionBar.TabListener mCallback;
114149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private Object mTag;
114249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private Drawable mIcon;
114349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private CharSequence mText;
114449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private CharSequence mContentDesc;
114549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private int mPosition = -1;
114649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private View mCustomView;
114749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
114849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
114949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Object getTag() {
115049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mTag;
1151ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1152ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
115349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
115449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setTag(Object tag) {
115549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mTag = tag;
115649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
115749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
1158ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
115949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public ActionBar.TabListener getCallback() {
116049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mCallback;
1161ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1162bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
116349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
116449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setTabListener(ActionBar.TabListener callback) {
116549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCallback = callback;
116649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
116749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
1168ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani
116949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
117049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public View getCustomView() {
117149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mCustomView;
1172ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1173bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
117449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
117549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setCustomView(View view) {
117649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mCustomView = view;
117749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mPosition >= 0) {
117849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.updateTab(mPosition);
117949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
118049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
118149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
1182bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
118349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
118449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setCustomView(int layoutResId) {
118549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return setCustomView(LayoutInflater.from(getThemedContext())
118649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    .inflate(layoutResId, null));
1187ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1188bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
118949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
119049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Drawable getIcon() {
119149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mIcon;
1192ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
119349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
119449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
119549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public int getPosition() {
119649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mPosition;
1197ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1198bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
119949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void setPosition(int position) {
120049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mPosition = position;
1201ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1202bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
120349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
120449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public CharSequence getText() {
120549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mText;
120649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
1207bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
120849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
120949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setIcon(Drawable icon) {
121049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mIcon = icon;
121149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mPosition >= 0) {
121249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.updateTab(mPosition);
1213ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani            }
121449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
1215ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani        }
1216bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
121749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
121849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setIcon(int resId) {
12194c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banes            return setIcon(AppCompatResources.getDrawable(mContext, resId));
122049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
122149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
122249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
122349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setText(CharSequence text) {
122449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mText = text;
122549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mPosition >= 0) {
122649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.updateTab(mPosition);
1227a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            }
122849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
1229a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
1230a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
123149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
123249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setText(int resId) {
123349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return setText(mContext.getResources().getText(resId));
1234a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
1235a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
123649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
123749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void select() {
123849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            selectTab(this);
123949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
12408123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
124149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
124249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setContentDescription(int resId) {
124349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return setContentDescription(mContext.getResources().getText(resId));
1244a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
1245a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
124649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
124749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public Tab setContentDescription(CharSequence contentDesc) {
124849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mContentDesc = contentDesc;
124949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mPosition >= 0) {
125049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.updateTab(mPosition);
1251a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            }
125249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return this;
1253a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
1254bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
125549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
125649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public CharSequence getContentDescription() {
125749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return mContentDesc;
1258a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
125949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
126049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
126149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
126249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(View view) {
126349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setCustomView(view);
126449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
126549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
126649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
126749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(View view, LayoutParams layoutParams) {
126849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        view.setLayoutParams(layoutParams);
126949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setCustomView(view);
127049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
1271a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
127249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
127349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) {
127449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setDropdownParams(adapter, new NavItemSelectedListener(callback));
127549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
12768123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
127749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
127849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getSelectedNavigationIndex() {
127949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (mDecorToolbar.getNavigationMode()) {
128049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_TABS:
128149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return mSelectedTab != null ? mSelectedTab.getPosition() : -1;
128249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_LIST:
128349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return mDecorToolbar.getDropdownSelectedPosition();
128449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            default:
128549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return -1;
128649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
128749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
128849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
128949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
129049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getNavigationItemCount() {
129149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (mDecorToolbar.getNavigationMode()) {
129249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_TABS:
129349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return mTabs.size();
129449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_LIST:
129549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return mDecorToolbar.getDropdownItemCount();
129649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            default:
129749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                return 0;
1298a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
129949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
130049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
130149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
130249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getTabCount() {
130349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mTabs.size();
130449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
1305a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
130649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
130749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationMode(int mode) {
130849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int oldMode = mDecorToolbar.getNavigationMode();
130949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (oldMode) {
131049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_TABS:
131149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mSavedTabPosition = getSelectedNavigationIndex();
131249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                selectTab(null);
131349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.setVisibility(View.GONE);
131449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                break;
131549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
131649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (oldMode != mode && !mHasEmbeddedTabs) {
131749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mOverlayLayout != null) {
131849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ViewCompat.requestApplyInsets(mOverlayLayout);
1319a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            }
1320a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
132149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationMode(mode);
132249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (mode) {
132349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_TABS:
132449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ensureTabsExist();
132549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mTabScrollView.setVisibility(View.VISIBLE);
132649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if (mSavedTabPosition != INVALID_POSITION) {
132749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    setSelectedNavigationItem(mSavedTabPosition);
132849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mSavedTabPosition = INVALID_POSITION;
132949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
133049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                break;
133149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
133249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setCollapsible(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs);
133349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mOverlayLayout.setHasNonEmbeddedTabs(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs);
133449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
133549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
133649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
133749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Tab getTabAt(int index) {
133849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mTabs.get(index);
133949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
134049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
134149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
134249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
134349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(int resId) {
134449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setIcon(resId);
1345ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani    }
1346bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
134749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
134849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(Drawable icon) {
134949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setIcon(icon);
135049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
135149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
135249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasIcon() {
135349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.hasIcon();
135449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
135549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
135649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
135749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(int resId) {
135849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setLogo(resId);
135949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
136049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
136149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
136249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(Drawable logo) {
136349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setLogo(logo);
136449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
136549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
136649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean hasLogo() {
136749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.hasLogo();
136849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
136949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
137049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDefaultDisplayHomeAsUpEnabled(boolean enable) {
137149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (!mDisplayHomeAsUpSet) {
137249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            setDisplayHomeAsUpEnabled(enable);
137349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
13748123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    }
13757fa6a00a4600aac591402398c23fea97721adf26Chris Banes}
1376