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