ActionBarContainer.java revision e2104f4b5c8e3ad63570306a25e61502dfe4c418
1f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier/*
2f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier * Copyright (C) 2010 The Android Open Source Project
3f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier *
4f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License");
5f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier * you may not use this file except in compliance with the License.
6f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier * You may obtain a copy of the License at
7f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier *
8f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier *      http://www.apache.org/licenses/LICENSE-2.0
9f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier *
10f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier * Unless required by applicable law or agreed to in writing, software
11f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS,
12f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier * See the License for the specific language governing permissions and
14f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier * limitations under the License.
15f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier */
16f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier
17f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartierpackage android.support.v7.widget;
18f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier
19f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartierimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
20f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier
21f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartierimport android.content.Context;
22f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartierimport android.content.res.TypedArray;
23f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartierimport android.graphics.drawable.Drawable;
24f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartierimport android.os.Build;
2532ce2adefb8a3d0eda59a29f5e87c1eb43eef796Mathieu Chartierimport android.support.annotation.RestrictTo;
26fbc31087932a65e036a153afab3049dc5298656aMathieu Chartierimport android.support.v4.view.ViewCompat;
2780b37b7e679a530738c9bcbd39873b6dacf177e5Mathieu Chartierimport android.support.v7.appcompat.R;
2861d2b2d353ba4ab952247d2bff2c905598118bb4Mathieu Chartierimport android.util.AttributeSet;
29f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartierimport android.view.MotionEvent;
30fbc31087932a65e036a153afab3049dc5298656aMathieu Chartierimport android.view.View;
31fbc31087932a65e036a153afab3049dc5298656aMathieu Chartierimport android.view.ViewGroup;
32f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartierimport android.widget.FrameLayout;
33fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier
34f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier/**
35a9d82fe8bc6960b565245b920e99107a824ca515Mathieu Chartier * This class acts as a container for the action bar view and action mode context views.
36f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier * It applies special styles as needed to help handle animated transitions between them.
37f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier * @hide
38f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier */
39fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier@RestrictTo(LIBRARY_GROUP)
40fbc31087932a65e036a153afab3049dc5298656aMathieu Chartierpublic class ActionBarContainer extends FrameLayout {
41fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier    private boolean mIsTransitioning;
42f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    private View mTabContainer;
43e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier    private View mActionBarView;
44f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    private View mContextView;
45f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier
46e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier    Drawable mBackground;
47f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    Drawable mStackedBackground;
48f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    Drawable mSplitBackground;
49f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    boolean mIsSplit;
50f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    boolean mIsStacked;
51f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    private int mHeight;
52f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier
53f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    public ActionBarContainer(Context context) {
54f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        this(context, null);
55e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier    }
56e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier
57e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier    public ActionBarContainer(Context context, AttributeSet attrs) {
58e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier        super(context, attrs);
59e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier
60e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier        // Set a transparent background so that we project appropriately.
61e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier        final Drawable bg = Build.VERSION.SDK_INT >= 21
62e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier                ? new ActionBarBackgroundDrawableV21(this)
63e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier                : new ActionBarBackgroundDrawable(this);
64e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier        ViewCompat.setBackground(this, bg);
65e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier
66e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier        TypedArray a = context.obtainStyledAttributes(attrs,
67e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier                R.styleable.ActionBar);
68f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        mBackground = a.getDrawable(R.styleable.ActionBar_background);
69f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        mStackedBackground = a.getDrawable(
700b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle                R.styleable.ActionBar_backgroundStacked);
710b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle        mHeight = a.getDimensionPixelSize(R.styleable.ActionBar_height, -1);
720b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle
730b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle        if (getId() == R.id.split_action_bar) {
740b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle            mIsSplit = true;
750b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle            mSplitBackground = a.getDrawable(R.styleable.ActionBar_backgroundSplit);
760b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle        }
770b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle        a.recycle();
780b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle
790b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle        setWillNotDraw(mIsSplit ? mSplitBackground == null :
800b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle                mBackground == null && mStackedBackground == null);
810b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle    }
820b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle
830b791279f67b0f4b72db991707b16b737871bcdeCalin Juravle    @Override
84f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    public void onFinishInflate() {
85f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        super.onFinishInflate();
86f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        mActionBarView = findViewById(R.id.action_bar);
87e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier        mContextView = findViewById(R.id.action_context_bar);
88e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier    }
89e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier
90e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier    public void setPrimaryBackground(Drawable bg) {
91e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier        if (mBackground != null) {
92f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            mBackground.setCallback(null);
93f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            unscheduleDrawable(mBackground);
94f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        }
95f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        mBackground = bg;
96f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        if (bg != null) {
97f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            bg.setCallback(this);
98f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            if (mActionBarView != null) {
99f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier                mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(),
100dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao                        mActionBarView.getRight(), mActionBarView.getBottom());
101dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao            }
102dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao        }
103dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao        setWillNotDraw(mIsSplit ? mSplitBackground == null :
104dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao                mBackground == null && mStackedBackground == null);
105dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao        invalidate();
106dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao    }
107dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao
108f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    public void setStackedBackground(Drawable bg) {
109f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        if (mStackedBackground != null) {
110f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            mStackedBackground.setCallback(null);
111f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            unscheduleDrawable(mStackedBackground);
112dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao        }
113dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao        mStackedBackground = bg;
114f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        if (bg != null) {
115dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao            bg.setCallback(this);
116dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao            if ((mIsStacked && mStackedBackground != null)) {
117f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier                mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(),
118f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier                        mTabContainer.getRight(), mTabContainer.getBottom());
119f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            }
120f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        }
121f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        setWillNotDraw(mIsSplit ? mSplitBackground == null :
122f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier                mBackground == null && mStackedBackground == null);
123f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        invalidate();
124f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    }
125e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier
126e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier    public void setSplitBackground(Drawable bg) {
127e58991b3b2282b5761f1a6023a16c803e1c4eb45Mathieu Chartier        if (mSplitBackground != null) {
128f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            mSplitBackground.setCallback(null);
129f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            unscheduleDrawable(mSplitBackground);
130dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao        }
131dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao        mSplitBackground = bg;
132dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao        if (bg != null) {
133dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao            bg.setCallback(this);
134dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao            if (mIsSplit && mSplitBackground != null) {
135dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao                mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
136dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao            }
137f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        }
138f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        setWillNotDraw(mIsSplit ? mSplitBackground == null :
139f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier                mBackground == null && mStackedBackground == null);
140f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        invalidate();
141f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    }
142f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier
143f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    @Override
144f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    public void setVisibility(int visibility) {
145f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        super.setVisibility(visibility);
146f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        final boolean isVisible = visibility == VISIBLE;
14780b37b7e679a530738c9bcbd39873b6dacf177e5Mathieu Chartier        if (mBackground != null) mBackground.setVisible(isVisible, false);
148f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        if (mStackedBackground != null) mStackedBackground.setVisible(isVisible, false);
14980b37b7e679a530738c9bcbd39873b6dacf177e5Mathieu Chartier        if (mSplitBackground != null) mSplitBackground.setVisible(isVisible, false);
150f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    }
151f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier
152f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    @Override
153f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    protected boolean verifyDrawable(Drawable who) {
154f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        return (who == mBackground && !mIsSplit) || (who == mStackedBackground && mIsStacked) ||
155f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier                (who == mSplitBackground && mIsSplit) || super.verifyDrawable(who);
156f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    }
157f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier
158f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    @Override
159f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    protected void drawableStateChanged() {
160f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        super.drawableStateChanged();
161f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        if (mBackground != null && mBackground.isStateful()) {
162f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            mBackground.setState(getDrawableState());
163f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        }
164f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        if (mStackedBackground != null && mStackedBackground.isStateful()) {
165f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            mStackedBackground.setState(getDrawableState());
166f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        }
167f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        if (mSplitBackground != null && mSplitBackground.isStateful()) {
168f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            mSplitBackground.setState(getDrawableState());
169f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        }
170f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    }
171f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
172f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    @Override
173f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    public void jumpDrawablesToCurrentState() {
174f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        if (Build.VERSION.SDK_INT >= 11) {
175f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            super.jumpDrawablesToCurrentState();
176f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            if (mBackground != null) {
177f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier                mBackground.jumpToCurrentState();
178f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            }
179f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            if (mStackedBackground != null) {
180f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier                mStackedBackground.jumpToCurrentState();
181f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            }
182f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            if (mSplitBackground != null) {
183f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                mSplitBackground.jumpToCurrentState();
184f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            }
185f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        }
186f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    }
187f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier
188f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    /**
189f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier     * Set the action bar into a "transitioning" state. While transitioning the bar will block focus
190f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier     * and touch from all of its descendants. This prevents the user from interacting with the bar
191f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier     * while it is animating in or out.
192f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier     *
193f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier     * @param isTransitioning true if the bar is currently transitioning, false otherwise.
194f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao     */
195f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    public void setTransitioning(boolean isTransitioning) {
196f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        mIsTransitioning = isTransitioning;
197f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        setDescendantFocusability(isTransitioning ? FOCUS_BLOCK_DESCENDANTS
198f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier                : FOCUS_AFTER_DESCENDANTS);
199f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    }
200f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier
201f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    @Override
202f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    public boolean onInterceptTouchEvent(MotionEvent ev) {
203f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        return mIsTransitioning || super.onInterceptTouchEvent(ev);
20414d7b3e37b6129d845d6c8da8ee8d612937c63d4Mathieu Chartier    }
20514d7b3e37b6129d845d6c8da8ee8d612937c63d4Mathieu Chartier
206f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    @Override
207f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    public boolean onTouchEvent(MotionEvent ev) {
208f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        super.onTouchEvent(ev);
209f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier
210f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        // An action bar always eats touch events.
211f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        return true;
21214d7b3e37b6129d845d6c8da8ee8d612937c63d4Mathieu Chartier    }
21314d7b3e37b6129d845d6c8da8ee8d612937c63d4Mathieu Chartier
214f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    public void setTabContainer(ScrollingTabContainerView tabView) {
215f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        if (mTabContainer != null) {
216f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            removeView(mTabContainer);
217f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        }
218f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        mTabContainer = tabView;
21914d7b3e37b6129d845d6c8da8ee8d612937c63d4Mathieu Chartier        if (tabView != null) {
220f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            addView(tabView);
221f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            final ViewGroup.LayoutParams lp = tabView.getLayoutParams();
222f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier            lp.width = LayoutParams.MATCH_PARENT;
223f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            lp.height = LayoutParams.WRAP_CONTENT;
224f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            tabView.setAllowCollapse(false);
225f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        }
226f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    }
227f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
228f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    public View getTabContainer() {
229f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        return mTabContainer;
230f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    }
231f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
232f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    @Override
233f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    public android.view.ActionMode startActionModeForChild(View child,
234f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            android.view.ActionMode.Callback callback) {
235f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        // No starting an action mode for an action bar child! (Where would it go?)
236f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        return null;
237f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    }
238f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
239f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    @Override
240f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    public android.view.ActionMode startActionModeForChild(View child,
241f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            android.view.ActionMode.Callback callback, int type) {
242f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        if (type != android.view.ActionMode.TYPE_PRIMARY) {
243f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            return super.startActionModeForChild(child, callback, type);
244f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        }
245f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        return null;
246f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    }
247f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
248f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    private boolean isCollapsed(View view) {
249f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        return view == null || view.getVisibility() == GONE || view.getMeasuredHeight() == 0;
250f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    }
251f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
252f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    private int getMeasuredHeightWithMargins(View view) {
253f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        final LayoutParams lp = (LayoutParams) view.getLayoutParams();
254f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        return view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
255f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    }
256f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
257f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    @Override
258f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
259f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        if (mActionBarView == null &&
260f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST && mHeight >= 0) {
261f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            heightMeasureSpec = MeasureSpec.makeMeasureSpec(
262f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                    Math.min(mHeight, MeasureSpec.getSize(heightMeasureSpec)), MeasureSpec.AT_MOST);
263f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        }
264f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
265f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
266f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        if (mActionBarView == null) return;
267f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
268f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        final int mode = MeasureSpec.getMode(heightMeasureSpec);
269f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        if (mTabContainer != null && mTabContainer.getVisibility() != GONE
270f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                && mode != MeasureSpec.EXACTLY) {
271f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            final int topMarginForTabs;
272f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            if (!isCollapsed(mActionBarView)) {
273f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                topMarginForTabs = getMeasuredHeightWithMargins(mActionBarView);
274f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            } else if (!isCollapsed(mContextView)) {
275f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                topMarginForTabs = getMeasuredHeightWithMargins(mContextView);
276f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            } else {
277f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                topMarginForTabs = 0;
278f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            }
279f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            final int maxHeight = mode == MeasureSpec.AT_MOST ?
280f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                    MeasureSpec.getSize(heightMeasureSpec) : Integer.MAX_VALUE;
281f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            setMeasuredDimension(getMeasuredWidth(),
282f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                    Math.min(topMarginForTabs + getMeasuredHeightWithMargins(mTabContainer),
283f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier                            maxHeight));
284f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier        }
285f9c6fc610b27887f832e453a0da1789187293408Mathieu Chartier    }
286f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
287f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    @Override
288f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    public void onLayout(boolean changed, int l, int t, int r, int b) {
289f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        super.onLayout(changed, l, t, r, b);
290f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
291f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        final View tabContainer = mTabContainer;
292f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        final boolean hasTabs = tabContainer != null && tabContainer.getVisibility() != GONE;
293f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
294f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        if (tabContainer != null && tabContainer.getVisibility() != GONE) {
295f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            final int containerHeight = getMeasuredHeight();
296f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            final LayoutParams lp = (LayoutParams) tabContainer.getLayoutParams();
297f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            final int tabHeight = tabContainer.getMeasuredHeight();
298f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            tabContainer.layout(l, containerHeight - tabHeight - lp.bottomMargin, r,
299f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                    containerHeight - lp.bottomMargin);
300f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        }
301f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
302f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        boolean needsInvalidate = false;
303f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        if (mIsSplit) {
304f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            if (mSplitBackground != null) {
305f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
306f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                needsInvalidate = true;
307f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            }
308f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        } else {
309f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            if (mBackground != null) {
310f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                if (mActionBarView.getVisibility() == View.VISIBLE) {
311f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                    mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(),
312f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                            mActionBarView.getRight(), mActionBarView.getBottom());
313f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                } else if (mContextView != null &&
314f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                        mContextView.getVisibility() == View.VISIBLE) {
315f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                    mBackground.setBounds(mContextView.getLeft(), mContextView.getTop(),
316f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                            mContextView.getRight(), mContextView.getBottom());
317f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                } else {
318f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                    mBackground.setBounds(0, 0, 0, 0);
319f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                }
320f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                needsInvalidate = true;
321f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            }
322f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            mIsStacked = hasTabs;
323f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            if (hasTabs && mStackedBackground != null) {
324f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                mStackedBackground.setBounds(tabContainer.getLeft(), tabContainer.getTop(),
325f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                        tabContainer.getRight(), tabContainer.getBottom());
326f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao                needsInvalidate = true;
327f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            }
328f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        }
329f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao
330f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        if (needsInvalidate) {
331f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao            invalidate();
332f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao        }
333f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao    }
334f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao}
335f0192c86a58b2f43378c9a2113007538dd38ddbfJeff Hao