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; 2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewCompat; 2849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorCompat; 2949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListener; 3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListenerAdapter; 3149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.widget.ScrollerCompat; 32d900fe072335d488f883585e3f686ef955d1ccc9Chris Banesimport android.support.v7.appcompat.R; 3308358d12169435b51d800bb7076fc4a540eafb8cChris Banesimport android.support.v7.internal.VersionUtils; 3449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.app.WindowCallback; 3549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.view.menu.MenuPresenter; 3649c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.Toolbar; 37bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.util.AttributeSet; 3849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.util.SparseArray; 3949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Menu; 40bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View; 4149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.ViewGroup; 4249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Window; 43bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 44bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/** 4520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Special layout for the containing of an overlay action bar (and its content) to correctly handle 4620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * fitting system windows when the content has request that its layout ignore them. 4789208232f3b5d1451408d787872504a190bc7ee0Chris Banes * 4889208232f3b5d1451408d787872504a190bc7ee0Chris Banes * @hide 49bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 5049c78900da0d43140fb602431fb93212bd7f6c70Chris Banespublic class ActionBarOverlayLayout extends ViewGroup implements DecorContentParent { 5149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private static final String TAG = "ActionBarOverlayLayout"; 5220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 5320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private int mActionBarHeight; 5449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes //private WindowDecorActionBar mActionBar; 5549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mWindowVisibility = View.VISIBLE; 5649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // The main UI elements that we handle the layout of. 5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ContentFrameLayout mContent; 5949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ActionBarContainer mActionBarBottom; 6049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ActionBarContainer mActionBarTop; 6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Some interior UI elements. 6349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private DecorToolbar mDecorToolbar; 6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Content overlay drawable - generally the action bar's shadow 6649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Drawable mWindowContentOverlay; 6749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mIgnoreWindowContentOverlay; 6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mOverlayMode; 7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mHasNonEmbeddedTabs; 7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mHideOnContentScroll; 7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mAnimatingForFling; 7349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mHideOnContentScrollReference; 7449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mLastSystemUiVisibility; 7549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mBaseContentInsets = new Rect(); 7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mLastBaseContentInsets = new Rect(); 7749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mContentInsets = new Rect(); 7849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mBaseInnerInsets = new Rect(); 7949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mInnerInsets = new Rect(); 8049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Rect mLastInnerInsets = new Rect(); 8149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ActionBarVisibilityCallback mActionBarVisibilityCallback; 8349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final int ACTION_BAR_ANIMATE_DELAY = 600; // ms 8549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ScrollerCompat mFlingEstimator; 8749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ViewPropertyAnimatorCompat mCurrentActionBarTopAnimator; 8949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ViewPropertyAnimatorCompat mCurrentActionBarBottomAnimator; 9049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 9149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final ViewPropertyAnimatorListener mTopAnimatorListener 9249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes = new ViewPropertyAnimatorListenerAdapter() { 9349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 9449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationEnd(View view) { 9549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarTopAnimator = null; 9649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mAnimatingForFling = false; 9749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 9949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 10049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationCancel(View view) { 10149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarTopAnimator = null; 10249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mAnimatingForFling = false; 10349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 10449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 10549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 10649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final ViewPropertyAnimatorListener mBottomAnimatorListener = 10749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes new ViewPropertyAnimatorListenerAdapter() { 10849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 10949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationEnd(View view) { 11049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarBottomAnimator = null; 11149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mAnimatingForFling = false; 11249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 11349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 11449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 11549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationCancel(View view) { 11649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarBottomAnimator = null; 11749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mAnimatingForFling = false; 11849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 11949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 12049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 12149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Runnable mRemoveActionBarHideOffset = new Runnable() { 12249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void run() { 12349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 12449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarTopAnimator = ViewCompat.animate(mActionBarTop).translationY(0) 12549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .setListener(mTopAnimatorListener); 12649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarBottom != null && mActionBarBottom.getVisibility() != GONE) { 12749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarBottomAnimator = ViewCompat.animate(mActionBarBottom).translationY(0) 12849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .setListener(mBottomAnimatorListener); 12949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 13049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 13149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 13249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 13349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final Runnable mAddActionBarHideOffset = new Runnable() { 13449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void run() { 13549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 13649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarTopAnimator = ViewCompat.animate(mActionBarTop) 13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .translationY(-mActionBarTop.getHeight()) 13849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .setListener(mTopAnimatorListener); 13949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarBottom != null && mActionBarBottom.getVisibility() != GONE) { 14049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarBottomAnimator = ViewCompat.animate(mActionBarBottom) 14149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .translationY(mActionBarBottom.getHeight()) 14249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .setListener(mBottomAnimatorListener); 14349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 14449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 14649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 14749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// public static final Property<ActionBarOverlayLayout, Integer> ACTION_BAR_HIDE_OFFSET = 14849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// new IntProperty<ActionBarOverlayLayout>("actionBarHideOffset") { 14949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// 15049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// @Override 15149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// public void setValue(ActionBarOverlayLayout object, int value) { 15249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// object.setActionBarHideOffset(value); 15349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// } 15449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// 15549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// @Override 15649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// public Integer get(ActionBarOverlayLayout object) { 15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// return object.getActionBarHideOffset(); 15849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// } 15949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// }; 16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 16149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes static final int[] ATTRS = new int [] { 16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes R.attr.actionBarSize, 16349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes android.R.attr.windowContentOverlay 16420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns }; 16520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 16620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public ActionBarOverlayLayout(Context context) { 16720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super(context); 16820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns init(context); 16920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 17020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 17120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public ActionBarOverlayLayout(Context context, AttributeSet attrs) { 17220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super(context, attrs); 17320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns init(context); 174bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 17520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 17620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private void init(Context context) { 17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes TypedArray ta = getContext().getTheme().obtainStyledAttributes(ATTRS); 17820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionBarHeight = ta.getDimensionPixelSize(0, 0); 17949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowContentOverlay = ta.getDrawable(1); 18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setWillNotDraw(mWindowContentOverlay == null); 18120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ta.recycle(); 18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mIgnoreWindowContentOverlay = context.getApplicationInfo().targetSdkVersion < 18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Build.VERSION_CODES.KITKAT; 18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mFlingEstimator = ScrollerCompat.create(context); 18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 18849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 18949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 19049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected void onDetachedFromWindow() { 19149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.onDetachedFromWindow(); 19249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 19349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 19449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 19549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setActionBarVisibilityCallback(ActionBarVisibilityCallback cb) { 19649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback = cb; 19749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (getWindowToken() != null) { 19849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // This is being initialized after being added to a window; 19949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // make sure to update all state now. 20049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback.onWindowVisibilityChanged(mWindowVisibility); 20149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mLastSystemUiVisibility != 0) { 20249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int newVis = mLastSystemUiVisibility; 20349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes onWindowSystemUiVisibilityChanged(newVis); 20449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.requestApplyInsets(this); 20549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 20649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 20749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 20849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 20949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setOverlayMode(boolean overlayMode) { 21049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mOverlayMode = overlayMode; 21149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 21249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes /* 21349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Drawing the window content overlay was broken before K so starting to draw it 21449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * again unexpectedly will cause artifacts in some apps. They should fix it. 21549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */ 21649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mIgnoreWindowContentOverlay = overlayMode && 21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes getContext().getApplicationInfo().targetSdkVersion < 21849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Build.VERSION_CODES.KITKAT; 219bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 22020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 22149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isInOverlayMode() { 22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mOverlayMode; 22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHasNonEmbeddedTabs(boolean hasNonEmbeddedTabs) { 22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHasNonEmbeddedTabs = hasNonEmbeddedTabs; 22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setShowingForActionMode(boolean showing) { 23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // TODO: Add workaround for this 23149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// if (showing) { 23249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // Here's a fun hack: if the status bar is currently being hidden, 23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // and the application has asked for stable content insets, then 23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // we will end up with the action mode action bar being shown 23549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // without the status bar, but moved below where the status bar 23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // would be. Not nice. Trying to have this be positioned 23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // correctly is not easy (basically we need yet *another* content 23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // inset from the window manager to know where to put it), so 23949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// // instead we will just temporarily force the status bar to be shown. 24049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// if ((getWindowSystemUiVisibility() & (SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 24149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// | SYSTEM_UI_FLAG_LAYOUT_STABLE)) 24249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// == (SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | SYSTEM_UI_FLAG_LAYOUT_STABLE)) { 24349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// setDisabledSystemUiVisibility(SYSTEM_UI_FLAG_FULLSCREEN); 24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// } 24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// } else { 24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// setDisabledSystemUiVisibility(0); 24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes// } 24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected void onConfigurationChanged(Configuration newConfig) { 25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (Build.VERSION.SDK_INT >= 8) { 25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.onConfigurationChanged(newConfig); 25349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 25449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes init(getContext()); 25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.requestApplyInsets(this); 25649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 25849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onWindowSystemUiVisibilityChanged(int visible) { 25949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (Build.VERSION.SDK_INT >= 16) { 26049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.onWindowSystemUiVisibilityChanged(visible); 26149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 26249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 26349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int diff = mLastSystemUiVisibility ^ visible; 26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mLastSystemUiVisibility = visible; 26549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final boolean barVisible = (visible & SYSTEM_UI_FLAG_FULLSCREEN) == 0; 26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final boolean stable = (visible & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; 26749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarVisibilityCallback != null) { 26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // We want the bar to be visible if it is not being hidden, 26949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // or the app has not turned on a stable UI mode (meaning they 27049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // are performing explicit layout around the action bar). 27149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback.enableContentAnimations(!stable); 27249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (barVisible || !stable) mActionBarVisibilityCallback.showForSystem(); 27349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes else mActionBarVisibilityCallback.hideForSystem(); 27449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((diff & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0) { 27649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarVisibilityCallback != null) { 27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.requestApplyInsets(this); 27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 28249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 28349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected void onWindowVisibilityChanged(int visibility) { 28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.onWindowVisibilityChanged(visibility); 28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowVisibility = visibility; 28649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarVisibilityCallback != null) { 28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback.onWindowVisibilityChanged(visibility); 28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 289bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 29020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 29120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean applyInsets(View view, Rect insets, boolean left, boolean top, 29220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean bottom, boolean right) { 29320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean changed = false; 29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes LayoutParams lp = (LayoutParams)view.getLayoutParams(); 29520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (left && lp.leftMargin != insets.left) { 29620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns changed = true; 29720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns lp.leftMargin = insets.left; 29820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 29920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (top && lp.topMargin != insets.top) { 30020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns changed = true; 30120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns lp.topMargin = insets.top; 30220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 30320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (right && lp.rightMargin != insets.right) { 30420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns changed = true; 30520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns lp.rightMargin = insets.right; 30620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 30720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (bottom && lp.bottomMargin != insets.bottom) { 30820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns changed = true; 30920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns lp.bottomMargin = insets.bottom; 31020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 31120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return changed; 312bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 31320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 31426f676060f6b45921a809c696acceac9c031c85bChris Banes @Override 31526f676060f6b45921a809c696acceac9c031c85bChris Banes protected boolean fitSystemWindows(Rect insets) { 31626f676060f6b45921a809c696acceac9c031c85bChris Banes pullChildren(); 31726f676060f6b45921a809c696acceac9c031c85bChris Banes 31826f676060f6b45921a809c696acceac9c031c85bChris Banes final int vis = ViewCompat.getWindowSystemUiVisibility(this); 31926f676060f6b45921a809c696acceac9c031c85bChris Banes final boolean stable = (vis & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; 32026f676060f6b45921a809c696acceac9c031c85bChris Banes final Rect systemInsets = insets; 32126f676060f6b45921a809c696acceac9c031c85bChris Banes 32226f676060f6b45921a809c696acceac9c031c85bChris Banes // The top and bottom action bars are always within the content area. 32326f676060f6b45921a809c696acceac9c031c85bChris Banes boolean changed = applyInsets(mActionBarTop, systemInsets, true, true, false, true); 32426f676060f6b45921a809c696acceac9c031c85bChris Banes if (mActionBarBottom != null) { 32526f676060f6b45921a809c696acceac9c031c85bChris Banes changed |= applyInsets(mActionBarBottom, systemInsets, true, false, true, true); 32626f676060f6b45921a809c696acceac9c031c85bChris Banes } 32726f676060f6b45921a809c696acceac9c031c85bChris Banes 32826f676060f6b45921a809c696acceac9c031c85bChris Banes mBaseInnerInsets.set(systemInsets); 3291f4989216d62f70088cea29f9ae200a9bb3ff955Chris Banes ViewUtils.computeFitSystemWindows(this, mBaseInnerInsets, mBaseContentInsets); 33026f676060f6b45921a809c696acceac9c031c85bChris Banes if (!mLastBaseContentInsets.equals(mBaseContentInsets)) { 33126f676060f6b45921a809c696acceac9c031c85bChris Banes changed = true; 33226f676060f6b45921a809c696acceac9c031c85bChris Banes mLastBaseContentInsets.set(mBaseContentInsets); 33326f676060f6b45921a809c696acceac9c031c85bChris Banes } 33426f676060f6b45921a809c696acceac9c031c85bChris Banes 33526f676060f6b45921a809c696acceac9c031c85bChris Banes if (changed) { 33626f676060f6b45921a809c696acceac9c031c85bChris Banes requestLayout(); 33726f676060f6b45921a809c696acceac9c031c85bChris Banes } 33826f676060f6b45921a809c696acceac9c031c85bChris Banes 33926f676060f6b45921a809c696acceac9c031c85bChris Banes // We don't do any more at this point. To correctly compute the content/inner 34026f676060f6b45921a809c696acceac9c031c85bChris Banes // insets in all cases, we need to know the measured size of the various action 34126f676060f6b45921a809c696acceac9c031c85bChris Banes // bar elements. fitSystemWindows() happens before the measure pass, so we can't 34226f676060f6b45921a809c696acceac9c031c85bChris Banes // do that here. Instead we will take this up in onMeasure(). 34326f676060f6b45921a809c696acceac9c031c85bChris Banes return true; 34426f676060f6b45921a809c696acceac9c031c85bChris Banes } 34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected LayoutParams generateDefaultLayoutParams() { 34849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 34949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 35049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 35149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 35249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public LayoutParams generateLayoutParams(AttributeSet attrs) { 35349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return new LayoutParams(getContext(), attrs); 35449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 35549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 35649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 35749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 35849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return new LayoutParams(p); 35949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 36049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 36149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 36249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 36349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return p instanceof LayoutParams; 36449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 36549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 36649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 36749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 36849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 36949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 37049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int maxHeight = 0; 37149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int maxWidth = 0; 37249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int childState = 0; 37349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 37449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int topInset = 0; 37549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int bottomInset = 0; 37649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 37749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes measureChildWithMargins(mActionBarTop, widthMeasureSpec, 0, heightMeasureSpec, 0); 37849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes LayoutParams lp = (LayoutParams) mActionBarTop.getLayoutParams(); 37949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxWidth = Math.max(maxWidth, 38049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarTop.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); 38149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxHeight = Math.max(maxHeight, 38249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarTop.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); 38349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes childState = ViewUtils.combineMeasuredStates(childState, 38449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.getMeasuredState(mActionBarTop)); 38549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 38649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // xlarge screen layout doesn't have bottom action bar. 38749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarBottom != null) { 38849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes measureChildWithMargins(mActionBarBottom, widthMeasureSpec, 0, heightMeasureSpec, 0); 38949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp = (LayoutParams) mActionBarBottom.getLayoutParams(); 39049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxWidth = Math.max(maxWidth, 39149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarBottom.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); 39249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxHeight = Math.max(maxHeight, 39349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarBottom.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); 39449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes childState = ViewUtils.combineMeasuredStates(childState, 39549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.getMeasuredState(mActionBarBottom)); 39649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 39749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 39849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int vis = ViewCompat.getWindowSystemUiVisibility(this); 39949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final boolean stable = (vis & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0; 40049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 40149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (stable) { 40249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // This is the standard space needed for the action bar. For stable measurement, 40349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // we can't depend on the size currently reported by it -- this must remain constant. 40449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes topInset = mActionBarHeight; 40549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mHasNonEmbeddedTabs) { 40649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final View tabs = mActionBarTop.getTabContainer(); 40749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (tabs != null) { 40849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // If tabs are not embedded, increase space on top to account for them. 40949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes topInset += mActionBarHeight; 41049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 41149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 41249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else if (mActionBarTop.getVisibility() != GONE) { 41349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // This is the space needed on top of the window for all of the action bar 41449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // and tabs. 41549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes topInset = mActionBarTop.getMeasuredHeight(); 41649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 41749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 41849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mDecorToolbar.isSplit()) { 41949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // If action bar is split, adjust bottom insets for it. 42049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarBottom != null) { 42149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (stable) { 42249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes bottomInset = mActionBarHeight; 42349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 42449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes bottomInset = mActionBarBottom.getMeasuredHeight(); 42549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 42749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 42849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 42949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // If the window has not requested system UI layout flags, we need to 43049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // make sure its content is not being covered by system UI... though it 43149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // will still be covered by the action bar if they have requested it to 43249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // overlay. 43349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContentInsets.set(mBaseContentInsets); 43449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mInnerInsets.set(mBaseInnerInsets); 43549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mOverlayMode && !stable) { 43649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContentInsets.top += topInset; 43749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContentInsets.bottom += bottomInset; 43849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 43949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mInnerInsets.top += topInset; 44049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mInnerInsets.bottom += bottomInset; 44149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 44249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes applyInsets(mContent, mContentInsets, true, true, true, true); 44349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 44449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mLastInnerInsets.equals(mInnerInsets)) { 44549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // If the inner insets have changed, we need to dispatch this down to 44649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // the app's fitSystemWindows(). We do this before measuring the content 44749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // view to keep the same semantics as the normal fitSystemWindows() call. 44849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mLastInnerInsets.set(mInnerInsets); 44949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 45049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContent.dispatchFitSystemWindows(mInnerInsets); 45149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 45249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 45349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes measureChildWithMargins(mContent, widthMeasureSpec, 0, heightMeasureSpec, 0); 45449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp = (LayoutParams) mContent.getLayoutParams(); 45549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxWidth = Math.max(maxWidth, 45649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContent.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); 45749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxHeight = Math.max(maxHeight, 45849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContent.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); 45949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes childState = ViewUtils.combineMeasuredStates(childState, 46049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.getMeasuredState(mContent)); 46149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 46249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Account for padding too 46349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxWidth += getPaddingLeft() + getPaddingRight(); 46449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxHeight += getPaddingTop() + getPaddingBottom(); 46549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 46649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Check against our minimum height and width 46749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); 46849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); 46949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 47049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setMeasuredDimension( 47149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.resolveSizeAndState(maxWidth, widthMeasureSpec, childState), 47249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.resolveSizeAndState(maxHeight, heightMeasureSpec, 47349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes childState << MEASURED_HEIGHT_STATE_SHIFT)); 47449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 47549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 47649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 47749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 47849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int count = getChildCount(); 47949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 48049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int parentLeft = getPaddingLeft(); 48149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int parentRight = right - left - getPaddingRight(); 48249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 48349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int parentTop = getPaddingTop(); 48449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int parentBottom = bottom - top - getPaddingBottom(); 48549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 48649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes for (int i = 0; i < count; i++) { 48749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final View child = getChildAt(i); 48849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (child.getVisibility() != GONE) { 48949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 49049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 49149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int width = child.getMeasuredWidth(); 49249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int height = child.getMeasuredHeight(); 49349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 49449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int childLeft = parentLeft + lp.leftMargin; 49549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int childTop; 49649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (child == mActionBarBottom) { 49749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes childTop = parentBottom - height - lp.bottomMargin; 49849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 49949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes childTop = parentTop + lp.topMargin; 50049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 50149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 50249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes child.layout(childLeft, childTop, childLeft + width, childTop + height); 50349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 50449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 50549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 50649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 50749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 50849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void draw(Canvas c) { 50949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.draw(c); 51049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mWindowContentOverlay != null && !mIgnoreWindowContentOverlay) { 51149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int top = mActionBarTop.getVisibility() == VISIBLE ? 51249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes (int) (mActionBarTop.getBottom() + ViewCompat.getTranslationY(mActionBarTop) + 0.5f) 51349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes : 0; 51449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowContentOverlay.setBounds(0, top, getWidth(), 51549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes top + mWindowContentOverlay.getIntrinsicHeight()); 51649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowContentOverlay.draw(c); 51749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 51849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 51949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 52049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 52149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean shouldDelayChildPressedState() { 52249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return false; 52349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 52449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 52549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 52649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean onStartNestedScroll(View child, View target, int axes) { 52749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((axes & SCROLL_AXIS_VERTICAL) == 0 || mActionBarTop.getVisibility() != VISIBLE) { 52849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return false; 52949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 53049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mHideOnContentScroll; 53149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 53249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 53349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 53449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onNestedScrollAccepted(View child, View target, int axes) { 53549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.onNestedScrollAccepted(child, target, axes); 53649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHideOnContentScrollReference = getActionBarHideOffset(); 53749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 53849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarVisibilityCallback != null) { 53949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback.onContentScrollStarted(); 54049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 54149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 54249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 54349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 54449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onNestedScroll(View target, int dxConsumed, int dyConsumed, 54549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int dxUnconsumed, int dyUnconsumed) { 54649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHideOnContentScrollReference += dyConsumed; 54749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setActionBarHideOffset(mHideOnContentScrollReference); 54849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 54949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 55049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 55149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onStopNestedScroll(View target) { 55249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.onStopNestedScroll(target); 55349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mHideOnContentScroll && !mAnimatingForFling) { 55449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mHideOnContentScrollReference <= mActionBarTop.getHeight()) { 55549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes postRemoveActionBarHideOffset(); 55649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 55749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes postAddActionBarHideOffset(); 55849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 55949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 56049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarVisibilityCallback != null) { 56149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarVisibilityCallback.onContentScrollStopped(); 56249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 56349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 56449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 56549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 56649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) { 56749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mHideOnContentScroll || !consumed) { 56849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return false; 56949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 57049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (shouldHideActionBarOnFling(velocityX, velocityY)) { 57149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes addActionBarHideOffset(); 57249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 57349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes removeActionBarHideOffset(); 57449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 57549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mAnimatingForFling = true; 57649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return true; 57749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 57849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 57920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns void pullChildren() { 58020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mContent == null) { 58149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mContent = (ContentFrameLayout) findViewById(R.id.action_bar_activity_content); 58249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarTop = (ActionBarContainer) findViewById(R.id.action_bar_container); 58349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar = getDecorToolbar(findViewById(R.id.action_bar)); 58449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarBottom = (ActionBarContainer) findViewById(R.id.split_action_bar); 58549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 58649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 58749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 58849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private DecorToolbar getDecorToolbar(View view) { 58949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (view instanceof DecorToolbar) { 59049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return (DecorToolbar) view; 59149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else if (view instanceof Toolbar) { 59249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return ((Toolbar) view).getWrapper(); 59349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 59449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new IllegalStateException("Can't make a decor toolbar out of " + 59549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes view.getClass().getSimpleName()); 59649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 59749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 59849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 59949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) { 60049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (hideOnContentScroll != mHideOnContentScroll) { 60149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHideOnContentScroll = hideOnContentScroll; 60249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!hideOnContentScroll) { 60308358d12169435b51d800bb7076fc4a540eafb8cChris Banes if (VersionUtils.isAtLeastL()) { 60408358d12169435b51d800bb7076fc4a540eafb8cChris Banes stopNestedScroll(); 60508358d12169435b51d800bb7076fc4a540eafb8cChris Banes } 60649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 60749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setActionBarHideOffset(0); 60849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 60949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 61049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 61149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 61249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isHideOnContentScrollEnabled() { 61349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mHideOnContentScroll; 61449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 61549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 61649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getActionBarHideOffset() { 61749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mActionBarTop != null ? -((int) ViewCompat.getTranslationY(mActionBarTop)) : 0; 61849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 61949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 62049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setActionBarHideOffset(int offset) { 62149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 62249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int topHeight = mActionBarTop.getHeight(); 62349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes offset = Math.max(0, Math.min(offset, topHeight)); 62449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setTranslationY(mActionBarTop, -offset); 62549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarBottom != null && mActionBarBottom.getVisibility() != GONE) { 62649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Match the hide offset proportionally for a split bar 62749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final float fOffset = (float) offset / topHeight; 62849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int bOffset = (int) (mActionBarBottom.getHeight() * fOffset); 62949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setTranslationY(mActionBarBottom, bOffset); 63049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 63149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 63249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 63349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void haltActionBarHideOffsetAnimations() { 63449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes removeCallbacks(mRemoveActionBarHideOffset); 63549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes removeCallbacks(mAddActionBarHideOffset); 63649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mCurrentActionBarTopAnimator != null) { 63749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarTopAnimator.cancel(); 63849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 63949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mCurrentActionBarBottomAnimator != null) { 64049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCurrentActionBarBottomAnimator.cancel(); 64149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 64249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 64349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 64449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void postRemoveActionBarHideOffset() { 64549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 64649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes postDelayed(mRemoveActionBarHideOffset, ACTION_BAR_ANIMATE_DELAY); 64749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 64849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 64949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void postAddActionBarHideOffset() { 65049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 65149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes postDelayed(mAddActionBarHideOffset, ACTION_BAR_ANIMATE_DELAY); 65249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 65349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 65449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void removeActionBarHideOffset() { 65549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 65649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mRemoveActionBarHideOffset.run(); 65749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 65849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 65949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void addActionBarHideOffset() { 66049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes haltActionBarHideOffsetAnimations(); 66149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mAddActionBarHideOffset.run(); 66249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 66349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 66449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean shouldHideActionBarOnFling(float velocityX, float velocityY) { 66549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mFlingEstimator.fling(0, 0, 0, (int) velocityY, 0, 0, Integer.MIN_VALUE, Integer.MAX_VALUE); 66649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int finalY = mFlingEstimator.getFinalY(); 66749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return finalY > mActionBarTop.getHeight(); 66849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 66949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 67049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 67149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setWindowCallback(WindowCallback cb) { 67249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 67349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setWindowCallback(cb); 67449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 67549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 67649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 67749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setWindowTitle(CharSequence title) { 67849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 67949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setWindowTitle(title); 68049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 68149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 68249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 68349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public CharSequence getTitle() { 68449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 68549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.getTitle(); 68649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 68749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 68849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 68949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void initFeature(int windowFeature) { 69049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 69149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes switch (windowFeature) { 69249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case Window.FEATURE_PROGRESS: 69349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.initProgress(); 69449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 69549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case Window.FEATURE_INDETERMINATE_PROGRESS: 69649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.initIndeterminateProgress(); 69749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 69849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case Window.FEATURE_ACTION_BAR_OVERLAY: 69949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setOverlayMode(true); 70049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 70149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 70249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 70349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 70449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 70549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setUiOptions(int uiOptions) { 70649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Split Action Bar not included. 70749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 70849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 70949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 71049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasIcon() { 71149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 71249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.hasIcon(); 71349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 71449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 71549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 71649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasLogo() { 71749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 71849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.hasLogo(); 71949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 72049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 72149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 72249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setIcon(int resId) { 72349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 72449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setIcon(resId); 72549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 72649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 72749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 72849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setIcon(Drawable d) { 72949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 73049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setIcon(d); 73149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 73249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 73349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 73449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setLogo(int resId) { 73549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 73649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setLogo(resId); 73749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 73849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 73949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 74049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean canShowOverflowMenu() { 74149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 74249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.canShowOverflowMenu(); 74349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 74449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 74549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 74649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isOverflowMenuShowing() { 74749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 74849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.isOverflowMenuShowing(); 74949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 75049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 75149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 75249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isOverflowMenuShowPending() { 75349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 75449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.isOverflowMenuShowPending(); 75549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 75649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 75749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 75849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean showOverflowMenu() { 75949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 76049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.showOverflowMenu(); 76149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 76249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 76349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 76449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hideOverflowMenu() { 76549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 76649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDecorToolbar.hideOverflowMenu(); 76749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 76849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 76949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 77049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setMenuPrepared() { 77149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 77249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setMenuPrepared(); 77349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 77449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 77549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 77649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setMenu(Menu menu, MenuPresenter.Callback cb) { 77749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 77849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.setMenu(menu, cb); 77949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 78049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 78149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 78249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void saveToolbarHierarchyState(SparseArray<Parcelable> toolbarStates) { 78349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 78449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.saveHierarchyState(toolbarStates); 78549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 78649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 78749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 78849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void restoreToolbarHierarchyState(SparseArray<Parcelable> toolbarStates) { 78949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 79049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.restoreHierarchyState(toolbarStates); 79149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 79249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 79349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 79449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void dismissPopups() { 79549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes pullChildren(); 79649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorToolbar.dismissPopupMenus(); 79749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 79849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 79949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public static class LayoutParams extends MarginLayoutParams { 80049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public LayoutParams(Context c, AttributeSet attrs) { 80149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super(c, attrs); 80249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 80349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 80449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public LayoutParams(int width, int height) { 80549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super(width, height); 80649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 80749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 80849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public LayoutParams(ViewGroup.LayoutParams source) { 80949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super(source); 81049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 81149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 81249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public LayoutParams(ViewGroup.MarginLayoutParams source) { 81349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super(source); 81449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 81549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 81649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 81749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public interface ActionBarVisibilityCallback { 81849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void onWindowVisibilityChanged(int visibility); 81949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void showForSystem(); 82049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void hideForSystem(); 82149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void enableContentAnimations(boolean enable); 82249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void onContentScrollStarted(); 82349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void onContentScrollStopped(); 824bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 825bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell} 826