ActionBarContainer.java revision 7f610fed107b158c144dca1b20a44ee91eb8c934
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 1945f1e08c348ccb129bcc25e438c05421f7123f41Adam Powellimport android.content.Context; 2045f1e08c348ccb129bcc25e438c05421f7123f41Adam Powellimport android.content.res.TypedArray; 21a72ef62e5c329a19eab9935acba816fc1369c637Adam Powellimport android.graphics.Canvas; 227f610fed107b158c144dca1b20a44ee91eb8c934Alan Viveretteimport android.graphics.ColorFilter; 23a72ef62e5c329a19eab9935acba816fc1369c637Adam Powellimport android.graphics.drawable.Drawable; 2445f1e08c348ccb129bcc25e438c05421f7123f41Adam Powellimport android.util.AttributeSet; 25640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powellimport android.view.ActionMode; 266ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powellimport android.view.MotionEvent; 27dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powellimport android.view.View; 28af6b97ebe0e6a67d1691c4d7789c7bc312c1e13eAdam Powellimport android.view.ViewGroup; 2945f1e08c348ccb129bcc25e438c05421f7123f41Adam Powellimport android.widget.FrameLayout; 3045f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell 3145f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell/** 3245f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * This class acts as a container for the action bar view and action mode context views. 3345f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * It applies special styles as needed to help handle animated transitions between them. 3445f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell * @hide 3545f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell */ 3645f1e08c348ccb129bcc25e438c05421f7123f41Adam Powellpublic class ActionBarContainer extends FrameLayout { 3701feaee3d9767ef1185783877e92244f14d7d4baAdam Powell private boolean mIsTransitioning; 38dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell private View mTabContainer; 39310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell private ActionBarView mActionBarView; 4001feaee3d9767ef1185783877e92244f14d7d4baAdam Powell 41a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell private Drawable mBackground; 42a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell private Drawable mStackedBackground; 43a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell private Drawable mSplitBackground; 44a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell private boolean mIsSplit; 45a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell private boolean mIsStacked; 46a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell 4745f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell public ActionBarContainer(Context context) { 4845f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell this(context, null); 4945f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell } 5045f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell 5145f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell public ActionBarContainer(Context context, AttributeSet attrs) { 5245f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell super(context, attrs); 5345f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell 547f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette // Set a transparent background so that we project appropriately. 557f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette setBackground(new ActionBarBackgroundDrawable()); 56a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell 5745f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell TypedArray a = context.obtainStyledAttributes(attrs, 5845f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell com.android.internal.R.styleable.ActionBar); 59a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell mBackground = a.getDrawable(com.android.internal.R.styleable.ActionBar_background); 60a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell mStackedBackground = a.getDrawable( 61a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell com.android.internal.R.styleable.ActionBar_backgroundStacked); 62a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell 63a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell if (getId() == com.android.internal.R.id.split_action_bar) { 64a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell mIsSplit = true; 65a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell mSplitBackground = a.getDrawable( 66a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell com.android.internal.R.styleable.ActionBar_backgroundSplit); 67a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell } 6845f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell a.recycle(); 69a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell 70a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell setWillNotDraw(mIsSplit ? mSplitBackground == null : 71a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell mBackground == null && mStackedBackground == null); 7245f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell } 736ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell 74310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell @Override 75310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell public void onFinishInflate() { 76310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell super.onFinishInflate(); 77310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell mActionBarView = (ActionBarView) findViewById(com.android.internal.R.id.action_bar); 78310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell } 79310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell 80f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell public void setPrimaryBackground(Drawable bg) { 81a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mBackground != null) { 82a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mBackground.setCallback(null); 83a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell unscheduleDrawable(mBackground); 84a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 85f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell mBackground = bg; 86a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (bg != null) { 87a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell bg.setCallback(this); 88e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell if (mActionBarView != null) { 89e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(), 90e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell mActionBarView.getRight(), mActionBarView.getBottom()); 91e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell } 92a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 93a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell setWillNotDraw(mIsSplit ? mSplitBackground == null : 94a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mBackground == null && mStackedBackground == null); 95f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell invalidate(); 96f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell } 97f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell 98f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell public void setStackedBackground(Drawable bg) { 99a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mStackedBackground != null) { 100a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mStackedBackground.setCallback(null); 101a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell unscheduleDrawable(mStackedBackground); 102a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 103f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell mStackedBackground = bg; 104a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (bg != null) { 105a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell bg.setCallback(this); 106e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell if ((mIsStacked && mStackedBackground != null)) { 107e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(), 108e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell mTabContainer.getRight(), mTabContainer.getBottom()); 109e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell } 110a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 111a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell setWillNotDraw(mIsSplit ? mSplitBackground == null : 112a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mBackground == null && mStackedBackground == null); 113f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell invalidate(); 114f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell } 115f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell 116f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell public void setSplitBackground(Drawable bg) { 117a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mSplitBackground != null) { 118a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mSplitBackground.setCallback(null); 119a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell unscheduleDrawable(mSplitBackground); 120a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 121f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell mSplitBackground = bg; 122a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (bg != null) { 123a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell bg.setCallback(this); 124e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell if (mIsSplit && mSplitBackground != null) { 125e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); 126e8c8ae401b6f0d894a766a1601f55f0fe567df02Adam Powell } 127a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 128a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell setWillNotDraw(mIsSplit ? mSplitBackground == null : 129a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mBackground == null && mStackedBackground == null); 130f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell invalidate(); 131f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell } 132f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell 133a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell @Override 134a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell public void setVisibility(int visibility) { 135a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell super.setVisibility(visibility); 136a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell final boolean isVisible = visibility == VISIBLE; 137a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mBackground != null) mBackground.setVisible(isVisible, false); 138a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mStackedBackground != null) mStackedBackground.setVisible(isVisible, false); 139a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mSplitBackground != null) mSplitBackground.setVisible(isVisible, false); 140a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 141a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell 142a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell @Override 143a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell protected boolean verifyDrawable(Drawable who) { 144a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell return (who == mBackground && !mIsSplit) || (who == mStackedBackground && mIsStacked) || 145a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell (who == mSplitBackground && mIsSplit) || super.verifyDrawable(who); 146a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 147a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell 148a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell @Override 149a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell protected void drawableStateChanged() { 150a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell super.drawableStateChanged(); 151a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mBackground != null && mBackground.isStateful()) { 152a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mBackground.setState(getDrawableState()); 153a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 154a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mStackedBackground != null && mStackedBackground.isStateful()) { 155a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mStackedBackground.setState(getDrawableState()); 156a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 157a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mSplitBackground != null && mSplitBackground.isStateful()) { 158a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mSplitBackground.setState(getDrawableState()); 159a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 160a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 161a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell 162a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell @Override 163a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell public void jumpDrawablesToCurrentState() { 164a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell super.jumpDrawablesToCurrentState(); 165a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mBackground != null) { 166a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mBackground.jumpToCurrentState(); 167a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 168a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mStackedBackground != null) { 169a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mStackedBackground.jumpToCurrentState(); 170a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 171a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mSplitBackground != null) { 172a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mSplitBackground.jumpToCurrentState(); 173a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 174a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 175a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell 1764457e85a7090ad51726d50a4daf981d917cceeddFabrice Di Meglio /** 1774457e85a7090ad51726d50a4daf981d917cceeddFabrice Di Meglio * @hide 1784457e85a7090ad51726d50a4daf981d917cceeddFabrice Di Meglio */ 179a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell @Override 180a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell public void onResolveDrawables(int layoutDirection) { 181a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell super.onResolveDrawables(layoutDirection); 182a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mBackground != null) { 183a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mBackground.setLayoutDirection(layoutDirection); 184a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 185a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mStackedBackground != null) { 186a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mStackedBackground.setLayoutDirection(layoutDirection); 187a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 188a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell if (mSplitBackground != null) { 189a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell mSplitBackground.setLayoutDirection(layoutDirection); 190a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 191a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell } 192a7cc06d82e45918c37429a59b14545c6a57db4e4Adam Powell 19301feaee3d9767ef1185783877e92244f14d7d4baAdam Powell /** 19401feaee3d9767ef1185783877e92244f14d7d4baAdam Powell * Set the action bar into a "transitioning" state. While transitioning 19501feaee3d9767ef1185783877e92244f14d7d4baAdam Powell * the bar will block focus and touch from all of its descendants. This 19601feaee3d9767ef1185783877e92244f14d7d4baAdam Powell * prevents the user from interacting with the bar while it is animating 19701feaee3d9767ef1185783877e92244f14d7d4baAdam Powell * in or out. 19801feaee3d9767ef1185783877e92244f14d7d4baAdam Powell * 19901feaee3d9767ef1185783877e92244f14d7d4baAdam Powell * @param isTransitioning true if the bar is currently transitioning, false otherwise. 20001feaee3d9767ef1185783877e92244f14d7d4baAdam Powell */ 20101feaee3d9767ef1185783877e92244f14d7d4baAdam Powell public void setTransitioning(boolean isTransitioning) { 20201feaee3d9767ef1185783877e92244f14d7d4baAdam Powell mIsTransitioning = isTransitioning; 20301feaee3d9767ef1185783877e92244f14d7d4baAdam Powell setDescendantFocusability(isTransitioning ? FOCUS_BLOCK_DESCENDANTS 20401feaee3d9767ef1185783877e92244f14d7d4baAdam Powell : FOCUS_AFTER_DESCENDANTS); 20501feaee3d9767ef1185783877e92244f14d7d4baAdam Powell } 20601feaee3d9767ef1185783877e92244f14d7d4baAdam Powell 20701feaee3d9767ef1185783877e92244f14d7d4baAdam Powell @Override 20801feaee3d9767ef1185783877e92244f14d7d4baAdam Powell public boolean onInterceptTouchEvent(MotionEvent ev) { 20901feaee3d9767ef1185783877e92244f14d7d4baAdam Powell return mIsTransitioning || super.onInterceptTouchEvent(ev); 21001feaee3d9767ef1185783877e92244f14d7d4baAdam Powell } 21101feaee3d9767ef1185783877e92244f14d7d4baAdam Powell 2126ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell @Override 2136ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell public boolean onTouchEvent(MotionEvent ev) { 2146ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell super.onTouchEvent(ev); 215dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell 216dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell // An action bar always eats touch events. 2176ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell return true; 2186ecf3d1690789ace1a667093ad6bbdd6cd35bda7Adam Powell } 219dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell 2207d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell @Override 2217d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell public boolean onHoverEvent(MotionEvent ev) { 2227d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell super.onHoverEvent(ev); 2237d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell 2247d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell // An action bar always eats hover events. 2257d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell return true; 2267d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell } 2277d09f04363cdda6a3cf8b2ad1b67c9a07fa8975fAdam Powell 228f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell public void setTabContainer(ScrollingTabContainerView tabView) { 229dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell if (mTabContainer != null) { 230dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell removeView(mTabContainer); 231dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell } 232dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell mTabContainer = tabView; 23325151e4792e9be8dbb892b7eba7349773b8127afAdam Powell if (tabView != null) { 23425151e4792e9be8dbb892b7eba7349773b8127afAdam Powell addView(tabView); 235af6b97ebe0e6a67d1691c4d7789c7bc312c1e13eAdam Powell final ViewGroup.LayoutParams lp = tabView.getLayoutParams(); 236af6b97ebe0e6a67d1691c4d7789c7bc312c1e13eAdam Powell lp.width = LayoutParams.MATCH_PARENT; 237af6b97ebe0e6a67d1691c4d7789c7bc312c1e13eAdam Powell lp.height = LayoutParams.WRAP_CONTENT; 238f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell tabView.setAllowCollapse(false); 23925151e4792e9be8dbb892b7eba7349773b8127afAdam Powell } 240dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell } 241dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell 242dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell public View getTabContainer() { 243dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell return mTabContainer; 244dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell } 245dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell 246dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell @Override 247640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell public ActionMode startActionModeForChild(View child, ActionMode.Callback callback) { 248640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell // No starting an action mode for an action bar child! (Where would it go?) 249640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell return null; 250640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell } 251640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell 252640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell @Override 253dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 254dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell super.onMeasure(widthMeasureSpec, heightMeasureSpec); 255d21aa12e8eb9d46ee92bf408b4b48386c6bf062dAdam Powell 256f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell if (mActionBarView == null) return; 257310849abb1a0763ea9912b59187f0a4271efaa2eAdam Powell 258f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell final LayoutParams lp = (LayoutParams) mActionBarView.getLayoutParams(); 259f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell final int actionBarViewHeight = mActionBarView.isCollapsed() ? 0 : 260f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell mActionBarView.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; 261d21aa12e8eb9d46ee92bf408b4b48386c6bf062dAdam Powell 262dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell if (mTabContainer != null && mTabContainer.getVisibility() != GONE) { 263dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell final int mode = MeasureSpec.getMode(heightMeasureSpec); 264dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell if (mode == MeasureSpec.AT_MOST) { 265dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell final int maxHeight = MeasureSpec.getSize(heightMeasureSpec); 266dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell setMeasuredDimension(getMeasuredWidth(), 267f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell Math.min(actionBarViewHeight + mTabContainer.getMeasuredHeight(), 268f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell maxHeight)); 269dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell } 270dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell } 271dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell } 272dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell 273dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell @Override 274dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell public void onLayout(boolean changed, int l, int t, int r, int b) { 275dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell super.onLayout(changed, l, t, r, b); 276a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell 2777f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette final View tabContainer = mTabContainer; 2787f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette final boolean hasTabs = tabContainer != null && tabContainer.getVisibility() != GONE; 279a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell 2807f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette if (tabContainer != null && tabContainer.getVisibility() != GONE) { 281dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell final int containerHeight = getMeasuredHeight(); 2827f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette final int tabHeight = tabContainer.getMeasuredHeight(); 2837f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette tabContainer.layout(l, containerHeight - tabHeight, r, containerHeight); 284dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell } 285a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell 286a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell boolean needsInvalidate = false; 287a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell if (mIsSplit) { 288a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell if (mSplitBackground != null) { 289a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); 290a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell needsInvalidate = true; 291a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell } 292a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell } else { 293a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell if (mBackground != null) { 2947f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette final ActionBarView actionBarView = mActionBarView; 2957f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette mBackground.setBounds(actionBarView.getLeft(), actionBarView.getTop(), 2967f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette actionBarView.getRight(), actionBarView.getBottom()); 297a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell needsInvalidate = true; 298a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell } 2997f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette mIsStacked = hasTabs; 3007f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette if (hasTabs && mStackedBackground != null) { 3017f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette mStackedBackground.setBounds(tabContainer.getLeft(), tabContainer.getTop(), 3027f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette tabContainer.getRight(), tabContainer.getBottom()); 303a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell needsInvalidate = true; 304a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell } 305a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell } 306a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell 307a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell if (needsInvalidate) { 308a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell invalidate(); 309a72ef62e5c329a19eab9935acba816fc1369c637Adam Powell } 310dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell } 3117f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette 3127f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette /** 3137f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette * Dummy drawable so that we don't break background display lists and 3147f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette * projection surfaces. 3157f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette */ 3167f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette private class ActionBarBackgroundDrawable extends Drawable { 3177f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette @Override 3187f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette public void draw(Canvas canvas) { 3197f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette if (mIsSplit) { 3207f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette if (mSplitBackground != null) mSplitBackground.draw(canvas); 3217f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette } else { 3227f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette if (mBackground != null) { 3237f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette mBackground.draw(canvas); 3247f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette } 3257f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette if (mStackedBackground != null && mIsStacked) { 3267f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette mStackedBackground.draw(canvas); 3277f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette } 3287f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette } 3297f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette } 3307f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette 3317f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette @Override 3327f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette public void setAlpha(int alpha) { 3337f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette } 3347f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette 3357f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette @Override 3367f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette public void setColorFilter(ColorFilter cf) { 3377f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette } 3387f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette 3397f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette @Override 3407f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette public int getOpacity() { 3417f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette return 0; 3427f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette } 3437f610fed107b158c144dca1b20a44ee91eb8c934Alan Viverette } 34445f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell} 345