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
17da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownpackage android.support.v7.internal.widget;
18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
19bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context;
20bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.TypedArray;
21bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.graphics.Canvas;
22bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.graphics.drawable.Drawable;
23da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.app.ActionBar;
24da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.appcompat.R;
25d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.view.ActionMode;
26bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.util.AttributeSet;
27bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.MotionEvent;
28bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View;
29bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.ViewGroup;
30bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.widget.FrameLayout;
31bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell
32bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/**
3320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * This class acts as a container for the action bar view and action mode context views. It applies
3420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * special styles as needed to help handle animated transitions between them.
3520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns *
36bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * @hide
37bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */
38bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellpublic class ActionBarContainer extends FrameLayout {
3920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
4020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private boolean mIsTransitioning;
4120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private View mTabContainer;
4220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private ActionBarView mActionBarView;
4320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
4420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private Drawable mBackground;
4520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private Drawable mStackedBackground;
4620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private Drawable mSplitBackground;
4720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private boolean mIsSplit;
4820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    private boolean mIsStacked;
4920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
5020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public ActionBarContainer(Context context) {
5120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        this(context, null);
5220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
5320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
5420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public ActionBarContainer(Context context, AttributeSet attrs) {
5520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super(context, attrs);
5620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
5720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        setBackgroundDrawable(null);
5820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
5920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        TypedArray a = context.obtainStyledAttributes(attrs,
6020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                R.styleable.ActionBar);
6120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mBackground = a.getDrawable(R.styleable.ActionBar_background);
6220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mStackedBackground = a.getDrawable(
6320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                R.styleable.ActionBar_backgroundStacked);
6420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
6520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (getId() == R.id.split_action_bar) {
6620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mIsSplit = true;
6720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            mSplitBackground = a.getDrawable(
6820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    R.styleable.ActionBar_backgroundSplit);
69bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell        }
7020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        a.recycle();
7120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
7220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        setWillNotDraw(mIsSplit ? mSplitBackground == null :
7320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mBackground == null && mStackedBackground == null);
7420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
7520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
7620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
7720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onFinishInflate() {
7820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.onFinishInflate();
7920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mActionBarView = (ActionBarView) findViewById(R.id.action_bar);
8020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
8120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
8220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setPrimaryBackground(Drawable bg) {
83242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mBackground != null) {
84242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mBackground.setCallback(null);
85242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            unscheduleDrawable(mBackground);
86242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
8720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mBackground = bg;
88242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (bg != null) {
89242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            bg.setCallback(this);
90242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
91242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        setWillNotDraw(mIsSplit ? mSplitBackground == null :
92242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes                mBackground == null && mStackedBackground == null);
9320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        invalidate();
9420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
9520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
9620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setStackedBackground(Drawable bg) {
97242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mStackedBackground != null) {
98242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mStackedBackground.setCallback(null);
99242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            unscheduleDrawable(mStackedBackground);
100242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
10120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mStackedBackground = bg;
102242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (bg != null) {
103242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            bg.setCallback(this);
104242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
105242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        setWillNotDraw(mIsSplit ? mSplitBackground == null :
106242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes                mBackground == null && mStackedBackground == null);
10720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        invalidate();
10820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
10920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
11020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setSplitBackground(Drawable bg) {
111242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mSplitBackground != null) {
112242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mSplitBackground.setCallback(null);
113242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            unscheduleDrawable(mSplitBackground);
114242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
11520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mSplitBackground = bg;
116242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (bg != null) {
117242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            bg.setCallback(this);
118242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
119242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        setWillNotDraw(mIsSplit ? mSplitBackground == null :
120242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes                mBackground == null && mStackedBackground == null);
12120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        invalidate();
12220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
12320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
124242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    @Override
125242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    public void setVisibility(int visibility) {
126242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        super.setVisibility(visibility);
127242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        final boolean isVisible = visibility == VISIBLE;
128242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mBackground != null) mBackground.setVisible(isVisible, false);
129242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mStackedBackground != null) mStackedBackground.setVisible(isVisible, false);
130242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mSplitBackground != null) mSplitBackground.setVisible(isVisible, false);
131242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    }
132242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes
133242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    @Override
134242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    protected boolean verifyDrawable(Drawable who) {
135242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        return (who == mBackground && !mIsSplit) || (who == mStackedBackground && mIsStacked) ||
136242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes                (who == mSplitBackground && mIsSplit) || super.verifyDrawable(who);
137242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    }
138242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes
139242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    @Override
140242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    protected void drawableStateChanged() {
141242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        super.drawableStateChanged();
142242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mBackground != null && mBackground.isStateful()) {
143242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mBackground.setState(getDrawableState());
144242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
145242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mStackedBackground != null && mStackedBackground.isStateful()) {
146242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mStackedBackground.setState(getDrawableState());
147242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
148242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        if (mSplitBackground != null && mSplitBackground.isStateful()) {
149242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes            mSplitBackground.setState(getDrawableState());
150242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes        }
151242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes    }
152242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes
15320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    /**
15420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * Set the action bar into a "transitioning" state. While transitioning the bar will block focus
15520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * and touch from all of its descendants. This prevents the user from interacting with the bar
15620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * while it is animating in or out.
15720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     *
15820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     * @param isTransitioning true if the bar is currently transitioning, false otherwise.
15920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns     */
16020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setTransitioning(boolean isTransitioning) {
16120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mIsTransitioning = isTransitioning;
16220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        setDescendantFocusability(isTransitioning ? FOCUS_BLOCK_DESCENDANTS
16320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                : FOCUS_AFTER_DESCENDANTS);
16420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
16520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
16620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
16720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean onInterceptTouchEvent(MotionEvent ev) {
16820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return mIsTransitioning || super.onInterceptTouchEvent(ev);
16920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
17020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
17120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
17220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean onTouchEvent(MotionEvent ev) {
17320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.onTouchEvent(ev);
17420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
17520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        // An action bar always eats touch events.
17620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return true;
17720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
17820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
17920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    //@Override
18020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public boolean onHoverEvent(MotionEvent ev) {
18120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        //super.onHoverEvent(ev);
18220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
18320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        // An action bar always eats hover events.
18420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return true;
18520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
18620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
18720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void setTabContainer(ScrollingTabContainerView tabView) {
18820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mTabContainer != null) {
18920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            removeView(mTabContainer);
19020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
19120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        mTabContainer = tabView;
19220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (tabView != null) {
19320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            addView(tabView);
19420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final ViewGroup.LayoutParams lp = tabView.getLayoutParams();
19520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            lp.width = LayoutParams.FILL_PARENT;
19620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            lp.height = LayoutParams.WRAP_CONTENT;
19720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            tabView.setAllowCollapse(false);
19820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
19920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
20020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
20120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public View getTabContainer() {
20220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return mTabContainer;
20320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
20420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
20520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
20620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onDraw(Canvas canvas) {
20720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (getWidth() == 0 || getHeight() == 0) {
20820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return;
20920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
21020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
21120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mIsSplit) {
21220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mSplitBackground != null) {
21320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mSplitBackground.draw(canvas);
21420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
21520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        } else {
21620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mBackground != null) {
21720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mBackground.draw(canvas);
21820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
21920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mStackedBackground != null && mIsStacked) {
22020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mStackedBackground.draw(canvas);
22120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
22220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
22320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
22420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
22520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    //@Override
22620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public ActionMode startActionModeForChild(View child, ActionMode.Callback callback) {
22720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        // No starting an action mode for an action bar child! (Where would it go?)
22820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        return null;
22920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
23020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
23120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
23220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
23320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
23420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
23520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mActionBarView == null) {
23620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            return;
23720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
23820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
23920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final LayoutParams lp = (LayoutParams) mActionBarView.getLayoutParams();
24020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final int actionBarViewHeight = mActionBarView.isCollapsed() ? 0 :
24120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mActionBarView.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
24220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
24320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mTabContainer != null && mTabContainer.getVisibility() != GONE) {
24420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final int mode = MeasureSpec.getMode(heightMeasureSpec);
24520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mode == MeasureSpec.AT_MOST) {
24620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                final int maxHeight = MeasureSpec.getSize(heightMeasureSpec);
24720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                setMeasuredDimension(getMeasuredWidth(),
24820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        Math.min(actionBarViewHeight + mTabContainer.getMeasuredHeight(),
24920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                                maxHeight));
25020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
25120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
25220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
25320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
25420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    @Override
25520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    public void onLayout(boolean changed, int l, int t, int r, int b) {
25620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        super.onLayout(changed, l, t, r, b);
25720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
25820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        final boolean hasTabs = mTabContainer != null && mTabContainer.getVisibility() != GONE;
25920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
26020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mTabContainer != null && mTabContainer.getVisibility() != GONE) {
26120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final int containerHeight = getMeasuredHeight();
26220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            final int tabHeight = mTabContainer.getMeasuredHeight();
26320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
26420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if ((mActionBarView.getDisplayOptions() & ActionBar.DISPLAY_SHOW_HOME) == 0) {
26520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                // Not showing home, put tabs on top.
26620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                final int count = getChildCount();
26720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                for (int i = 0; i < count; i++) {
26820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    final View child = getChildAt(i);
26920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
27020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    if (child == mTabContainer) {
27120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        continue;
27220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    }
27320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
27420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    if (!mActionBarView.isCollapsed()) {
27520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        child.offsetTopAndBottom(tabHeight);
27620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                    }
27720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                }
27820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mTabContainer.layout(l, 0, r, tabHeight);
27920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            } else {
28020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mTabContainer.layout(l, containerHeight - tabHeight, r, containerHeight);
28120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
28220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
28320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
28420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        boolean needsInvalidate = false;
28520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (mIsSplit) {
28620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mSplitBackground != null) {
28720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
28820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                needsInvalidate = true;
28920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
29020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        } else {
29120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if (mBackground != null) {
29220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(),
29320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        mActionBarView.getRight(), mActionBarView.getBottom());
29420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                needsInvalidate = true;
29520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
29620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            if ((mIsStacked = hasTabs && mStackedBackground != null)) {
29720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(),
29820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                        mTabContainer.getRight(), mTabContainer.getBottom());
29920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns                needsInvalidate = true;
30020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            }
30120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
30220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns
30320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        if (needsInvalidate) {
30420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns            invalidate();
30520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns        }
30620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns    }
307bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell}
308