ActionBarContainer.java revision 1e610d479f091f1b09f2a7e5201711bf4d311f6f
145f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell/*
245f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * Copyright (C) 2010 The Android Open Source Project
345f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell *
445f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * Licensed under the Apache License, Version 2.0 (the "License");
545f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * you may not use this file except in compliance with the License.
645f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * You may obtain a copy of the License at
745f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell *
845f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell *      http://www.apache.org/licenses/LICENSE-2.0
945f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell *
1045f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * Unless required by applicable law or agreed to in writing, software
1145f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * distributed under the License is distributed on an "AS IS" BASIS,
1245f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1345f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * See the License for the specific language governing permissions and
1445f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * limitations under the License.
1545f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell */
1645f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell
1745f1e08c348ccb129bcc25e438c05421f7123f41Adam Powellpackage com.android.internal.widget;
1845f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell
1977b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craikimport android.annotation.NonNull;
2045f1e08c348ccb129bcc25e438c05421f7123f41Adam Powellimport android.content.Context;
2145f1e08c348ccb129bcc25e438c05421f7123f41Adam Powellimport android.content.res.TypedArray;
22a72ef62e5c329a19eab9935acba816fc1369c637Adam Powellimport android.graphics.Canvas;
237f610fed107b158c144dca1b20a44ee91eb8c934Alan Viveretteimport android.graphics.ColorFilter;
2477b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craikimport android.graphics.Outline;
25a72ef62e5c329a19eab9935acba816fc1369c637Adam Powellimport android.graphics.drawable.Drawable;
2645f1e08c348ccb129bcc25e438c05421f7123f41Adam Powellimport android.util.AttributeSet;
27640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport android.view.ActionMode;
286ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powellimport android.view.MotionEvent;
29dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powellimport android.view.View;
30af6b97ebe0e6a67d1691c4d7789c7bc312c1e13eAdam Powellimport android.view.ViewGroup;
3145f1e08c348ccb129bcc25e438c05421f7123f41Adam Powellimport android.widget.FrameLayout;
3245f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell
3345f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell/**
3445f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * This class acts as a container for the action bar view and action mode context views.
3545f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * It applies special styles as needed to help handle animated transitions between them.
3645f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * @hide
3745f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell */
3845f1e08c348ccb129bcc25e438c05421f7123f41Adam Powellpublic class ActionBarContainer extends FrameLayout {
3901feaee3d9767ef1185783877e92244f14d7d4baAdam Powell    private boolean mIsTransitioning;
40dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    private View mTabContainer;
41e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    private View mActionBarView;
4201feaee3d9767ef1185783877e92244f14d7d4baAdam Powell
43a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell    private Drawable mBackground;
44a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell    private Drawable mStackedBackground;
45a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell    private Drawable mSplitBackground;
46a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell    private boolean mIsSplit;
47a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell    private boolean mIsStacked;
48e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int mHeight;
49a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell
5045f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell    public ActionBarContainer(Context context) {
5145f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell        this(context, null);
5245f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell    }
5345f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell
5445f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell    public ActionBarContainer(Context context, AttributeSet attrs) {
5545f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell        super(context, attrs);
5645f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell
577f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        // Set a transparent background so that we project appropriately.
587f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        setBackground(new ActionBarBackgroundDrawable());
59a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell
6045f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell        TypedArray a = context.obtainStyledAttributes(attrs,
6145f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell                com.android.internal.R.styleable.ActionBar);
62a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell        mBackground = a.getDrawable(com.android.internal.R.styleable.ActionBar_background);
63a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell        mStackedBackground = a.getDrawable(
64a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell                com.android.internal.R.styleable.ActionBar_backgroundStacked);
65e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mHeight = a.getDimensionPixelSize(com.android.internal.R.styleable.ActionBar_height, -1);
66a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell
67a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell        if (getId() == com.android.internal.R.id.split_action_bar) {
68a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell            mIsSplit = true;
69a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell            mSplitBackground = a.getDrawable(
70a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell                    com.android.internal.R.styleable.ActionBar_backgroundSplit);
71a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell        }
7245f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell        a.recycle();
73a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell
74a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell        setWillNotDraw(mIsSplit ? mSplitBackground == null :
75a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell                mBackground == null && mStackedBackground == null);
7645f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell    }
776ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell
78310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell    @Override
79310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell    public void onFinishInflate() {
80310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell        super.onFinishInflate();
81e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        mActionBarView = findViewById(com.android.internal.R.id.action_bar);
82310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell    }
83310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell
84f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell    public void setPrimaryBackground(Drawable bg) {
85a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mBackground != null) {
86a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mBackground.setCallback(null);
87a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            unscheduleDrawable(mBackground);
88a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
89f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell        mBackground = bg;
90a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (bg != null) {
91a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            bg.setCallback(this);
92e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell            if (mActionBarView != null) {
93e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell                mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(),
94e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell                        mActionBarView.getRight(), mActionBarView.getBottom());
95e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell            }
96a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
97a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        setWillNotDraw(mIsSplit ? mSplitBackground == null :
98a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell                mBackground == null && mStackedBackground == null);
99f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell        invalidate();
100f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell    }
101f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell
102f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell    public void setStackedBackground(Drawable bg) {
103a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mStackedBackground != null) {
104a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mStackedBackground.setCallback(null);
105a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            unscheduleDrawable(mStackedBackground);
106a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
107f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell        mStackedBackground = bg;
108a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (bg != null) {
109a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            bg.setCallback(this);
110e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell            if ((mIsStacked && mStackedBackground != null)) {
111e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell                mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(),
112e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell                        mTabContainer.getRight(), mTabContainer.getBottom());
113e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell            }
114a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
115a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        setWillNotDraw(mIsSplit ? mSplitBackground == null :
116a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell                mBackground == null && mStackedBackground == null);
117f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell        invalidate();
118f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell    }
119f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell
120f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell    public void setSplitBackground(Drawable bg) {
121a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mSplitBackground != null) {
122a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mSplitBackground.setCallback(null);
123a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            unscheduleDrawable(mSplitBackground);
124a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
125f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell        mSplitBackground = bg;
126a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (bg != null) {
127a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            bg.setCallback(this);
128e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell            if (mIsSplit && mSplitBackground != null) {
129e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell                mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
130e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell            }
131a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
132a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        setWillNotDraw(mIsSplit ? mSplitBackground == null :
133a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell                mBackground == null && mStackedBackground == null);
134f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell        invalidate();
135f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell    }
136f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell
137a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    @Override
138a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    public void setVisibility(int visibility) {
139a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        super.setVisibility(visibility);
140a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        final boolean isVisible = visibility == VISIBLE;
141a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mBackground != null) mBackground.setVisible(isVisible, false);
142a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mStackedBackground != null) mStackedBackground.setVisible(isVisible, false);
143a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mSplitBackground != null) mSplitBackground.setVisible(isVisible, false);
144a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    }
145a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell
146a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    @Override
147a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    protected boolean verifyDrawable(Drawable who) {
148a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        return (who == mBackground && !mIsSplit) || (who == mStackedBackground && mIsStacked) ||
149a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell                (who == mSplitBackground && mIsSplit) || super.verifyDrawable(who);
150a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    }
151a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell
152a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    @Override
153a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    protected void drawableStateChanged() {
154a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        super.drawableStateChanged();
155a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mBackground != null && mBackground.isStateful()) {
156a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mBackground.setState(getDrawableState());
157a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
158a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mStackedBackground != null && mStackedBackground.isStateful()) {
159a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mStackedBackground.setState(getDrawableState());
160a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
161a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mSplitBackground != null && mSplitBackground.isStateful()) {
162a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mSplitBackground.setState(getDrawableState());
163a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
164a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    }
165a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell
166a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    @Override
167a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    public void jumpDrawablesToCurrentState() {
168a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        super.jumpDrawablesToCurrentState();
169a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mBackground != null) {
170a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mBackground.jumpToCurrentState();
171a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
172a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mStackedBackground != null) {
173a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mStackedBackground.jumpToCurrentState();
174a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
175a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mSplitBackground != null) {
176a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mSplitBackground.jumpToCurrentState();
177a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
178a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    }
179a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell
1804457e85a7090ad51726d50a4daf981d917cceeddFabrice Di Meglio    /**
1814457e85a7090ad51726d50a4daf981d917cceeddFabrice Di Meglio     * @hide
1824457e85a7090ad51726d50a4daf981d917cceeddFabrice Di Meglio     */
183a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    @Override
184a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    public void onResolveDrawables(int layoutDirection) {
185a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        super.onResolveDrawables(layoutDirection);
186a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mBackground != null) {
187a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mBackground.setLayoutDirection(layoutDirection);
188a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
189a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mStackedBackground != null) {
190a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mStackedBackground.setLayoutDirection(layoutDirection);
191a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
192a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        if (mSplitBackground != null) {
193a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell            mSplitBackground.setLayoutDirection(layoutDirection);
194a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell        }
195a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell    }
196a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell
19701feaee3d9767ef1185783877e92244f14d7d4baAdam Powell    /**
19801feaee3d9767ef1185783877e92244f14d7d4baAdam Powell     * Set the action bar into a "transitioning" state. While transitioning
19901feaee3d9767ef1185783877e92244f14d7d4baAdam Powell     * the bar will block focus and touch from all of its descendants. This
20001feaee3d9767ef1185783877e92244f14d7d4baAdam Powell     * prevents the user from interacting with the bar while it is animating
20101feaee3d9767ef1185783877e92244f14d7d4baAdam Powell     * in or out.
20201feaee3d9767ef1185783877e92244f14d7d4baAdam Powell     *
20301feaee3d9767ef1185783877e92244f14d7d4baAdam Powell     * @param isTransitioning true if the bar is currently transitioning, false otherwise.
20401feaee3d9767ef1185783877e92244f14d7d4baAdam Powell     */
20501feaee3d9767ef1185783877e92244f14d7d4baAdam Powell    public void setTransitioning(boolean isTransitioning) {
20601feaee3d9767ef1185783877e92244f14d7d4baAdam Powell        mIsTransitioning = isTransitioning;
20701feaee3d9767ef1185783877e92244f14d7d4baAdam Powell        setDescendantFocusability(isTransitioning ? FOCUS_BLOCK_DESCENDANTS
20801feaee3d9767ef1185783877e92244f14d7d4baAdam Powell                : FOCUS_AFTER_DESCENDANTS);
20901feaee3d9767ef1185783877e92244f14d7d4baAdam Powell    }
21001feaee3d9767ef1185783877e92244f14d7d4baAdam Powell
21101feaee3d9767ef1185783877e92244f14d7d4baAdam Powell    @Override
21201feaee3d9767ef1185783877e92244f14d7d4baAdam Powell    public boolean onInterceptTouchEvent(MotionEvent ev) {
21301feaee3d9767ef1185783877e92244f14d7d4baAdam Powell        return mIsTransitioning || super.onInterceptTouchEvent(ev);
21401feaee3d9767ef1185783877e92244f14d7d4baAdam Powell    }
21501feaee3d9767ef1185783877e92244f14d7d4baAdam Powell
2166ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell    @Override
2176ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell    public boolean onTouchEvent(MotionEvent ev) {
2186ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell        super.onTouchEvent(ev);
219dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell
220dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell        // An action bar always eats touch events.
2216ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell        return true;
2226ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell    }
223dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell
2247d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell    @Override
2257d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell    public boolean onHoverEvent(MotionEvent ev) {
2267d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell        super.onHoverEvent(ev);
2277d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell
2287d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell        // An action bar always eats hover events.
2297d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell        return true;
2307d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell    }
2317d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell
232f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell    public void setTabContainer(ScrollingTabContainerView tabView) {
233dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell        if (mTabContainer != null) {
234dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell            removeView(mTabContainer);
235dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell        }
236dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell        mTabContainer = tabView;
23725151e4792e9be8dbb892b7eba7349773b8127afAdam Powell        if (tabView != null) {
23825151e4792e9be8dbb892b7eba7349773b8127afAdam Powell            addView(tabView);
239af6b97ebe0e6a67d1691c4d7789c7bc312c1e13eAdam Powell            final ViewGroup.LayoutParams lp = tabView.getLayoutParams();
240af6b97ebe0e6a67d1691c4d7789c7bc312c1e13eAdam Powell            lp.width = LayoutParams.MATCH_PARENT;
241af6b97ebe0e6a67d1691c4d7789c7bc312c1e13eAdam Powell            lp.height = LayoutParams.WRAP_CONTENT;
242f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell            tabView.setAllowCollapse(false);
24325151e4792e9be8dbb892b7eba7349773b8127afAdam Powell        }
244dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    }
245dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell
246dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    public View getTabContainer() {
247dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell        return mTabContainer;
248dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    }
249dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell
250dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    @Override
251640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    public ActionMode startActionModeForChild(View child, ActionMode.Callback callback) {
252640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        // No starting an action mode for an action bar child! (Where would it go?)
253640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        return null;
254640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    }
255640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
2561e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik    private static boolean isCollapsed(View view) {
257e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        return view == null || view.getVisibility() == GONE || view.getMeasuredHeight() == 0;
258e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    }
259e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
260640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    @Override
261dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
262e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (mActionBarView == null &&
263e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST && mHeight >= 0) {
264e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            heightMeasureSpec = MeasureSpec.makeMeasureSpec(
265e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    Math.min(mHeight, MeasureSpec.getSize(heightMeasureSpec)), MeasureSpec.AT_MOST);
266e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
267dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
268d21aa12e8eb9d46ee92bf408b4b48386c6bf062dAdam Powell
269f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell        if (mActionBarView == null) return;
270310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell
271f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell        final LayoutParams lp = (LayoutParams) mActionBarView.getLayoutParams();
272e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        final int actionBarViewHeight = isCollapsed(mActionBarView) ? 0 :
273f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell                mActionBarView.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
274d21aa12e8eb9d46ee92bf408b4b48386c6bf062dAdam Powell
275dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell        if (mTabContainer != null && mTabContainer.getVisibility() != GONE) {
276dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell            final int mode = MeasureSpec.getMode(heightMeasureSpec);
277dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell            if (mode == MeasureSpec.AT_MOST) {
278dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell                final int maxHeight = MeasureSpec.getSize(heightMeasureSpec);
279dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell                setMeasuredDimension(getMeasuredWidth(),
280f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell                        Math.min(actionBarViewHeight + mTabContainer.getMeasuredHeight(),
281f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell                                maxHeight));
282dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell            }
283dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell        }
284dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    }
285dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell
286dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    @Override
287dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    public void onLayout(boolean changed, int l, int t, int r, int b) {
288dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell        super.onLayout(changed, l, t, r, b);
289a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell
2907f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        final View tabContainer = mTabContainer;
2917f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        final boolean hasTabs = tabContainer != null && tabContainer.getVisibility() != GONE;
292a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell
2937f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        if (tabContainer != null && tabContainer.getVisibility() != GONE) {
294dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell            final int containerHeight = getMeasuredHeight();
2957f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette            final int tabHeight = tabContainer.getMeasuredHeight();
2967f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette            tabContainer.layout(l, containerHeight - tabHeight, r, containerHeight);
297dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell        }
298a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell
299a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell        boolean needsInvalidate = false;
300a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell        if (mIsSplit) {
301a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell            if (mSplitBackground != null) {
302a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell                mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
303a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell                needsInvalidate = true;
304a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell            }
305a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell        } else {
306a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell            if (mBackground != null) {
307e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell                mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(),
308e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell                        mActionBarView.getRight(), mActionBarView.getBottom());
309a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell                needsInvalidate = true;
310a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell            }
3117f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette            mIsStacked = hasTabs;
3127f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette            if (hasTabs && mStackedBackground != null) {
3137f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette                mStackedBackground.setBounds(tabContainer.getLeft(), tabContainer.getTop(),
3147f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette                        tabContainer.getRight(), tabContainer.getBottom());
315a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell                needsInvalidate = true;
316a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell            }
317a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell        }
318a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell
319a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell        if (needsInvalidate) {
320a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell            invalidate();
321a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell        }
322dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    }
3237f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette
3247f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette    /**
3257f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette     * Dummy drawable so that we don't break background display lists and
3267f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette     * projection surfaces.
3277f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette     */
3287f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette    private class ActionBarBackgroundDrawable extends Drawable {
3291e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik        @Override
3301e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik        public void draw(Canvas canvas) {
3317f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette            if (mIsSplit) {
33277b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik                if (mSplitBackground != null) {
3331e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik                    mSplitBackground.draw(canvas);
33477b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik                }
3357f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette            } else {
3367f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette                if (mBackground != null) {
3371e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik                    mBackground.draw(canvas);
3387f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette                }
3397f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette                if (mStackedBackground != null && mIsStacked) {
3401e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik                    mStackedBackground.draw(canvas);
3417f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette                }
3427f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette            }
34377b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik        }
34477b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik
34577b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik        @Override
34677b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik        public void getOutline(@NonNull Outline outline) {
3471e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik            if (mIsSplit) {
3481e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik                if (mSplitBackground != null) {
3491e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik                    mSplitBackground.getOutline(outline);
3501e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik                }
3511e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik            } else {
3521e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik                // ignore the stacked background for shadow casting
3531e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik                if (mBackground != null) {
3541e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik                    mBackground.getOutline(outline);
3551e610d479f091f1b09f2a7e5201711bf4d311f6fChris Craik                }
35677b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik            }
3577f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        }
3587f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette
3597f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        @Override
3607f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        public void setAlpha(int alpha) {
3617f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        }
3627f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette
3637f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        @Override
3647f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        public void setColorFilter(ColorFilter cf) {
3657f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        }
3667f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette
3677f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        @Override
3687f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        public int getOpacity() {
3697f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette            return 0;
3707f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette        }
3717f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette    }
37245f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell}
373