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; 2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.app.FragmentActivity; 28da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v4.app.FragmentTransaction; 2949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewCompat; 3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorCompat; 3149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListener; 3249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListenerAdapter; 3349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorUpdateListener; 34da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.appcompat.R; 3566698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.ActionBarPolicy; 3630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.support.v7.view.ActionMode; 3766698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.SupportMenuInflater; 3866698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.ViewPropertyAnimatorCompatSet; 3966698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuBuilder; 4066698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuPopupHelper; 4166698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.SubMenuBuilder; 4266698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.widget.ActionBarContainer; 4366698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.widget.ActionBarContextView; 4466698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.widget.ActionBarOverlayLayout; 4566698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.widget.AppCompatDrawableManager; 4666698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.widget.DecorToolbar; 4766698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.widget.ScrollingTabContainerView; 4849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.Toolbar; 496b730d46a744ec1621bd294eb626b10b11090ffbChris Banesimport android.util.TypedValue; 506b730d46a744ec1621bd294eb626b10b11090ffbChris Banesimport android.view.ContextThemeWrapper; 51bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.LayoutInflater; 5230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.Menu; 5330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuInflater; 5430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem; 55bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View; 56a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mountimport android.view.ViewGroup; 5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.ViewParent; 5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Window; 59bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.accessibility.AccessibilityEvent; 60acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banesimport android.view.animation.AccelerateInterpolator; 61acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banesimport android.view.animation.DecelerateInterpolator; 62acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banesimport android.view.animation.Interpolator; 63bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.widget.SpinnerAdapter; 64bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 65bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport java.lang.ref.WeakReference; 66bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport java.util.ArrayList; 67bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/** 6949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * WindowDecorActionBar is the ActionBar implementation used 7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * by devices of all screen sizes as part of the window decor layout. 7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * 7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide 7349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */ 7449c78900da0d43140fb602431fb93212bd7f6c70Chris Banespublic class WindowDecorActionBar extends ActionBar implements 7549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ActionBarOverlayLayout.ActionBarVisibilityCallback { 7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private static final String TAG = "WindowDecorActionBar"; 7749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 78acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes private static final Interpolator sHideInterpolator = new AccelerateInterpolator(); 79acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes private static final Interpolator sShowInterpolator = new DecelerateInterpolator(); 80acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 818939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes /** 828939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes * Only allow show/hide animations on ICS+, as that is what ViewPropertyAnimatorCompat supports 838939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes */ 848939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes private static final boolean ALLOW_SHOW_HIDE_ANIMATIONS = Build.VERSION.SDK_INT >= 14; 858939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes 86bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private Context mContext; 87bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private Context mThemedContext; 88f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes private Activity mActivity; 89bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private Dialog mDialog; 90bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 91bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ActionBarOverlayLayout mOverlayLayout; 92bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ActionBarContainer mContainerView; 9349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private DecorToolbar mDecorToolbar; 94bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ActionBarContextView mContextView; 95bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private View mContentView; 96bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ScrollingTabContainerView mTabScrollView; 97bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 98bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ArrayList<TabImpl> mTabs = new ArrayList<TabImpl>(); 99bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 100bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private TabImpl mSelectedTab; 101bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private int mSavedTabPosition = INVALID_POSITION; 102ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 103bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mDisplayHomeAsUpSet; 104bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 105bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell ActionModeImpl mActionMode; 106bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell ActionMode mDeferredDestroyActionMode; 107bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell ActionMode.Callback mDeferredModeDestroyCallback; 108ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 109bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mLastMenuVisibility; 110bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ArrayList<OnMenuVisibilityListener> mMenuVisibilityListeners = 11120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns new ArrayList<OnMenuVisibilityListener>(); 112bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 113bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private static final int INVALID_POSITION = -1; 114bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 115acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // The fade duration for toolbar and action bar when entering/exiting action mode. 116acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes private static final long FADE_OUT_DURATION_MS = 100; 117acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes private static final long FADE_IN_DURATION_MS = 200; 118acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 119bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mHasEmbeddedTabs; 120bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 121bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private int mCurWindowVisibility = View.VISIBLE; 122bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 12349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mContentAnimations = true; 124bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mHiddenByApp; 125bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mHiddenBySystem; 126bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mShowingForMode; 127bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 128bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mNowShowing = true; 12949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 13055b8ae653ab9402efb19d6309155d18fbebb849eChris Banes private ViewPropertyAnimatorCompatSet mCurrentShowAnim; 131bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mShowHideAnimationEnabled; 13249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes boolean mHideOnContentScroll; 13349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 13449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final ViewPropertyAnimatorListener mHideListener = new ViewPropertyAnimatorListenerAdapter() { 13549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 13649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationEnd(View view) { 13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mContentAnimations && mContentView != null) { 13849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setTranslationY(mContentView, 0f); 13949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setTranslationY(mContainerView, 0f); 14049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 14149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContainerView.setVisibility(View.GONE); 14249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContainerView.setTransitioning(false); 14349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentShowAnim = null; 14449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes completeDeferredDestroyActionMode(); 14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mOverlayLayout != null) { 14649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.requestApplyInsets(mOverlayLayout); 14749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 14849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 14949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 150bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 15149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final ViewPropertyAnimatorListener mShowListener = new ViewPropertyAnimatorListenerAdapter() { 15249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 15349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationEnd(View view) { 15449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentShowAnim = null; 15549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContainerView.requestLayout(); 15649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 15849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 15949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final ViewPropertyAnimatorUpdateListener mUpdateListener = 16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes new ViewPropertyAnimatorUpdateListener() { 16149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationUpdate(View view) { 16349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final ViewParent parent = mContainerView.getParent(); 16449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ((View) parent).invalidate(); 16549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 16649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 167bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 168f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes public WindowDecorActionBar(Activity activity, boolean overlayMode) { 169bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActivity = activity; 17049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Window window = activity.getWindow(); 17149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes View decor = window.getDecorView(); 17249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes init(decor); 17349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!overlayMode) { 17449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContentView = decor.findViewById(android.R.id.content); 17549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 17649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 17849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public WindowDecorActionBar(Dialog dialog) { 17949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDialog = dialog; 18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes init(dialog.getWindow().getDecorView()); 18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes /** 18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Only for edit mode. 18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide 18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */ 18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public WindowDecorActionBar(View layout) { 18849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes assert layout.isInEditMode(); 18949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes init(layout); 19059ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 19159ff0428452802ab5565633e637baa12f29834e8Trevor Johns 19249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void init(View decor) { 19349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayLayout = (ActionBarOverlayLayout) decor.findViewById(R.id.decor_content_parent); 19459ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (mOverlayLayout != null) { 19549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayLayout.setActionBarVisibilityCallback(this); 19659ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 19749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar = getDecorToolbar(decor.findViewById(R.id.action_bar)); 19849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContextView = (ActionBarContextView) decor.findViewById( 19949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes R.id.action_context_bar); 20049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContainerView = (ActionBarContainer) decor.findViewById( 20149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes R.id.action_bar_container); 20249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 20349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mDecorToolbar == null || mContextView == null || mContainerView == null) { 20459ff0428452802ab5565633e637baa12f29834e8Trevor Johns throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + 20559ff0428452802ab5565633e637baa12f29834e8Trevor Johns "with a compatible window decor layout"); 20659ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 20759ff0428452802ab5565633e637baa12f29834e8Trevor Johns 20849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContext = mDecorToolbar.getContext(); 20959ff0428452802ab5565633e637baa12f29834e8Trevor Johns 21059ff0428452802ab5565633e637baa12f29834e8Trevor Johns // This was initially read from the action bar style 21149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int current = mDecorToolbar.getDisplayOptions(); 21259ff0428452802ab5565633e637baa12f29834e8Trevor Johns final boolean homeAsUp = (current & DISPLAY_HOME_AS_UP) != 0; 21359ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (homeAsUp) { 21459ff0428452802ab5565633e637baa12f29834e8Trevor Johns mDisplayHomeAsUpSet = true; 21559ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 21659ff0428452802ab5565633e637baa12f29834e8Trevor Johns 21759ff0428452802ab5565633e637baa12f29834e8Trevor Johns ActionBarPolicy abp = ActionBarPolicy.get(mContext); 21859ff0428452802ab5565633e637baa12f29834e8Trevor Johns setHomeButtonEnabled(abp.enableHomeButtonByDefault() || homeAsUp); 21959ff0428452802ab5565633e637baa12f29834e8Trevor Johns setHasEmbeddedTabs(abp.hasEmbeddedTabs()); 22049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 22149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final TypedArray a = mContext.obtainStyledAttributes(null, 22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes R.styleable.ActionBar, 22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes R.attr.actionBarStyle, 0); 22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (a.getBoolean(R.styleable.ActionBar_hideOnContentScroll, false)) { 22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setHideOnContentScrollEnabled(true); 22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int elevation = a.getDimensionPixelSize(R.styleable.ActionBar_elevation, 0); 22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (elevation != 0) { 22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setElevation(elevation); 23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 23149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes a.recycle(); 23249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private DecorToolbar getDecorToolbar(View view) { 23549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (view instanceof DecorToolbar) { 23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return (DecorToolbar) view; 23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else if (view instanceof Toolbar) { 23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return ((Toolbar) view).getWrapper(); 23949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 24049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new IllegalStateException("Can't make a decor toolbar out of " + 241a9279663ecb98b85bf95a5ba1ebc145756fc13a2Chris Banes view != null ? view.getClass().getSimpleName() : "null"); 24249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setElevation(float elevation) { 24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setElevation(mContainerView, elevation); 24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public float getElevation() { 25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return ViewCompat.getElevation(mContainerView); 25359ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 25459ff0428452802ab5565633e637baa12f29834e8Trevor Johns 25559ff0428452802ab5565633e637baa12f29834e8Trevor Johns public void onConfigurationChanged(Configuration newConfig) { 25659ff0428452802ab5565633e637baa12f29834e8Trevor Johns setHasEmbeddedTabs(ActionBarPolicy.get(mContext).hasEmbeddedTabs()); 25759ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 25859ff0428452802ab5565633e637baa12f29834e8Trevor Johns 25959ff0428452802ab5565633e637baa12f29834e8Trevor Johns private void setHasEmbeddedTabs(boolean hasEmbeddedTabs) { 26059ff0428452802ab5565633e637baa12f29834e8Trevor Johns mHasEmbeddedTabs = hasEmbeddedTabs; 26159ff0428452802ab5565633e637baa12f29834e8Trevor Johns // Switch tab layout configuration if needed 26259ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (!mHasEmbeddedTabs) { 26349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setEmbeddedTabView(null); 26459ff0428452802ab5565633e637baa12f29834e8Trevor Johns mContainerView.setTabContainer(mTabScrollView); 26559ff0428452802ab5565633e637baa12f29834e8Trevor Johns } else { 26659ff0428452802ab5565633e637baa12f29834e8Trevor Johns mContainerView.setTabContainer(null); 26749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setEmbeddedTabView(mTabScrollView); 26859ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 26959ff0428452802ab5565633e637baa12f29834e8Trevor Johns final boolean isInTabMode = getNavigationMode() == NAVIGATION_MODE_TABS; 27059ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (mTabScrollView != null) { 27159ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (isInTabMode) { 27259ff0428452802ab5565633e637baa12f29834e8Trevor Johns mTabScrollView.setVisibility(View.VISIBLE); 27349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mOverlayLayout != null) { 27449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.requestApplyInsets(mOverlayLayout); 27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 27659ff0428452802ab5565633e637baa12f29834e8Trevor Johns } else { 27759ff0428452802ab5565633e637baa12f29834e8Trevor Johns mTabScrollView.setVisibility(View.GONE); 27859ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 27959ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setCollapsible(!mHasEmbeddedTabs && isInTabMode); 28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayLayout.setHasNonEmbeddedTabs(!mHasEmbeddedTabs && isInTabMode); 28259ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 28359ff0428452802ab5565633e637baa12f29834e8Trevor Johns 28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void ensureTabsExist() { 28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mTabScrollView != null) { 28649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return; 28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ScrollingTabContainerView tabScroller = new ScrollingTabContainerView(mContext); 29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 29149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mHasEmbeddedTabs) { 29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes tabScroller.setVisibility(View.VISIBLE); 29349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setEmbeddedTabView(tabScroller); 29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 29549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (getNavigationMode() == NAVIGATION_MODE_TABS) { 29649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes tabScroller.setVisibility(View.VISIBLE); 29749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mOverlayLayout != null) { 29849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.requestApplyInsets(mOverlayLayout); 29949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 30049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 30149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes tabScroller.setVisibility(View.GONE); 30249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 30349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContainerView.setTabContainer(tabScroller); 30449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 30549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabScrollView = tabScroller; 306bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 307bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 30849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void completeDeferredDestroyActionMode() { 30949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mDeferredModeDestroyCallback != null) { 31049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDeferredModeDestroyCallback.onDestroyActionMode(mDeferredDestroyActionMode); 31149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDeferredDestroyActionMode = null; 31249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDeferredModeDestroyCallback = null; 31349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 314bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 315bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 31649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onWindowVisibilityChanged(int visibility) { 31749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurWindowVisibility = visibility; 31849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 31949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 32049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes /** 32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Enables or disables animation between show/hide states. 32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * If animation is disabled using this method, animations in progress 32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * will be finished. 32449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * 32549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @param enabled true to animate, false to not animate. 32649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */ 32749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setShowHideAnimationEnabled(boolean enabled) { 32849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mShowHideAnimationEnabled = enabled; 32949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!enabled && mCurrentShowAnim != null) { 33049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentShowAnim.cancel(); 33149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 33249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 33349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 33449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) { 33549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mMenuVisibilityListeners.add(listener); 33649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 33749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 33849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) { 33949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mMenuVisibilityListeners.remove(listener); 34049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 341bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 34249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void dispatchMenuVisibilityChanged(boolean isVisible) { 34349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (isVisible == mLastMenuVisibility) { 34449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return; 34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mLastMenuVisibility = isVisible; 34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 34849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int count = mMenuVisibilityListeners.size(); 34949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes for (int i = 0; i < count; i++) { 35049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible); 35149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 352bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 353bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 354bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 355bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setCustomView(int resId) { 35649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setCustomView(LayoutInflater.from(getThemedContext()).inflate(resId, 35749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.getViewGroup(), false)); 358bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 359bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 360bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 36149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDisplayUseLogoEnabled(boolean useLogo) { 36249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setDisplayOptions(useLogo ? DISPLAY_USE_LOGO : 0, DISPLAY_USE_LOGO); 363bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 364bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 365bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 36649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDisplayShowHomeEnabled(boolean showHome) { 36749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME); 368bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 369bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 370bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 37149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) { 37249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP); 373bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 374bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 375bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 37649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDisplayShowTitleEnabled(boolean showTitle) { 37749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE); 378bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 379bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 380bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 38149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDisplayShowCustomEnabled(boolean showCustom) { 38249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM); 38349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 38449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 38549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 38649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHomeButtonEnabled(boolean enable) { 38749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setHomeButtonEnabled(enable); 38849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 38949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 39049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 39149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setTitle(int resId) { 39249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setTitle(mContext.getString(resId)); 393bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 394bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 395bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 39649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setSubtitle(int resId) { 39749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setSubtitle(mContext.getString(resId)); 39849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 39949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 400bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setSelectedNavigationItem(int position) { 40149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes switch (mDecorToolbar.getNavigationMode()) { 402ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani case NAVIGATION_MODE_TABS: 403ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani selectTab(mTabs.get(position)); 404ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani break; 405ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani case NAVIGATION_MODE_LIST: 40649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setDropdownSelectedPosition(position); 407ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani break; 408ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani default: 409ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani throw new IllegalStateException( 41020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns "setSelectedNavigationIndex not valid for current navigation mode"); 411bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 412bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 413bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 41449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void removeAllTabs() { 41549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes cleanupTabs(); 416bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 417bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 41849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void cleanupTabs() { 41949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSelectedTab != null) { 42049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes selectTab(null); 42149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 42249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabs.clear(); 42349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mTabScrollView != null) { 42449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabScrollView.removeAllTabs(); 425bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSavedTabPosition = INVALID_POSITION; 427bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 428bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 429bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setTitle(CharSequence title) { 43049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setTitle(title); 431bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 432bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 433ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes @Override 434ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes public void setWindowTitle(CharSequence title) { 435ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes mDecorToolbar.setWindowTitle(title); 436ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes } 437ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes 438a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount @Override 439a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount public boolean requestFocus() { 440a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount final ViewGroup viewGroup = mDecorToolbar.getViewGroup(); 441a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount if (viewGroup != null && !viewGroup.hasFocus()) { 442a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount viewGroup.requestFocus(); 443a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount return true; 444a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount } 445a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount return false; 446a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount } 447a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount 448bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setSubtitle(CharSequence subtitle) { 44949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setSubtitle(subtitle); 450bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 451bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 452bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setDisplayOptions(int options) { 453bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if ((options & DISPLAY_HOME_AS_UP) != 0) { 454bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mDisplayHomeAsUpSet = true; 455bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 45649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setDisplayOptions(options); 457bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 458bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 459bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setDisplayOptions(int options, int mask) { 46049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int current = mDecorToolbar.getDisplayOptions(); 461bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if ((mask & DISPLAY_HOME_AS_UP) != 0) { 462bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mDisplayHomeAsUpSet = true; 463bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 46449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setDisplayOptions((options & mask) | (current & ~mask)); 465bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 466bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 467bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setBackgroundDrawable(Drawable d) { 468bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mContainerView.setPrimaryBackground(d); 469bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 470bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4719eed03ba03beca1add9f1382f02c23439f937e1cChris Banes public void setStackedBackgroundDrawable(Drawable d) { 4729eed03ba03beca1add9f1382f02c23439f937e1cChris Banes mContainerView.setStackedBackground(d); 4739eed03ba03beca1add9f1382f02c23439f937e1cChris Banes } 4749eed03ba03beca1add9f1382f02c23439f937e1cChris Banes 4759eed03ba03beca1add9f1382f02c23439f937e1cChris Banes public void setSplitBackgroundDrawable(Drawable d) { 476acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // no-op. We don't support split action bars 4779eed03ba03beca1add9f1382f02c23439f937e1cChris Banes } 478bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 479bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public View getCustomView() { 48049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.getCustomView(); 481bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 482bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 483bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public CharSequence getTitle() { 48449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.getTitle(); 485bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 486bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 487bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public CharSequence getSubtitle() { 48849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.getSubtitle(); 489bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 490bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 491bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public int getNavigationMode() { 49249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.getNavigationMode(); 493bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 494bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 49549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getDisplayOptions() { 49649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.getDisplayOptions(); 49749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 49849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 49949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public ActionMode startActionMode(ActionMode.Callback callback) { 50049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionMode != null) { 50149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionMode.finish(); 502bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 50349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 50449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayLayout.setHideOnContentScrollEnabled(false); 50549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContextView.killMode(); 506087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes ActionModeImpl mode = new ActionModeImpl(mContextView.getContext(), callback); 50749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mode.dispatchOnCreate()) { 508bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes // This needs to be set before invalidate() so that it calls 509bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes // onPrepareActionMode() 510bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes mActionMode = mode; 51149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mode.invalidate(); 51249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContextView.initForMode(mode); 51349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes animateToMode(true); 51449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 51549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mode; 516bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 51749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return null; 518bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 519bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 52049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void configureTab(Tab tab, int position) { 52149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final TabImpl tabi = (TabImpl) tab; 52249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final ActionBar.TabListener callback = tabi.getCallback(); 523bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 52449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (callback == null) { 52549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new IllegalStateException("Action Bar Tab must have a Callback"); 52649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 52749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 52849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes tabi.setPosition(position); 52949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabs.add(position, tabi); 53049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 53149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int count = mTabs.size(); 53249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes for (int i = position + 1; i < count; i++) { 53349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabs.get(i).setPosition(i); 53449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 535bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 536bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 537bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 538bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void addTab(Tab tab) { 539bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell addTab(tab, mTabs.isEmpty()); 540bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 541bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 542bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 54349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void addTab(Tab tab, int position) { 54449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes addTab(tab, position, mTabs.isEmpty()); 54549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 54649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 54749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 548bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void addTab(Tab tab, boolean setSelected) { 549bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell ensureTabsExist(); 550bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.addTab(tab, setSelected); 551bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell configureTab(tab, mTabs.size()); 552bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (setSelected) { 553bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell selectTab(tab); 554bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 555bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 556bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 557bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 558bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void addTab(Tab tab, int position, boolean setSelected) { 559bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell ensureTabsExist(); 560bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.addTab(tab, position, setSelected); 561bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell configureTab(tab, position); 562bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (setSelected) { 563bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell selectTab(tab); 564bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 565bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 566bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 567bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 56849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab newTab() { 56949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return new TabImpl(); 57049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 57149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 57249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 57349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void removeTab(Tab tab) { 574bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell removeTabAt(tab.getPosition()); 575bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 576bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 577bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 578bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void removeTabAt(int position) { 579bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mTabScrollView == null) { 580bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell // No tabs around to remove 581bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return; 582bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 583bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 584bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell int selectedTabPosition = mSelectedTab != null 58520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ? mSelectedTab.getPosition() : mSavedTabPosition; 586bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.removeTabAt(position); 587bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell TabImpl removedTab = mTabs.remove(position); 588bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (removedTab != null) { 589bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell removedTab.setPosition(-1); 590bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 591bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 592bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell final int newTabCount = mTabs.size(); 593bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell for (int i = position; i < newTabCount; i++) { 594bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabs.get(i).setPosition(i); 595bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 596bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 597bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (selectedTabPosition == position) { 598bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell selectTab(mTabs.isEmpty() ? null : mTabs.get(Math.max(0, position - 1))); 599bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 600bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 601bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 602bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 603bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void selectTab(Tab tab) { 604bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (getNavigationMode() != NAVIGATION_MODE_TABS) { 605bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSavedTabPosition = tab != null ? tab.getPosition() : INVALID_POSITION; 606bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return; 607bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 608bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 609f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes final FragmentTransaction trans; 610f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes if (mActivity instanceof FragmentActivity && !mDecorToolbar.getViewGroup().isInEditMode()) { 611f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes // If we're not in edit mode and our Activity is a FragmentActivity, start a tx 612f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes trans = ((FragmentActivity) mActivity).getSupportFragmentManager() 613f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes .beginTransaction().disallowAddToBackStack(); 614f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes } else { 615f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes trans = null; 616f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes } 617bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 618bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mSelectedTab == tab) { 619bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mSelectedTab != null) { 620bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSelectedTab.getCallback().onTabReselected(mSelectedTab, trans); 621bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.animateToTab(tab.getPosition()); 622bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 623bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } else { 624bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.setTabSelected(tab != null ? tab.getPosition() : Tab.INVALID_POSITION); 625bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mSelectedTab != null) { 626bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSelectedTab.getCallback().onTabUnselected(mSelectedTab, trans); 627bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 628bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSelectedTab = (TabImpl) tab; 629bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mSelectedTab != null) { 630bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSelectedTab.getCallback().onTabSelected(mSelectedTab, trans); 631bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 632bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 633bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 63449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (trans != null && !trans.isEmpty()) { 635bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell trans.commit(); 636bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 637bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 638bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 639bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 640bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public Tab getSelectedTab() { 641bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mSelectedTab; 642bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 643bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 644bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 645bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public int getHeight() { 646bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mContainerView.getHeight(); 647bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 648bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 64949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void enableContentAnimations(boolean enabled) { 65049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContentAnimations = enabled; 65149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 65249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 653bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 654bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void show() { 655bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mHiddenByApp) { 656bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mHiddenByApp = false; 657bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell updateVisibility(false); 658bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 659bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 660bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 66149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void showForActionMode() { 662d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (!mShowingForMode) { 663d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mShowingForMode = true; 66449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mOverlayLayout != null) { 66549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayLayout.setShowingForActionMode(true); 66649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 667d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes updateVisibility(false); 668d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 669d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 670d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 67149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void showForSystem() { 67249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mHiddenBySystem) { 67349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHiddenBySystem = false; 67449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes updateVisibility(true); 67549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 67649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 67749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 678bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 679bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void hide() { 680bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (!mHiddenByApp) { 681bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mHiddenByApp = true; 682bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell updateVisibility(false); 683bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 684bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 685bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 68649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void hideForActionMode() { 687d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mShowingForMode) { 688d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mShowingForMode = false; 68949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mOverlayLayout != null) { 69049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayLayout.setShowingForActionMode(false); 69149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 692d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes updateVisibility(false); 693d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 694d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 695d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 69649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void hideForSystem() { 69749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mHiddenBySystem) { 69849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHiddenBySystem = true; 69949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes updateVisibility(true); 70049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 701bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 702bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 703bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 70449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) { 70549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (hideOnContentScroll && !mOverlayLayout.isInOverlayMode()) { 70649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new IllegalStateException("Action bar must be in overlay mode " + 70749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes "(Window.FEATURE_OVERLAY_ACTION_BAR) to enable hide on content scroll"); 70849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 70949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHideOnContentScroll = hideOnContentScroll; 71049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayLayout.setHideOnContentScrollEnabled(hideOnContentScroll); 711bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 712bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 713bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 71449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isHideOnContentScrollEnabled() { 71549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mOverlayLayout.isHideOnContentScrollEnabled(); 716bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 717bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 71849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 71949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getHideOffset() { 72049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mOverlayLayout.getActionBarHideOffset(); 72149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 722d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 72349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 72449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHideOffset(int offset) { 72549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (offset != 0 && !mOverlayLayout.isInOverlayMode()) { 72649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new IllegalStateException("Action bar must be in overlay mode " + 72749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes "(Window.FEATURE_OVERLAY_ACTION_BAR) to set a non-zero hide offset"); 728d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 72949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayLayout.setActionBarHideOffset(offset); 730d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 731d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 73249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private static boolean checkShowingFlags(boolean hiddenByApp, boolean hiddenBySystem, 73349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes boolean showingForMode) { 73449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (showingForMode) { 73549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return true; 73649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else if (hiddenByApp || hiddenBySystem) { 73749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return false; 738d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } else { 73949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return true; 740d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 741d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 742d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 74349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void updateVisibility(boolean fromSystem) { 74449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Based on the current state, should we be hidden or shown? 74549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final boolean shown = checkShowingFlags(mHiddenByApp, mHiddenBySystem, 74649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mShowingForMode); 747bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 74849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (shown) { 74949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mNowShowing) { 75049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mNowShowing = true; 75149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes doShow(fromSystem); 75249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 75349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 75449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mNowShowing) { 75549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mNowShowing = false; 75649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes doHide(fromSystem); 75749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 758ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 75949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 760bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 76149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void doShow(boolean fromSystem) { 76249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mCurrentShowAnim != null) { 76349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentShowAnim.cancel(); 76449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 76549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContainerView.setVisibility(View.VISIBLE); 76649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 7678939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes if (mCurWindowVisibility == View.VISIBLE && ALLOW_SHOW_HIDE_ANIMATIONS && 7688939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes (mShowHideAnimationEnabled || fromSystem)) { 76949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // because we're about to ask its window loc 77049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setTranslationY(mContainerView, 0f); 77149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes float startingY = -mContainerView.getHeight(); 77249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (fromSystem) { 77349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int topLeft[] = {0, 0}; 77449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContainerView.getLocationInWindow(topLeft); 77549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes startingY -= topLeft[1]; 77649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 77749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setTranslationY(mContainerView, startingY); 77855b8ae653ab9402efb19d6309155d18fbebb849eChris Banes ViewPropertyAnimatorCompatSet anim = new ViewPropertyAnimatorCompatSet(); 77949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewPropertyAnimatorCompat a = ViewCompat.animate(mContainerView).translationY(0f); 78049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes a.setUpdateListener(mUpdateListener); 78149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.play(a); 78249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mContentAnimations && mContentView != null) { 78349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setTranslationY(mContentView, startingY); 78449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.play(ViewCompat.animate(mContentView).translationY(0f)); 78549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 786acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes anim.setInterpolator(sShowInterpolator); 78749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.setDuration(250); 78849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // If this is being shown from the system, add a small delay. 78949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // This is because we will also be animating in the status bar, 79049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // and these two elements can't be done in lock-step. So we give 79149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // a little time for the status bar to start its animation before 79249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // the action bar animates. (This corresponds to the corresponding 79349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // case when hiding, where the status bar has a small delay before 79449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // starting.) 79549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.setListener(mShowListener); 79649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentShowAnim = anim; 79749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.start(); 79849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 79949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setAlpha(mContainerView, 1f); 80049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setTranslationY(mContainerView, 0); 80149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mContentAnimations && mContentView != null) { 80249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setTranslationY(mContentView, 0); 80349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 80449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mShowListener.onAnimationEnd(null); 805ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 80649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mOverlayLayout != null) { 80749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.requestApplyInsets(mOverlayLayout); 808ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 80949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 810bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 81149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void doHide(boolean fromSystem) { 81249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mCurrentShowAnim != null) { 81349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentShowAnim.cancel(); 81449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 81549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8168939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes if (mCurWindowVisibility == View.VISIBLE && ALLOW_SHOW_HIDE_ANIMATIONS && 8178939e5cf918c185a6e3df259f40d988db284dbe2Chris Banes (mShowHideAnimationEnabled || fromSystem)) { 81849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setAlpha(mContainerView, 1f); 81949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContainerView.setTransitioning(true); 82055b8ae653ab9402efb19d6309155d18fbebb849eChris Banes ViewPropertyAnimatorCompatSet anim = new ViewPropertyAnimatorCompatSet(); 82149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes float endingY = -mContainerView.getHeight(); 82249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (fromSystem) { 82349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int topLeft[] = {0, 0}; 82449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContainerView.getLocationInWindow(topLeft); 82549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes endingY -= topLeft[1]; 826ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 82749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewPropertyAnimatorCompat a = ViewCompat.animate(mContainerView).translationY(endingY); 82849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes a.setUpdateListener(mUpdateListener); 82949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.play(a); 83049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mContentAnimations && mContentView != null) { 83149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.play(ViewCompat.animate(mContentView).translationY(endingY)); 83249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 833acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes anim.setInterpolator(sHideInterpolator); 83449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.setDuration(250); 83549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.setListener(mHideListener); 83649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentShowAnim = anim; 83749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.start(); 83849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 83949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHideListener.onAnimationEnd(null); 840ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 84149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 842bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 84349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isShowing() { 84449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int height = getHeight(); 84549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Take into account the case where the bar has a 0 height due to not being measured yet. 84649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mNowShowing && (height == 0 || getHideOffset() < height); 84749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 848bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 84949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void animateToMode(boolean toActionMode) { 85049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (toActionMode) { 85149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes showForActionMode(); 85249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 85349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes hideForActionMode(); 854ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 855bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 85645b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes if (shouldAnimateContextView()) { 85745b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes ViewPropertyAnimatorCompat fadeIn, fadeOut; 85845b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes if (toActionMode) { 85945b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes // We use INVISIBLE for the Toolbar to make sure that the container has a non-zero 86045b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes // height throughout. The context view is GONE initially, so will not have been laid 86145b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes // out when the animation starts. This can lead to the container collapsing to 0px 86245b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes // height for a short period. 86345b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes fadeOut = mDecorToolbar.setupAnimatorToVisibility(View.INVISIBLE, 86445b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes FADE_OUT_DURATION_MS); 86545b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes fadeIn = mContextView.setupAnimatorToVisibility(View.VISIBLE, 86645b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes FADE_IN_DURATION_MS); 86745b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes } else { 86845b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes fadeIn = mDecorToolbar.setupAnimatorToVisibility(View.VISIBLE, 86945b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes FADE_IN_DURATION_MS); 87045b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes fadeOut = mContextView.setupAnimatorToVisibility(View.GONE, 87145b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes FADE_OUT_DURATION_MS); 87245b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes } 87345b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet(); 87445b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes set.playSequentially(fadeOut, fadeIn); 87545b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes set.start(); 876acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes } else { 87745b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes if (toActionMode) { 87845b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes mDecorToolbar.setVisibility(View.INVISIBLE); 87945b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes mContextView.setVisibility(View.VISIBLE); 88045b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes } else { 88145b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes mDecorToolbar.setVisibility(View.VISIBLE); 88245b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes mContextView.setVisibility(View.GONE); 88345b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes } 88445b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes } 885c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar // mTabScrollView's visibility is not affected by action mode. 88649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 887bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 88845b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes private boolean shouldAnimateContextView() { 88945b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes // We only to animate the action mode in if the container view has already been laid out. 89045b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes // If it hasn't been laid out, it hasn't been drawn to screen yet. 89145b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes return ViewCompat.isLaidOut(mContainerView); 89245b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes } 89345b0ea2a10e79b580aabb411126d8d6b79c9da95Chris Banes 89449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Context getThemedContext() { 89549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mThemedContext == null) { 89649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes TypedValue outValue = new TypedValue(); 89749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Resources.Theme currentTheme = mContext.getTheme(); 89849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes currentTheme.resolveAttribute(R.attr.actionBarWidgetTheme, outValue, true); 89949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int targetThemeRes = outValue.resourceId; 900bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 90149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (targetThemeRes != 0) { 90249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mThemedContext = new ContextThemeWrapper(mContext, targetThemeRes); 90349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 90449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mThemedContext = mContext; 905ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 906ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 90749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mThemedContext; 90849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 909bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 91049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 91149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isTitleTruncated() { 91249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar != null && mDecorToolbar.isTitleTruncated(); 91349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 914bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 91549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 91649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHomeAsUpIndicator(Drawable indicator) { 91749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setNavigationIcon(indicator); 91849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 919bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 92049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 92149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHomeAsUpIndicator(int resId) { 92249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setNavigationIcon(resId); 92349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 924bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 92549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 92649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHomeActionContentDescription(CharSequence description) { 92749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setNavigationContentDescription(description); 92849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 929bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 93049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 93149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHomeActionContentDescription(int resId) { 93249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setNavigationContentDescription(resId); 93349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 934bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 93549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 93649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onContentScrollStarted() { 93749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mCurrentShowAnim != null) { 93849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentShowAnim.cancel(); 93949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentShowAnim = null; 940ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 941bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 942bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 94349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 94449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onContentScrollStopped() { 94549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 94620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 947e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes @Override 948e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes public boolean collapseActionView() { 949e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes if (mDecorToolbar != null && mDecorToolbar.hasExpandedActionView()) { 950e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes mDecorToolbar.collapseActionView(); 951e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes return true; 952e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes } 953e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes return false; 954e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes } 955e9f074ac4967c05b4b3a7a4a6516a38ab539fc98Chris Banes 95649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes /** 95749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide 95849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */ 95949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public class ActionModeImpl extends ActionMode implements MenuBuilder.Callback { 960087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes private final Context mActionModeContext; 961087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes private final MenuBuilder mMenu; 962087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes 963ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private ActionMode.Callback mCallback; 964ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private WeakReference<View> mCustomView; 965ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 966087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes public ActionModeImpl(Context context, ActionMode.Callback callback) { 967087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes mActionModeContext = context; 968ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCallback = callback; 969087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes mMenu = new MenuBuilder(context) 97049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 971ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mMenu.setCallback(this); 972ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 973bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 974ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 975ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public MenuInflater getMenuInflater() { 976087313b275afcc551580b1cfdd119490f9a0b7c1Chris Banes return new SupportMenuInflater(mActionModeContext); 977ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 978bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 979ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 980ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Menu getMenu() { 981ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mMenu; 982ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 983b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns 984ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 985ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void finish() { 986ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mActionMode != this) { 987ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // Not the active action mode - no-op 988ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return; 989ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 990bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 991ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // If this change in state is going to cause the action bar 992ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // to be hidden, defer the onDestroy callback until the animation 993ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // is finished and associated relayout is about to happen. This lets 994ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // apps better anticipate visibility and layout behavior. 995ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (!checkShowingFlags(mHiddenByApp, mHiddenBySystem, false)) { 996ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // With the current state but the action bar hidden, our 997ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // overall showing state is going to be false. 998ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mDeferredDestroyActionMode = this; 999ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mDeferredModeDestroyCallback = mCallback; 1000ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } else { 1001ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCallback.onDestroyActionMode(this); 1002ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1003ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCallback = null; 1004d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes animateToMode(false); 1005bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1006ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // Clear out the context mode views after the animation finishes 1007ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.closeMode(); 100849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.getViewGroup().sendAccessibilityEvent( 100949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 101049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayLayout.setHideOnContentScrollEnabled(mHideOnContentScroll); 1011bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1012ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mActionMode = null; 1013ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1014bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1015ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 1016ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void invalidate() { 1017789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes if (mActionMode != this) { 1018789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes // Not the active action mode - no-op. It's possible we are 1019789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes // currently deferring onDestroy, so the app doesn't yet know we 1020789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes // are going away and is trying to use us. That's also a no-op. 1021789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes return; 1022789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes } 1023789b52d8f8ad5c54d398fb540408c7e0110488b4Chris Banes 1024d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mMenu.stopDispatchingItemsChanged(); 1025ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani try { 1026ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCallback.onPrepareActionMode(this, mMenu); 1027ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } finally { 1028ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mMenu.startDispatchingItemsChanged(); 1029ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1030ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1031bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1032ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean dispatchOnCreate() { 1033ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mMenu.stopDispatchingItemsChanged(); 1034ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani try { 1035ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mCallback.onCreateActionMode(this, mMenu); 1036ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } finally { 1037d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mMenu.startDispatchingItemsChanged(); 1038ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1039ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1040bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1041ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 1042ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setCustomView(View view) { 1043ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.setCustomView(view); 1044ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCustomView = new WeakReference<View>(view); 1045ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1046bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1047ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 1048ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setSubtitle(CharSequence subtitle) { 1049ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.setSubtitle(subtitle); 1050ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1051bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1052ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 1053ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setTitle(CharSequence title) { 1054ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.setTitle(title); 1055ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1056bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1057ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 1058ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setTitle(int resId) { 1059ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setTitle(mContext.getResources().getString(resId)); 1060ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1061bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1062ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 1063ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setSubtitle(int resId) { 1064ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setSubtitle(mContext.getResources().getString(resId)); 1065ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1066bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1067ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 1068ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public CharSequence getTitle() { 1069ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mContextView.getTitle(); 1070ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1071bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1072ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 1073ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public CharSequence getSubtitle() { 1074ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mContextView.getSubtitle(); 1075ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1076bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1077ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 1078ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setTitleOptionalHint(boolean titleOptional) { 1079ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani super.setTitleOptionalHint(titleOptional); 1080ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.setTitleOptional(titleOptional); 1081ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1082bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1083ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 1084ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean isTitleOptional() { 1085ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mContextView.isTitleOptional(); 1086ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1087bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1088ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 1089ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public View getCustomView() { 1090ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mCustomView != null ? mCustomView.get() : null; 1091ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1092bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1093ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { 1094ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mCallback != null) { 1095ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mCallback.onActionItemClicked(this, item); 1096ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } else { 1097ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return false; 1098ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1099ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1100bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1101ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 1102ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1103bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1104ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean onSubMenuSelected(SubMenuBuilder subMenu) { 1105ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mCallback == null) { 1106ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return false; 1107ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1108bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1109ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (!subMenu.hasVisibleItems()) { 1110ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return true; 1111ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1112ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 111349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes new MenuPopupHelper(getThemedContext(), subMenu).show(); 1114ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return true; 1115ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1116ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 1117ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void onCloseSubMenu(SubMenuBuilder menu) { 1118ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1119ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 112049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onMenuModeChange(MenuBuilder menu) { 1121ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mCallback == null) { 1122ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return; 1123ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1124ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani invalidate(); 1125ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.showOverflowMenu(); 1126ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1127b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns } 1128b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns 112949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes /** 113049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide 113149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */ 113249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public class TabImpl extends ActionBar.Tab { 113349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ActionBar.TabListener mCallback; 113449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Object mTag; 113549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Drawable mIcon; 113649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private CharSequence mText; 113749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private CharSequence mContentDesc; 113849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mPosition = -1; 113949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private View mCustomView; 114049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 114149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 114249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Object getTag() { 114349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mTag; 1144ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1145ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 114649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 114749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab setTag(Object tag) { 114849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTag = tag; 114949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return this; 115049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 1151ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 115249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public ActionBar.TabListener getCallback() { 115349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mCallback; 1154ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1155bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 115649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 115749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab setTabListener(ActionBar.TabListener callback) { 115849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCallback = callback; 115949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return this; 116049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 1161ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 116249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 116349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public View getCustomView() { 116449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mCustomView; 1165ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1166bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 116749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 116849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab setCustomView(View view) { 116949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCustomView = view; 117049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mPosition >= 0) { 117149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabScrollView.updateTab(mPosition); 117249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 117349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return this; 117449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 1175bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 117649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 117749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab setCustomView(int layoutResId) { 117849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return setCustomView(LayoutInflater.from(getThemedContext()) 117949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .inflate(layoutResId, null)); 1180ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1181bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 118249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 118349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Drawable getIcon() { 118449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mIcon; 1185ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 118649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 118749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 118849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getPosition() { 118949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mPosition; 1190ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1191bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 119249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setPosition(int position) { 119349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mPosition = position; 1194ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1195bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 119649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 119749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public CharSequence getText() { 119849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mText; 119949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 1200bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 120149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 120249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab setIcon(Drawable icon) { 120349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mIcon = icon; 120449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mPosition >= 0) { 120549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabScrollView.updateTab(mPosition); 1206ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 120749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return this; 1208ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1209bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 121049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 121149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab setIcon(int resId) { 12127e4e8b664820f773bc96e37ee1d2bbf500d64e69Chris Banes return setIcon(AppCompatDrawableManager.get().getDrawable(mContext, resId)); 121349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 121449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 121549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 121649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab setText(CharSequence text) { 121749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mText = text; 121849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mPosition >= 0) { 121949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabScrollView.updateTab(mPosition); 1220a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 122149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return this; 1222a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 1223a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 122449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 122549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab setText(int resId) { 122649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return setText(mContext.getResources().getText(resId)); 1227a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 1228a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 122949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 123049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void select() { 123149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes selectTab(this); 123249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 12338123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes 123449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 123549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab setContentDescription(int resId) { 123649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return setContentDescription(mContext.getResources().getText(resId)); 1237a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 1238a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 123949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 124049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab setContentDescription(CharSequence contentDesc) { 124149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContentDesc = contentDesc; 124249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mPosition >= 0) { 124349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabScrollView.updateTab(mPosition); 1244a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 124549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return this; 1246a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 1247bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 124849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 124949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public CharSequence getContentDescription() { 125049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mContentDesc; 1251a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 125249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 125349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 125449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 125549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setCustomView(View view) { 125649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setCustomView(view); 125749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 125849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 125949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 126049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setCustomView(View view, LayoutParams layoutParams) { 126149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes view.setLayoutParams(layoutParams); 126249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setCustomView(view); 126349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 1264a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 126549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 126649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { 126749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setDropdownParams(adapter, new NavItemSelectedListener(callback)); 126849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 12698123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes 127049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 127149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getSelectedNavigationIndex() { 127249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes switch (mDecorToolbar.getNavigationMode()) { 127349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case NAVIGATION_MODE_TABS: 127449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mSelectedTab != null ? mSelectedTab.getPosition() : -1; 127549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case NAVIGATION_MODE_LIST: 127649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.getDropdownSelectedPosition(); 127749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes default: 127849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return -1; 127949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 128049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 128149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 128249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 128349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getNavigationItemCount() { 128449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes switch (mDecorToolbar.getNavigationMode()) { 128549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case NAVIGATION_MODE_TABS: 128649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mTabs.size(); 128749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case NAVIGATION_MODE_LIST: 128849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.getDropdownItemCount(); 128949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes default: 129049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return 0; 1291a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 129249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 129349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 129449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 129549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getTabCount() { 129649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mTabs.size(); 129749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 1298a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 129949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 130049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setNavigationMode(int mode) { 130149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int oldMode = mDecorToolbar.getNavigationMode(); 130249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes switch (oldMode) { 130349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case NAVIGATION_MODE_TABS: 130449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSavedTabPosition = getSelectedNavigationIndex(); 130549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes selectTab(null); 130649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabScrollView.setVisibility(View.GONE); 130749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 130849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 130949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (oldMode != mode && !mHasEmbeddedTabs) { 131049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mOverlayLayout != null) { 131149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.requestApplyInsets(mOverlayLayout); 1312a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 1313a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 131449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setNavigationMode(mode); 131549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes switch (mode) { 131649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case NAVIGATION_MODE_TABS: 131749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ensureTabsExist(); 131849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabScrollView.setVisibility(View.VISIBLE); 131949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSavedTabPosition != INVALID_POSITION) { 132049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setSelectedNavigationItem(mSavedTabPosition); 132149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSavedTabPosition = INVALID_POSITION; 132249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 132349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 132449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 132549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setCollapsible(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs); 132649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayLayout.setHasNonEmbeddedTabs(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs); 132749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 132849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 132949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 133049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Tab getTabAt(int index) { 133149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mTabs.get(index); 133249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 133349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 133449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 133549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 133649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setIcon(int resId) { 133749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setIcon(resId); 1338ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1339bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 134049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 134149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setIcon(Drawable icon) { 134249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setIcon(icon); 134349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 134449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 134549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasIcon() { 134649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.hasIcon(); 134749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 134849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 134949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 135049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setLogo(int resId) { 135149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setLogo(resId); 135249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 135349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 135449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 135549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setLogo(Drawable logo) { 135649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setLogo(logo); 135749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 135849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 135949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasLogo() { 136049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.hasLogo(); 136149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 136249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 136349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDefaultDisplayHomeAsUpEnabled(boolean enable) { 136449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mDisplayHomeAsUpSet) { 136549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setDisplayHomeAsUpEnabled(enable); 136649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 13678123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes } 13687fa6a00a4600aac591402398c23fea97721adf26Chris Banes} 1369