ActionBarOverlayLayout.java revision acce58688e2c3e5abd0b13e78dcf2c26710eabd0
1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/* 2bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Copyright (C) 2012 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 17da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownpackage android.support.v7.internal.widget; 18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 19bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context; 2049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.res.Configuration; 21bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.TypedArray; 2249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.graphics.Canvas; 23bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.graphics.Rect; 2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.graphics.drawable.Drawable; 2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.os.Build; 2649c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.os.Parcelable; 27fa4c72b658085b888c94688d6882e66eabc50e25Chris Banesimport android.support.v4.view.NestedScrollingParent; 28fa4c72b658085b888c94688d6882e66eabc50e25Chris Banesimport android.support.v4.view.NestedScrollingParentHelper; 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.widget.ScrollerCompat; 34ee322d85233b857047ba629a2456adc0b0392b4bChris Banesimport android.support.v7.app.AppCompatDelegate; 35d900fe072335d488f883585e3f686ef955d1ccc9Chris Banesimport android.support.v7.appcompat.R; 3608358d12169435b51d800bb7076fc4a540eafb8cChris Banesimport android.support.v7.internal.VersionUtils; 3749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.view.menu.MenuPresenter; 3849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.Toolbar; 39bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.util.AttributeSet; 4049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.util.SparseArray; 4149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Menu; 42bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View; 4349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.ViewGroup; 4449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Window; 45bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 46bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/** 4720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Special layout for the containing of an overlay action bar (and its content) to correctly handle 4820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * fitting system windows when the content has request that its layout ignore them. 4989208232f3b5d1451408d787872504a190bc7ee0Chris Banes * 5089208232f3b5d1451408d787872504a190bc7ee0Chris Banes * @hide 51bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 52fa4c72b658085b888c94688d6882e66eabc50e25Chris Banespublic class ActionBarOverlayLayout extends ViewGroup implements DecorContentParent, 53fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes NestedScrollingParent { 5449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private static final String TAG = "ActionBarOverlayLayout"; 5520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 5620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private int mActionBarHeight; 5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes //private WindowDecorActionBar mActionBar; 5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mWindowVisibility = View.VISIBLE; 5949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // The main UI elements that we handle the layout of. 6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ContentFrameLayout mContent; 6249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ActionBarContainer mActionBarTop; 6349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Some interior UI elements. 6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private DecorToolbar mDecorToolbar; 6649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Content overlay drawable - generally the action bar's shadow 6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Drawable mWindowContentOverlay; 6949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mIgnoreWindowContentOverlay; 7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mOverlayMode; 7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mHasNonEmbeddedTabs; 7349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mHideOnContentScroll; 7449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mAnimatingForFling; 7549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mHideOnContentScrollReference; 7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mLastSystemUiVisibility; 7749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mBaseContentInsets = new Rect(); 7849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mLastBaseContentInsets = new Rect(); 7949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mContentInsets = new Rect(); 8049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mBaseInnerInsets = new Rect(); 8149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mInnerInsets = new Rect(); 8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mLastInnerInsets = new Rect(); 8349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ActionBarVisibilityCallback mActionBarVisibilityCallback; 8549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final int ACTION_BAR_ANIMATE_DELAY = 600; // ms 8749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ScrollerCompat mFlingEstimator; 8949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 9049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ViewPropertyAnimatorCompat mCurrentActionBarTopAnimator; 9149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 9249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final ViewPropertyAnimatorListener mTopAnimatorListener 9349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes = new ViewPropertyAnimatorListenerAdapter() { 9449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 9549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationEnd(View view) { 9649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarTopAnimator = null; 9749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mAnimatingForFling = false; 9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 9949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 10049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 10149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationCancel(View view) { 10249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarTopAnimator = null; 10349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mAnimatingForFling = false; 10449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 10549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 10649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 10749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Runnable mRemoveActionBarHideOffset = new Runnable() { 10849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void run() { 10949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 11049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarTopAnimator = ViewCompat.animate(mActionBarTop).translationY(0) 11149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .setListener(mTopAnimatorListener); 11249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 11349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 11449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 11549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Runnable mAddActionBarHideOffset = new Runnable() { 11649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void run() { 11749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 11849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarTopAnimator = ViewCompat.animate(mActionBarTop) 11949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .translationY(-mActionBarTop.getHeight()) 12049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .setListener(mTopAnimatorListener); 12149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 12249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 12349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 12449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes static final int[] ATTRS = new int [] { 12549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes R.attr.actionBarSize, 12649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes android.R.attr.windowContentOverlay 12720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns }; 12820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 129fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes private final NestedScrollingParentHelper mParentHelper; 130fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes 13120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public ActionBarOverlayLayout(Context context) { 132fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes this(context, null); 13320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 13420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 13520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public ActionBarOverlayLayout(Context context, AttributeSet attrs) { 13620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super(context, attrs); 13720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns init(context); 138fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes 139fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes mParentHelper = new NestedScrollingParentHelper(this); 140bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 14120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 14220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private void init(Context context) { 14349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes TypedArray ta = getContext().getTheme().obtainStyledAttributes(ATTRS); 14420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionBarHeight = ta.getDimensionPixelSize(0, 0); 14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowContentOverlay = ta.getDrawable(1); 14649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setWillNotDraw(mWindowContentOverlay == null); 14720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ta.recycle(); 14849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 14949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mIgnoreWindowContentOverlay = context.getApplicationInfo().targetSdkVersion < 15049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Build.VERSION_CODES.KITKAT; 15149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 15249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mFlingEstimator = ScrollerCompat.create(context); 15349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 15449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 15549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 15649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected void onDetachedFromWindow() { 15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.onDetachedFromWindow(); 15849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 15949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 16149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setActionBarVisibilityCallback(ActionBarVisibilityCallback cb) { 16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback = cb; 16349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (getWindowToken() != null) { 16449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // This is being initialized after being added to a window; 16549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // make sure to update all state now. 16649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback.onWindowVisibilityChanged(mWindowVisibility); 16749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mLastSystemUiVisibility != 0) { 16849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int newVis = mLastSystemUiVisibility; 16949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes onWindowSystemUiVisibilityChanged(newVis); 17049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.requestApplyInsets(this); 17149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 17249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 17349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 17449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 17549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setOverlayMode(boolean overlayMode) { 17649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayMode = overlayMode; 17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 17849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes /* 17949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Drawing the window content overlay was broken before K so starting to draw it 18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * again unexpectedly will cause artifacts in some apps. They should fix it. 18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */ 18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mIgnoreWindowContentOverlay = overlayMode && 18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes getContext().getApplicationInfo().targetSdkVersion < 18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Build.VERSION_CODES.KITKAT; 185bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 18620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isInOverlayMode() { 18849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mOverlayMode; 18949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 19049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 19149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHasNonEmbeddedTabs(boolean hasNonEmbeddedTabs) { 19249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHasNonEmbeddedTabs = hasNonEmbeddedTabs; 19349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 19449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 19549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setShowingForActionMode(boolean showing) { 19649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // TODO: Add workaround for this 19749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// if (showing) { 19849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // Here's a fun hack: if the status bar is currently being hidden, 19949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // and the application has asked for stable content insets, then 20049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // we will end up with the action mode action bar being shown 20149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // without the status bar, but moved below where the status bar 20249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // would be. Not nice. Trying to have this be positioned 20349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // correctly is not easy (basically we need yet *another* content 20449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // inset from the window manager to know where to put it), so 20549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // instead we will just temporarily force the status bar to be shown. 20649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// if ((getWindowSystemUiVisibility() & (SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 20749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// | SYSTEM_UI_FLAG_LAYOUT_STABLE)) 20849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// == (SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | SYSTEM_UI_FLAG_LAYOUT_STABLE)) { 20949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// setDisabledSystemUiVisibility(SYSTEM_UI_FLAG_FULLSCREEN); 21049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// } 21149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// } else { 21249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// setDisabledSystemUiVisibility(0); 21349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// } 21449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 21549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 21649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected void onConfigurationChanged(Configuration newConfig) { 21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (Build.VERSION.SDK_INT >= 8) { 21849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.onConfigurationChanged(newConfig); 21949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes init(getContext()); 22149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.requestApplyInsets(this); 22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onWindowSystemUiVisibilityChanged(int visible) { 22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (Build.VERSION.SDK_INT >= 16) { 22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.onWindowSystemUiVisibilityChanged(visible); 22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int diff = mLastSystemUiVisibility ^ visible; 23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mLastSystemUiVisibility = visible; 23149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final boolean barVisible = (visible & SYSTEM_UI_FLAG_FULLSCREEN) == 0; 23249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final boolean stable = (visible & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; 23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarVisibilityCallback != null) { 23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // We want the bar to be visible if it is not being hidden, 23549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // or the app has not turned on a stable UI mode (meaning they 23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // are performing explicit layout around the action bar). 23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback.enableContentAnimations(!stable); 23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (barVisible || !stable) mActionBarVisibilityCallback.showForSystem(); 23949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes else mActionBarVisibilityCallback.hideForSystem(); 24049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((diff & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0) { 24249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarVisibilityCallback != null) { 24349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.requestApplyInsets(this); 24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected void onWindowVisibilityChanged(int visibility) { 25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.onWindowVisibilityChanged(visibility); 25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowVisibility = visibility; 25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarVisibilityCallback != null) { 25349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback.onWindowVisibilityChanged(visibility); 25449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 255bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 25620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 25720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean applyInsets(View view, Rect insets, boolean left, boolean top, 25820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean bottom, boolean right) { 25920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean changed = false; 26049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes LayoutParams lp = (LayoutParams)view.getLayoutParams(); 26120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (left && lp.leftMargin != insets.left) { 26220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns changed = true; 26320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns lp.leftMargin = insets.left; 26420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 26520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (top && lp.topMargin != insets.top) { 26620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns changed = true; 26720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns lp.topMargin = insets.top; 26820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 26920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (right && lp.rightMargin != insets.right) { 27020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns changed = true; 27120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns lp.rightMargin = insets.right; 27220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 27320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (bottom && lp.bottomMargin != insets.bottom) { 27420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns changed = true; 27520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns lp.bottomMargin = insets.bottom; 27620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 27720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return changed; 278bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 27920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 28026f676060f6b45921a809c696acceac9c031c85bChris Banes @Override 28126f676060f6b45921a809c696acceac9c031c85bChris Banes protected boolean fitSystemWindows(Rect insets) { 28226f676060f6b45921a809c696acceac9c031c85bChris Banes pullChildren(); 28326f676060f6b45921a809c696acceac9c031c85bChris Banes 28426f676060f6b45921a809c696acceac9c031c85bChris Banes final int vis = ViewCompat.getWindowSystemUiVisibility(this); 28526f676060f6b45921a809c696acceac9c031c85bChris Banes final boolean stable = (vis & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; 28626f676060f6b45921a809c696acceac9c031c85bChris Banes final Rect systemInsets = insets; 28726f676060f6b45921a809c696acceac9c031c85bChris Banes 288acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // The top action bar is always within the content area. 289ade8ff8ba125b7d370de9ef5033ccbe89b2a30ccChris Banes boolean changed = applyInsets(mActionBarTop, systemInsets, true, true, false, true); 29026f676060f6b45921a809c696acceac9c031c85bChris Banes 29126f676060f6b45921a809c696acceac9c031c85bChris Banes mBaseInnerInsets.set(systemInsets); 2921f4989216d62f70088cea29f9ae200a9bb3ff955Chris Banes ViewUtils.computeFitSystemWindows(this, mBaseInnerInsets, mBaseContentInsets); 29326f676060f6b45921a809c696acceac9c031c85bChris Banes if (!mLastBaseContentInsets.equals(mBaseContentInsets)) { 29426f676060f6b45921a809c696acceac9c031c85bChris Banes changed = true; 29526f676060f6b45921a809c696acceac9c031c85bChris Banes mLastBaseContentInsets.set(mBaseContentInsets); 29626f676060f6b45921a809c696acceac9c031c85bChris Banes } 29726f676060f6b45921a809c696acceac9c031c85bChris Banes 29826f676060f6b45921a809c696acceac9c031c85bChris Banes if (changed) { 29926f676060f6b45921a809c696acceac9c031c85bChris Banes requestLayout(); 30026f676060f6b45921a809c696acceac9c031c85bChris Banes } 30126f676060f6b45921a809c696acceac9c031c85bChris Banes 30226f676060f6b45921a809c696acceac9c031c85bChris Banes // We don't do any more at this point. To correctly compute the content/inner 30326f676060f6b45921a809c696acceac9c031c85bChris Banes // insets in all cases, we need to know the measured size of the various action 30426f676060f6b45921a809c696acceac9c031c85bChris Banes // bar elements. fitSystemWindows() happens before the measure pass, so we can't 30526f676060f6b45921a809c696acceac9c031c85bChris Banes // do that here. Instead we will take this up in onMeasure(). 30626f676060f6b45921a809c696acceac9c031c85bChris Banes return true; 30726f676060f6b45921a809c696acceac9c031c85bChris Banes } 30849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 30949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 31049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected LayoutParams generateDefaultLayoutParams() { 31149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 31249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 31349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 31449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 31549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public LayoutParams generateLayoutParams(AttributeSet attrs) { 31649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return new LayoutParams(getContext(), attrs); 31749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 31849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 31949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 32049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return new LayoutParams(p); 32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 32449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 32549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 32649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return p instanceof LayoutParams; 32749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 32849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 32949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 33049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 33149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 33249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 33349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int maxHeight = 0; 33449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int maxWidth = 0; 33549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int childState = 0; 33649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 33749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int topInset = 0; 33849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int bottomInset = 0; 33949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 34049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes measureChildWithMargins(mActionBarTop, widthMeasureSpec, 0, heightMeasureSpec, 0); 34149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes LayoutParams lp = (LayoutParams) mActionBarTop.getLayoutParams(); 34249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxWidth = Math.max(maxWidth, 34349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarTop.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); 34449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxHeight = Math.max(maxHeight, 34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarTop.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); 34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes childState = ViewUtils.combineMeasuredStates(childState, 34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.getMeasuredState(mActionBarTop)); 34849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 34949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int vis = ViewCompat.getWindowSystemUiVisibility(this); 35049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final boolean stable = (vis & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; 35149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 35249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (stable) { 35349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // This is the standard space needed for the action bar. For stable measurement, 35449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // we can't depend on the size currently reported by it -- this must remain constant. 35549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes topInset = mActionBarHeight; 35649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mHasNonEmbeddedTabs) { 35749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final View tabs = mActionBarTop.getTabContainer(); 35849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (tabs != null) { 35949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // If tabs are not embedded, increase space on top to account for them. 36049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes topInset += mActionBarHeight; 36149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 36249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 36349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else if (mActionBarTop.getVisibility() != GONE) { 36449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // This is the space needed on top of the window for all of the action bar 36549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // and tabs. 36649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes topInset = mActionBarTop.getMeasuredHeight(); 36749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 36849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 36949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // If the window has not requested system UI layout flags, we need to 37049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // make sure its content is not being covered by system UI... though it 37149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // will still be covered by the action bar if they have requested it to 37249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // overlay. 37349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContentInsets.set(mBaseContentInsets); 37449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mInnerInsets.set(mBaseInnerInsets); 37549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mOverlayMode && !stable) { 37649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContentInsets.top += topInset; 37749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContentInsets.bottom += bottomInset; 37849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 37949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mInnerInsets.top += topInset; 38049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mInnerInsets.bottom += bottomInset; 38149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 38249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes applyInsets(mContent, mContentInsets, true, true, true, true); 38349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 38449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mLastInnerInsets.equals(mInnerInsets)) { 38549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // If the inner insets have changed, we need to dispatch this down to 38649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // the app's fitSystemWindows(). We do this before measuring the content 38749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // view to keep the same semantics as the normal fitSystemWindows() call. 38849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mLastInnerInsets.set(mInnerInsets); 38949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 39049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContent.dispatchFitSystemWindows(mInnerInsets); 39149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 39249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 39349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes measureChildWithMargins(mContent, widthMeasureSpec, 0, heightMeasureSpec, 0); 39449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp = (LayoutParams) mContent.getLayoutParams(); 39549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxWidth = Math.max(maxWidth, 39649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContent.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); 39749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxHeight = Math.max(maxHeight, 39849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContent.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); 39949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes childState = ViewUtils.combineMeasuredStates(childState, 40049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.getMeasuredState(mContent)); 40149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 40249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Account for padding too 40349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxWidth += getPaddingLeft() + getPaddingRight(); 40449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxHeight += getPaddingTop() + getPaddingBottom(); 40549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 40649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Check against our minimum height and width 40749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); 40849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); 40949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 41049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setMeasuredDimension( 41149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.resolveSizeAndState(maxWidth, widthMeasureSpec, childState), 41249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.resolveSizeAndState(maxHeight, heightMeasureSpec, 41349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes childState << MEASURED_HEIGHT_STATE_SHIFT)); 41449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 41549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 41649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 41749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 41849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int count = getChildCount(); 41949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 42049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int parentLeft = getPaddingLeft(); 42149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int parentRight = right - left - getPaddingRight(); 42249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 42349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int parentTop = getPaddingTop(); 42449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int parentBottom = bottom - top - getPaddingBottom(); 42549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes for (int i = 0; i < count; i++) { 42749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final View child = getChildAt(i); 42849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (child.getVisibility() != GONE) { 42949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 43049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 43149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int width = child.getMeasuredWidth(); 43249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int height = child.getMeasuredHeight(); 43349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 43449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int childLeft = parentLeft + lp.leftMargin; 435acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes int childTop = parentTop + lp.topMargin; 43649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 43749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes child.layout(childLeft, childTop, childLeft + width, childTop + height); 43849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 43949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 44049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 44149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 44249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 44349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void draw(Canvas c) { 44449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.draw(c); 44549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mWindowContentOverlay != null && !mIgnoreWindowContentOverlay) { 44649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int top = mActionBarTop.getVisibility() == VISIBLE ? 44749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes (int) (mActionBarTop.getBottom() + ViewCompat.getTranslationY(mActionBarTop) + 0.5f) 44849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes : 0; 44949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowContentOverlay.setBounds(0, top, getWidth(), 45049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes top + mWindowContentOverlay.getIntrinsicHeight()); 45149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowContentOverlay.draw(c); 45249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 45349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 45449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 45549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 45649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean shouldDelayChildPressedState() { 45749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return false; 45849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 45949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 46049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 46149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean onStartNestedScroll(View child, View target, int axes) { 46249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((axes & SCROLL_AXIS_VERTICAL) == 0 || mActionBarTop.getVisibility() != VISIBLE) { 46349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return false; 46449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 46549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mHideOnContentScroll; 46649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 46749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 46849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 46949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onNestedScrollAccepted(View child, View target, int axes) { 470fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes mParentHelper.onNestedScrollAccepted(child, target, axes); 47149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHideOnContentScrollReference = getActionBarHideOffset(); 47249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 47349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarVisibilityCallback != null) { 47449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback.onContentScrollStarted(); 47549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 47649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 47749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 47849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 47949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onNestedScroll(View target, int dxConsumed, int dyConsumed, 48049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int dxUnconsumed, int dyUnconsumed) { 48149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHideOnContentScrollReference += dyConsumed; 48249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setActionBarHideOffset(mHideOnContentScrollReference); 48349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 48449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 48549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 48649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onStopNestedScroll(View target) { 48749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mHideOnContentScroll && !mAnimatingForFling) { 48849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mHideOnContentScrollReference <= mActionBarTop.getHeight()) { 48949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes postRemoveActionBarHideOffset(); 49049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 49149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes postAddActionBarHideOffset(); 49249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 49349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 49449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarVisibilityCallback != null) { 49549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback.onContentScrollStopped(); 49649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 49749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 49849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 49949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 50049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) { 50149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mHideOnContentScroll || !consumed) { 50249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return false; 50349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 50449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (shouldHideActionBarOnFling(velocityX, velocityY)) { 50549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes addActionBarHideOffset(); 50649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 50749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes removeActionBarHideOffset(); 50849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 50949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mAnimatingForFling = true; 51049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return true; 51149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 51249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 513fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes @Override 514fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { 515fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes // no-op 516fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes } 517fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes 518fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes @Override 519fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes public boolean onNestedPreFling(View target, float velocityX, float velocityY) { 520fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes return false; 521fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes } 522fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes 523fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes @Override 524fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes public int getNestedScrollAxes() { 525fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes return mParentHelper.getNestedScrollAxes(); 526fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes } 527fa4c72b658085b888c94688d6882e66eabc50e25Chris Banes 52820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns void pullChildren() { 52920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mContent == null) { 53049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContent = (ContentFrameLayout) findViewById(R.id.action_bar_activity_content); 53149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarTop = (ActionBarContainer) findViewById(R.id.action_bar_container); 53249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar = getDecorToolbar(findViewById(R.id.action_bar)); 53349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 53449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 53549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 53649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private DecorToolbar getDecorToolbar(View view) { 53749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (view instanceof DecorToolbar) { 53849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return (DecorToolbar) view; 53949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else if (view instanceof Toolbar) { 54049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return ((Toolbar) view).getWrapper(); 54149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 54249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new IllegalStateException("Can't make a decor toolbar out of " + 54349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes view.getClass().getSimpleName()); 54449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 54549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 54649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 54749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) { 54849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (hideOnContentScroll != mHideOnContentScroll) { 54949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHideOnContentScroll = hideOnContentScroll; 55049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!hideOnContentScroll) { 55149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 55249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setActionBarHideOffset(0); 55349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 55449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 55549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 55649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 55749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isHideOnContentScrollEnabled() { 55849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mHideOnContentScroll; 55949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 56049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 56149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getActionBarHideOffset() { 56249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mActionBarTop != null ? -((int) ViewCompat.getTranslationY(mActionBarTop)) : 0; 56349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 56449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 56549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setActionBarHideOffset(int offset) { 56649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 56749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int topHeight = mActionBarTop.getHeight(); 56849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes offset = Math.max(0, Math.min(offset, topHeight)); 56949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setTranslationY(mActionBarTop, -offset); 57049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 57149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 57249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void haltActionBarHideOffsetAnimations() { 57349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes removeCallbacks(mRemoveActionBarHideOffset); 57449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes removeCallbacks(mAddActionBarHideOffset); 57549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mCurrentActionBarTopAnimator != null) { 57649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarTopAnimator.cancel(); 57749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 57849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 57949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 58049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void postRemoveActionBarHideOffset() { 58149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 58249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes postDelayed(mRemoveActionBarHideOffset, ACTION_BAR_ANIMATE_DELAY); 58349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 58449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 58549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void postAddActionBarHideOffset() { 58649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 58749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes postDelayed(mAddActionBarHideOffset, ACTION_BAR_ANIMATE_DELAY); 58849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 58949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 59049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void removeActionBarHideOffset() { 59149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 59249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mRemoveActionBarHideOffset.run(); 59349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 59449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 59549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void addActionBarHideOffset() { 59649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 59749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mAddActionBarHideOffset.run(); 59849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 59949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 60049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean shouldHideActionBarOnFling(float velocityX, float velocityY) { 60149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mFlingEstimator.fling(0, 0, 0, (int) velocityY, 0, 0, Integer.MIN_VALUE, Integer.MAX_VALUE); 60249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int finalY = mFlingEstimator.getFinalY(); 60349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return finalY > mActionBarTop.getHeight(); 60449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 60549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 60649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 607f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes public void setWindowCallback(Window.Callback cb) { 60849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 60949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setWindowCallback(cb); 61049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 61149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 61249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 61349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setWindowTitle(CharSequence title) { 61449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 61549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setWindowTitle(title); 61649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 61749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 61849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 61949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public CharSequence getTitle() { 62049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 62149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.getTitle(); 62249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 62349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 62449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 62549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void initFeature(int windowFeature) { 62649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 62749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes switch (windowFeature) { 62849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case Window.FEATURE_PROGRESS: 62949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.initProgress(); 63049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 63149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case Window.FEATURE_INDETERMINATE_PROGRESS: 63249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.initIndeterminateProgress(); 63349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 634ee322d85233b857047ba629a2456adc0b0392b4bChris Banes case AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR_OVERLAY: 63549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setOverlayMode(true); 63649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 63749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 63849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 63949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 64049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 64149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setUiOptions(int uiOptions) { 64249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Split Action Bar not included. 64349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 64449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 64549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 64649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasIcon() { 64749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 64849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.hasIcon(); 64949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 65049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 65149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 65249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasLogo() { 65349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 65449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.hasLogo(); 65549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 65649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 65749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 65849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setIcon(int resId) { 65949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 66049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setIcon(resId); 66149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 66249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 66349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 66449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setIcon(Drawable d) { 66549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 66649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setIcon(d); 66749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 66849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 66949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 67049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setLogo(int resId) { 67149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 67249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setLogo(resId); 67349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 67449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 67549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 67649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean canShowOverflowMenu() { 67749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 67849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.canShowOverflowMenu(); 67949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 68049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 68149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 68249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isOverflowMenuShowing() { 68349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 68449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.isOverflowMenuShowing(); 68549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 68649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 68749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 68849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isOverflowMenuShowPending() { 68949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 69049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.isOverflowMenuShowPending(); 69149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 69249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 69349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 69449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean showOverflowMenu() { 69549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 69649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.showOverflowMenu(); 69749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 69849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 69949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 70049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hideOverflowMenu() { 70149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 70249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.hideOverflowMenu(); 70349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 70449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 70549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 70649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setMenuPrepared() { 70749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 70849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setMenuPrepared(); 70949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 71049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 71149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 71249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setMenu(Menu menu, MenuPresenter.Callback cb) { 71349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 71449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setMenu(menu, cb); 71549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 71649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 71749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 71849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void saveToolbarHierarchyState(SparseArray<Parcelable> toolbarStates) { 71949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 72049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.saveHierarchyState(toolbarStates); 72149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 72249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 72349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 72449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void restoreToolbarHierarchyState(SparseArray<Parcelable> toolbarStates) { 72549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 72649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.restoreHierarchyState(toolbarStates); 72749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 72849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 72949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 73049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void dismissPopups() { 73149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 73249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.dismissPopupMenus(); 73349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 73449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 73549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public static class LayoutParams extends MarginLayoutParams { 73649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public LayoutParams(Context c, AttributeSet attrs) { 73749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super(c, attrs); 73849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 73949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 74049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public LayoutParams(int width, int height) { 74149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super(width, height); 74249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 74349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 74449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public LayoutParams(ViewGroup.LayoutParams source) { 74549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super(source); 74649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 74749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 74849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public LayoutParams(ViewGroup.MarginLayoutParams source) { 74949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super(source); 75049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 75149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 75249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 75349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public interface ActionBarVisibilityCallback { 75449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void onWindowVisibilityChanged(int visibility); 75549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void showForSystem(); 75649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void hideForSystem(); 75749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void enableContentAnimations(boolean enable); 75849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void onContentScrollStarted(); 75949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void onContentScrollStopped(); 760bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 761bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell} 762