1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/* 2bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Copyright (C) 2011 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 */ 16da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownpackage android.support.v7.internal.widget; 17bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context; 19bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.Configuration; 20bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.TypedArray; 2134b5c9580dd01b4428ab2c5990add571eaab6b13Trevor Johnsimport android.os.Build; 2249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewCompat; 2349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorCompat; 2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListener; 25da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.appcompat.R; 2655b8ae653ab9402efb19d6309155d18fbebb849eChris Banesimport android.support.v7.internal.view.ViewPropertyAnimatorCompatSet; 2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.ActionMenuPresenter; 2849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.ActionMenuView; 29bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.util.AttributeSet; 3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.util.TypedValue; 3149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.ContextThemeWrapper; 32bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View; 33bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.ViewGroup; 3449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.animation.DecelerateInterpolator; 3549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.animation.Interpolator; 36bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 3779e7a9ef79920c7daa10c90339db126a4c3c592eChris Banesabstract class AbsActionBarView extends ViewGroup { 3849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private static final Interpolator sAlphaInterpolator = new DecelerateInterpolator(); 39bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private static final int FADE_DURATION = 200; 41bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); 43bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes /** Context against which to inflate popup menus. */ 4549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected final Context mPopupContext; 46bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected ActionMenuView mMenuView; 4849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected ActionMenuPresenter mActionMenuPresenter; 4949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected ViewGroup mSplitView; 5020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns protected boolean mSplitActionBar; 5120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns protected boolean mSplitWhenNarrow; 5220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns protected int mContentHeight; 5320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 5449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected ViewPropertyAnimatorCompat mVisibilityAnim; 5520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 5679e7a9ef79920c7daa10c90339db126a4c3c592eChris Banes AbsActionBarView(Context context) { 5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes this(context, null); 5820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 5920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 6079e7a9ef79920c7daa10c90339db126a4c3c592eChris Banes AbsActionBarView(Context context, AttributeSet attrs) { 6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes this(context, attrs, 0); 6220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 6320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 6479e7a9ef79920c7daa10c90339db126a4c3c592eChris Banes AbsActionBarView(Context context, AttributeSet attrs, int defStyle) { 6520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super(context, attrs, defStyle); 6649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final TypedValue tv = new TypedValue(); 6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (context.getTheme().resolveAttribute(R.attr.actionBarPopupTheme, tv, true) 6949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes && tv.resourceId != 0) { 7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mPopupContext = new ContextThemeWrapper(context, tv.resourceId); 7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mPopupContext = context; 7349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 7420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 7520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 7620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 7720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns protected void onConfigurationChanged(Configuration newConfig) { 7820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (Build.VERSION.SDK_INT >= 8) { 7920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onConfigurationChanged(newConfig); 8020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 8120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 8220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Action bar can change size on configuration changes. 8320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Reread the desired height from the theme-specified style. 8420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns TypedArray a = getContext().obtainStyledAttributes(null, R.styleable.ActionBar, 8520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns R.attr.actionBarStyle, 0); 8620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setContentHeight(a.getLayoutDimension(R.styleable.ActionBar_height, 0)); 8720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns a.recycle(); 8849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionMenuPresenter != null) { 9020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionMenuPresenter.onConfigurationChanged(newConfig); 9120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 9220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 9320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 9420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 9520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Sets whether the bar should be split right now, no questions asked. 9620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @param split true if the bar should split 9720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setSplitToolbar(boolean split) { 9920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mSplitActionBar = split; 10020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 10120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 10220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 10320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Sets whether the bar should split if we enter a narrow screen configuration. 10420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @param splitWhenNarrow true if the bar should check to split after a config change 10520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 10620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setSplitWhenNarrow(boolean splitWhenNarrow) { 10720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mSplitWhenNarrow = splitWhenNarrow; 10820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 10920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 11020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setContentHeight(int height) { 11120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mContentHeight = height; 11220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns requestLayout(); 11320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 11420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 11520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int getContentHeight() { 11620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mContentHeight; 11720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 11820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 11949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setSplitView(ViewGroup splitView) { 12020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mSplitView = splitView; 12120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 12220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 12320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 12420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @return Current visibility or if animating, the visibility being animated to. 12520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 12620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int getAnimatedVisibility() { 12749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mVisibilityAnim != null) { 12849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mVisAnimListener.mFinalVisibility; 12949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 13020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return getVisibility(); 13120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 13220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 13320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void animateToVisibility(int visibility) { 13449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mVisibilityAnim != null) { 13549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mVisibilityAnim.cancel(); 13649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (visibility == VISIBLE) { 13849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (getVisibility() != VISIBLE) { 13949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setAlpha(this, 0f); 14049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSplitView != null && mMenuView != null) { 14149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.setAlpha(mMenuView, 0f); 14249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 14349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 14449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(1f); 14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.setDuration(FADE_DURATION); 14649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.setInterpolator(sAlphaInterpolator); 1479addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes if (mSplitView != null && mMenuView != null) { 14855b8ae653ab9402efb19d6309155d18fbebb849eChris Banes ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet(); 14949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewPropertyAnimatorCompat splitAnim = ViewCompat.animate(mMenuView).alpha(1f); 15049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes splitAnim.setDuration(FADE_DURATION); 1514c2a95906254748cb9a843b061288265d6e185a9Chris Banes set.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); 1524c2a95906254748cb9a843b061288265d6e185a9Chris Banes set.play(anim).play(splitAnim); 1534c2a95906254748cb9a843b061288265d6e185a9Chris Banes set.start(); 15449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 15549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); 15649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.start(); 15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 15849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 15949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewPropertyAnimatorCompat anim = ViewCompat.animate(this).alpha(0f); 16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.setDuration(FADE_DURATION); 16149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.setInterpolator(sAlphaInterpolator); 16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSplitView != null && mMenuView != null) { 16355b8ae653ab9402efb19d6309155d18fbebb849eChris Banes ViewPropertyAnimatorCompatSet set = new ViewPropertyAnimatorCompatSet(); 16449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewPropertyAnimatorCompat splitAnim = ViewCompat.animate(mMenuView).alpha(0f); 16549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes splitAnim.setDuration(FADE_DURATION); 1664c2a95906254748cb9a843b061288265d6e185a9Chris Banes set.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); 1674c2a95906254748cb9a843b061288265d6e185a9Chris Banes set.play(anim).play(splitAnim); 1684c2a95906254748cb9a843b061288265d6e185a9Chris Banes set.start(); 16949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 17049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.setListener(mVisAnimListener.withFinalVisibility(anim, visibility)); 17149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes anim.start(); 1729addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes } 1739addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes } 17420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 17520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 17620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean showOverflowMenu() { 17720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionMenuPresenter != null) { 17820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mActionMenuPresenter.showOverflowMenu(); 17920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 18020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 18120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 18220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 18320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void postShowOverflowMenu() { 18420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns post(new Runnable() { 18520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void run() { 18620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns showOverflowMenu(); 18720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 18820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns }); 18920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 19020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 19120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean hideOverflowMenu() { 19220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionMenuPresenter != null) { 19320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mActionMenuPresenter.hideOverflowMenu(); 19420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 19520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 19620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 19720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 19820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean isOverflowMenuShowing() { 19920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionMenuPresenter != null) { 20020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mActionMenuPresenter.isOverflowMenuShowing(); 20120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 20220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return false; 20320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 20420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 20549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isOverflowMenuShowPending() { 20649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionMenuPresenter != null) { 20749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mActionMenuPresenter.isOverflowMenuShowPending(); 20849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 20949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return false; 21049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 21149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 21220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean isOverflowReserved() { 21320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mActionMenuPresenter != null && mActionMenuPresenter.isOverflowReserved(); 21420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 21520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 21649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean canShowOverflowMenu() { 21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return isOverflowReserved() && getVisibility() == VISIBLE; 21849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 21949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 22020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void dismissPopupMenus() { 22120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mActionMenuPresenter != null) { 22220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mActionMenuPresenter.dismissPopupMenus(); 22320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 22420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 22520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 22620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns protected int measureChildView(View child, int availableWidth, int childSpecHeight, 22720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int spacing) { 22820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns child.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), 22920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns childSpecHeight); 23020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 23120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns availableWidth -= child.getMeasuredWidth(); 23220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns availableWidth -= spacing; 23320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 23420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return Math.max(0, availableWidth); 23520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 23620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes static protected int next(int x, int val, boolean isRtl) { 23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return isRtl ? x - val : x + val; 23949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 24149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected int positionChild(View child, int x, int y, int contentHeight, boolean reverse) { 24220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int childWidth = child.getMeasuredWidth(); 24320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int childHeight = child.getMeasuredHeight(); 24420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int childTop = y + (contentHeight - childHeight) / 2; 24520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (reverse) { 24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes child.layout(x - childWidth, childTop, x, childTop + childHeight); 24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes child.layout(x, childTop, x + childWidth, childTop + childHeight); 25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 25120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return (reverse ? -childWidth : childWidth); 25320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 25420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes protected class VisibilityAnimListener implements ViewPropertyAnimatorListener { 25649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mCanceled = false; 25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int mFinalVisibility; 25820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 25949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public VisibilityAnimListener withFinalVisibility(ViewPropertyAnimatorCompat animation, 26049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes int visibility) { 26149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mVisibilityAnim = animation; 26249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mFinalVisibility = visibility; 26349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return this; 26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 26520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 26749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationStart(View view) { 26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setVisibility(VISIBLE); 26949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCanceled = false; 27049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 27149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 27249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 27349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationEnd(View view) { 27449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mCanceled) return; 275bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 27649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mVisibilityAnim = null; 27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setVisibility(mFinalVisibility); 27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSplitView != null && mMenuView != null) { 27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mMenuView.setVisibility(mFinalVisibility); 28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 28349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationCancel(View view) { 28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCanceled = true; 28649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 288bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell} 289