1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/*
2bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Copyright (C) 2010 The Android Open Source Project
3bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *
4bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Licensed under the Apache License, Version 2.0 (the "License");
5bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * you may not use this file except in compliance with the License.
6bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * You may obtain a copy of the License at
7bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *
8bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *      http://www.apache.org/licenses/LICENSE-2.0
9bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell *
10bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Unless required by applicable law or agreed to in writing, software
11bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * distributed under the License is distributed on an "AS IS" BASIS,
12bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * See the License for the specific language governing permissions and
14bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * limitations under the License.
15bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */
16bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
1766698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banespackage android.support.v7.widget;
18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
19bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context;
20bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.TypedArray;
21bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.graphics.drawable.Drawable;
2218fd7433f4123ed2e725601591470455c6b7578eChris Banesimport android.os.Build;
23c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo;
2447082c30c630c34829439a9eecd1cf7e8d255a86Aurimas Liutikasimport android.support.v4.view.ViewCompat;
25da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.appcompat.R;
26d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.view.ActionMode;
27bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.util.AttributeSet;
28bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.MotionEvent;
29bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View;
30bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.ViewGroup;
31bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.widget.FrameLayout;
32bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
33c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport static android.support.annotation.RestrictTo.Scope.GROUP_ID;
34c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette
35bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/**
3649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * This class acts as a container for the action bar view and action mode context views.
3749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * It applies special styles as needed to help handle animated transitions between them.
38bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * @hide
39bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */
40c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette@RestrictTo(GROUP_ID)
41bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellpublic class ActionBarContainer extends FrameLayout {
4220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private boolean mIsTransitioning;
4320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private View mTabContainer;
4449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private View mActionBarView;
45c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar    private View mContextView;
4620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
47d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes    Drawable mBackground;
48d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes    Drawable mStackedBackground;
49d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes    Drawable mSplitBackground;
50d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes    boolean mIsSplit;
51d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes    boolean mIsStacked;
5249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private int mHeight;
5320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
5420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public ActionBarContainer(Context context) {
5520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        this(context, null);
5620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
5720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
5820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public ActionBarContainer(Context context, AttributeSet attrs) {
5920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super(context, attrs);
6020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Set a transparent background so that we project appropriately.
6266698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banes        final Drawable bg = Build.VERSION.SDK_INT >= 21
63d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes                ? new ActionBarBackgroundDrawableV21(this)
64d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes                : new ActionBarBackgroundDrawable(this);
6547082c30c630c34829439a9eecd1cf7e8d255a86Aurimas Liutikas        ViewCompat.setBackground(this, bg);
6620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
6720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        TypedArray a = context.obtainStyledAttributes(attrs,
6820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                R.styleable.ActionBar);
6920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mBackground = a.getDrawable(R.styleable.ActionBar_background);
7020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mStackedBackground = a.getDrawable(
7120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                R.styleable.ActionBar_backgroundStacked);
7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mHeight = a.getDimensionPixelSize(R.styleable.ActionBar_height, -1);
7320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
7420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (getId() == R.id.split_action_bar) {
7520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mIsSplit = true;
7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mSplitBackground = a.getDrawable(R.styleable.ActionBar_backgroundSplit);
77bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
7820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        a.recycle();
7920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
8020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        setWillNotDraw(mIsSplit ? mSplitBackground == null :
8120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mBackground == null && mStackedBackground == null);
8220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
8320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
8420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
8520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onFinishInflate() {
8620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.onFinishInflate();
8749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mActionBarView = findViewById(R.id.action_bar);
88c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar        mContextView = findViewById(R.id.action_context_bar);
8920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
9020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
9120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setPrimaryBackground(Drawable bg) {
92242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mBackground != null) {
93242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mBackground.setCallback(null);
94242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            unscheduleDrawable(mBackground);
95242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
9620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mBackground = bg;
97242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (bg != null) {
98242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            bg.setCallback(this);
9918fd7433f4123ed2e725601591470455c6b7578eChris Banes            if (mActionBarView != null) {
10018fd7433f4123ed2e725601591470455c6b7578eChris Banes                mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(),
10118fd7433f4123ed2e725601591470455c6b7578eChris Banes                        mActionBarView.getRight(), mActionBarView.getBottom());
10218fd7433f4123ed2e725601591470455c6b7578eChris Banes            }
103242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
104242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        setWillNotDraw(mIsSplit ? mSplitBackground == null :
105242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes                mBackground == null && mStackedBackground == null);
10620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        invalidate();
10720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
10820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
10920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setStackedBackground(Drawable bg) {
110242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mStackedBackground != null) {
111242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mStackedBackground.setCallback(null);
112242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            unscheduleDrawable(mStackedBackground);
113242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
11420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mStackedBackground = bg;
115242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (bg != null) {
116242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            bg.setCallback(this);
11718fd7433f4123ed2e725601591470455c6b7578eChris Banes            if ((mIsStacked && mStackedBackground != null)) {
11818fd7433f4123ed2e725601591470455c6b7578eChris Banes                mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(),
11918fd7433f4123ed2e725601591470455c6b7578eChris Banes                        mTabContainer.getRight(), mTabContainer.getBottom());
12018fd7433f4123ed2e725601591470455c6b7578eChris Banes            }
121242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
122242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        setWillNotDraw(mIsSplit ? mSplitBackground == null :
123242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes                mBackground == null && mStackedBackground == null);
12420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        invalidate();
12520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
12620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
12720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setSplitBackground(Drawable bg) {
128242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mSplitBackground != null) {
129242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mSplitBackground.setCallback(null);
130242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            unscheduleDrawable(mSplitBackground);
131242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
13220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mSplitBackground = bg;
133242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (bg != null) {
134242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            bg.setCallback(this);
13518fd7433f4123ed2e725601591470455c6b7578eChris Banes            if (mIsSplit && mSplitBackground != null) {
13618fd7433f4123ed2e725601591470455c6b7578eChris Banes                mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
13718fd7433f4123ed2e725601591470455c6b7578eChris Banes            }
138242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
139242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        setWillNotDraw(mIsSplit ? mSplitBackground == null :
140242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes                mBackground == null && mStackedBackground == null);
14120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        invalidate();
14220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
14320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
144242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    @Override
145242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    public void setVisibility(int visibility) {
146242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        super.setVisibility(visibility);
147242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        final boolean isVisible = visibility == VISIBLE;
148242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mBackground != null) mBackground.setVisible(isVisible, false);
149242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mStackedBackground != null) mStackedBackground.setVisible(isVisible, false);
150242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mSplitBackground != null) mSplitBackground.setVisible(isVisible, false);
151242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    }
152242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes
153242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    @Override
154242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    protected boolean verifyDrawable(Drawable who) {
155242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        return (who == mBackground && !mIsSplit) || (who == mStackedBackground && mIsStacked) ||
156242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes                (who == mSplitBackground && mIsSplit) || super.verifyDrawable(who);
157242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    }
158242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes
159242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    @Override
160242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    protected void drawableStateChanged() {
161242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        super.drawableStateChanged();
162242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mBackground != null && mBackground.isStateful()) {
163242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mBackground.setState(getDrawableState());
164242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
165242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mStackedBackground != null && mStackedBackground.isStateful()) {
166242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mStackedBackground.setState(getDrawableState());
167242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
168242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mSplitBackground != null && mSplitBackground.isStateful()) {
169242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mSplitBackground.setState(getDrawableState());
170242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
171242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    }
172242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes
17349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void jumpDrawablesToCurrentState() {
17449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (Build.VERSION.SDK_INT >= 11) {
17549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            super.jumpDrawablesToCurrentState();
17649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mBackground != null) {
17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mBackground.jumpToCurrentState();
17849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
17949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mStackedBackground != null) {
18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mStackedBackground.jumpToCurrentState();
18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mSplitBackground != null) {
18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mSplitBackground.jumpToCurrentState();
18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
18920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Set the action bar into a "transitioning" state. While transitioning the bar will block focus
19020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * and touch from all of its descendants. This prevents the user from interacting with the bar
19120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * while it is animating in or out.
19220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
19320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param isTransitioning true if the bar is currently transitioning, false otherwise.
19420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
19520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setTransitioning(boolean isTransitioning) {
19620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mIsTransitioning = isTransitioning;
19720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        setDescendantFocusability(isTransitioning ? FOCUS_BLOCK_DESCENDANTS
19820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                : FOCUS_AFTER_DESCENDANTS);
19920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
20020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
20120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
20220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean onInterceptTouchEvent(MotionEvent ev) {
20320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return mIsTransitioning || super.onInterceptTouchEvent(ev);
20420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
20520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
20620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
20720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean onTouchEvent(MotionEvent ev) {
20820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.onTouchEvent(ev);
20920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
21020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        // An action bar always eats touch events.
21120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return true;
21220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
21320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
21420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setTabContainer(ScrollingTabContainerView tabView) {
21520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mTabContainer != null) {
21620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            removeView(mTabContainer);
21720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
21820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mTabContainer = tabView;
21920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (tabView != null) {
22020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            addView(tabView);
22120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final ViewGroup.LayoutParams lp = tabView.getLayoutParams();
22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            lp.width = LayoutParams.MATCH_PARENT;
22320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            lp.height = LayoutParams.WRAP_CONTENT;
22420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            tabView.setAllowCollapse(false);
22520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
22620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
22720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
22820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public View getTabContainer() {
22920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return mTabContainer;
23020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
23120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
232d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes    public android.view.ActionMode startActionModeForChild(View child,
233d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes            android.view.ActionMode.Callback callback) {
23420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        // No starting an action mode for an action bar child! (Where would it go?)
23520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return null;
23620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
23720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
238d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes    public android.view.ActionMode startActionModeForChild(View child,
239d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes            android.view.ActionMode.Callback callback, int type) {
240d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes        if (type != android.view.ActionMode.TYPE_PRIMARY) {
241d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes            return super.startActionModeForChild(child, callback, type);
242d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes        }
243c5cbf40d0ef5e4ba3f50adaf2af08d19fecdf55aYigit Boyar        return null;
244c5cbf40d0ef5e4ba3f50adaf2af08d19fecdf55aYigit Boyar    }
245c5cbf40d0ef5e4ba3f50adaf2af08d19fecdf55aYigit Boyar
24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private boolean isCollapsed(View view) {
24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return view == null || view.getVisibility() == GONE || view.getMeasuredHeight() == 0;
24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
250c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar    private int getMeasuredHeightWithMargins(View view) {
251c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar        final LayoutParams lp = (LayoutParams) view.getLayoutParams();
252c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar        return view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
253c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar    }
254c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar
25520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
25620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mActionBarView == null &&
25849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST && mHeight >= 0) {
25949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            heightMeasureSpec = MeasureSpec.makeMeasureSpec(
26049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    Math.min(mHeight, MeasureSpec.getSize(heightMeasureSpec)), MeasureSpec.AT_MOST);
26149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
26220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
26320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mActionBarView == null) return;
26520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
266c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar        final int mode = MeasureSpec.getMode(heightMeasureSpec);
267c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar        if (mTabContainer != null && mTabContainer.getVisibility() != GONE
268c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar                && mode != MeasureSpec.EXACTLY) {
269c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar            final int topMarginForTabs;
270c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar            if (!isCollapsed(mActionBarView)) {
271c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar                topMarginForTabs = getMeasuredHeightWithMargins(mActionBarView);
272c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar            } else if (!isCollapsed(mContextView)) {
273c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar                topMarginForTabs = getMeasuredHeightWithMargins(mContextView);
274c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar            } else {
275c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar                topMarginForTabs = 0;
27620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
277c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar            final int maxHeight = mode == MeasureSpec.AT_MOST ?
278c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar                    MeasureSpec.getSize(heightMeasureSpec) : Integer.MAX_VALUE;
279c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar            setMeasuredDimension(getMeasuredWidth(),
280c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar                    Math.min(topMarginForTabs + getMeasuredHeightWithMargins(mTabContainer),
281c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar                            maxHeight));
28220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
28320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
28420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
28520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
28620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onLayout(boolean changed, int l, int t, int r, int b) {
28720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.onLayout(changed, l, t, r, b);
28820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final View tabContainer = mTabContainer;
29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final boolean hasTabs = tabContainer != null && tabContainer.getVisibility() != GONE;
29120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (tabContainer != null && tabContainer.getVisibility() != GONE) {
29320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final int containerHeight = getMeasuredHeight();
294c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar            final LayoutParams lp = (LayoutParams) tabContainer.getLayoutParams();
29549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            final int tabHeight = tabContainer.getMeasuredHeight();
296c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar            tabContainer.layout(l, containerHeight - tabHeight - lp.bottomMargin, r,
297c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar                    containerHeight - lp.bottomMargin);
29820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
29920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
30020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        boolean needsInvalidate = false;
30120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mIsSplit) {
30220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mSplitBackground != null) {
30320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
30420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                needsInvalidate = true;
30520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
30620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        } else {
30720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mBackground != null) {
3087d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar                if (mActionBarView.getVisibility() == View.VISIBLE) {
3097d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar                    mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(),
3107d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar                            mActionBarView.getRight(), mActionBarView.getBottom());
3117d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar                } else if (mContextView != null &&
3127d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar                        mContextView.getVisibility() == View.VISIBLE) {
3137d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar                    mBackground.setBounds(mContextView.getLeft(), mContextView.getTop(),
3147d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar                            mContextView.getRight(), mContextView.getBottom());
3157d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar                } else {
3167d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar                    mBackground.setBounds(0, 0, 0, 0);
3177d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar                }
31820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                needsInvalidate = true;
31920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
32049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mIsStacked = hasTabs;
32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (hasTabs && mStackedBackground != null) {
32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mStackedBackground.setBounds(tabContainer.getLeft(), tabContainer.getTop(),
32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        tabContainer.getRight(), tabContainer.getBottom());
32420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                needsInvalidate = true;
32520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
32620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
32720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
32820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (needsInvalidate) {
32920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            invalidate();
33020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
33120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
332bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell}
333