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