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