1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/* 2bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Copyright (C) 2010 The Android Open Source Project 3bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 4bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * you may not use this file except in compliance with the License. 6bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * You may obtain a copy of the License at 7bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 8bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * http://www.apache.org/licenses/LICENSE-2.0 9bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 10bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Unless required by applicable law or agreed to in writing, software 11bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * See the License for the specific language governing permissions and 14bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * limitations under the License. 15bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 16bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1766698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banespackage android.support.v7.widget; 18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 19bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context; 20bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.TypedArray; 21bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.graphics.drawable.Drawable; 2218fd7433f4123ed2e725601591470455c6b7578eChris Banesimport android.os.Build; 23c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo; 2447082c30c630c34829439a9eecd1cf7e8d255a86Aurimas Liutikasimport android.support.v4.view.ViewCompat; 25da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.appcompat.R; 26d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.view.ActionMode; 27bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.util.AttributeSet; 28bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.MotionEvent; 29bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View; 30bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.ViewGroup; 31bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.widget.FrameLayout; 32bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 33c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport static android.support.annotation.RestrictTo.Scope.GROUP_ID; 34c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette 35bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/** 3649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * This class acts as a container for the action bar view and action mode context views. 3749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * It applies special styles as needed to help handle animated transitions between them. 38bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * @hide 39bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 40c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette@RestrictTo(GROUP_ID) 41bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellpublic class ActionBarContainer extends FrameLayout { 4220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private boolean mIsTransitioning; 4320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private View mTabContainer; 4449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private View mActionBarView; 45c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar private View mContextView; 4620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 47d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes Drawable mBackground; 48d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes Drawable mStackedBackground; 49d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes Drawable mSplitBackground; 50d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes boolean mIsSplit; 51d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes boolean mIsStacked; 5249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mHeight; 5320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 5420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public ActionBarContainer(Context context) { 5520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns this(context, null); 5620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 5720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 5820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public ActionBarContainer(Context context, AttributeSet attrs) { 5920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super(context, attrs); 6020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Set a transparent background so that we project appropriately. 6266698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banes final Drawable bg = Build.VERSION.SDK_INT >= 21 63d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes ? new ActionBarBackgroundDrawableV21(this) 64d8213c28889f37a1a2b6c05115be9f6df54a7a45Chris Banes : new ActionBarBackgroundDrawable(this); 6547082c30c630c34829439a9eecd1cf7e8d255a86Aurimas Liutikas ViewCompat.setBackground(this, bg); 6620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 6720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns TypedArray a = context.obtainStyledAttributes(attrs, 6820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns R.styleable.ActionBar); 6920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mBackground = a.getDrawable(R.styleable.ActionBar_background); 7020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mStackedBackground = a.getDrawable( 7120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns R.styleable.ActionBar_backgroundStacked); 7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mHeight = a.getDimensionPixelSize(R.styleable.ActionBar_height, -1); 7320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 7420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (getId() == R.id.split_action_bar) { 7520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mIsSplit = true; 7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSplitBackground = a.getDrawable(R.styleable.ActionBar_backgroundSplit); 77bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 7820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns a.recycle(); 7920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 8020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setWillNotDraw(mIsSplit ? mSplitBackground == null : 8120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mBackground == null && mStackedBackground == null); 8220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 8320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 8420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 8520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onFinishInflate() { 8620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onFinishInflate(); 8749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionBarView = findViewById(R.id.action_bar); 88c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar mContextView = findViewById(R.id.action_context_bar); 8920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 9020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 9120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setPrimaryBackground(Drawable bg) { 92242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (mBackground != null) { 93242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes mBackground.setCallback(null); 94242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes unscheduleDrawable(mBackground); 95242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 9620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mBackground = bg; 97242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (bg != null) { 98242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes bg.setCallback(this); 9918fd7433f4123ed2e725601591470455c6b7578eChris Banes if (mActionBarView != null) { 10018fd7433f4123ed2e725601591470455c6b7578eChris Banes mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(), 10118fd7433f4123ed2e725601591470455c6b7578eChris Banes mActionBarView.getRight(), mActionBarView.getBottom()); 10218fd7433f4123ed2e725601591470455c6b7578eChris Banes } 103242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 104242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes setWillNotDraw(mIsSplit ? mSplitBackground == null : 105242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes mBackground == null && mStackedBackground == null); 10620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns invalidate(); 10720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 10820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 10920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setStackedBackground(Drawable bg) { 110242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (mStackedBackground != null) { 111242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes mStackedBackground.setCallback(null); 112242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes unscheduleDrawable(mStackedBackground); 113242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 11420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mStackedBackground = bg; 115242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (bg != null) { 116242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes bg.setCallback(this); 11718fd7433f4123ed2e725601591470455c6b7578eChris Banes if ((mIsStacked && mStackedBackground != null)) { 11818fd7433f4123ed2e725601591470455c6b7578eChris Banes mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(), 11918fd7433f4123ed2e725601591470455c6b7578eChris Banes mTabContainer.getRight(), mTabContainer.getBottom()); 12018fd7433f4123ed2e725601591470455c6b7578eChris Banes } 121242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 122242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes setWillNotDraw(mIsSplit ? mSplitBackground == null : 123242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes mBackground == null && mStackedBackground == null); 12420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns invalidate(); 12520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 12620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 12720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setSplitBackground(Drawable bg) { 128242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (mSplitBackground != null) { 129242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes mSplitBackground.setCallback(null); 130242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes unscheduleDrawable(mSplitBackground); 131242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 13220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mSplitBackground = bg; 133242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (bg != null) { 134242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes bg.setCallback(this); 13518fd7433f4123ed2e725601591470455c6b7578eChris Banes if (mIsSplit && mSplitBackground != null) { 13618fd7433f4123ed2e725601591470455c6b7578eChris Banes mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); 13718fd7433f4123ed2e725601591470455c6b7578eChris Banes } 138242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 139242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes setWillNotDraw(mIsSplit ? mSplitBackground == null : 140242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes mBackground == null && mStackedBackground == null); 14120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns invalidate(); 14220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 14320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 144242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes @Override 145242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes public void setVisibility(int visibility) { 146242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes super.setVisibility(visibility); 147242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes final boolean isVisible = visibility == VISIBLE; 148242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (mBackground != null) mBackground.setVisible(isVisible, false); 149242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (mStackedBackground != null) mStackedBackground.setVisible(isVisible, false); 150242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (mSplitBackground != null) mSplitBackground.setVisible(isVisible, false); 151242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 152242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes 153242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes @Override 154242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes protected boolean verifyDrawable(Drawable who) { 155242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes return (who == mBackground && !mIsSplit) || (who == mStackedBackground && mIsStacked) || 156242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes (who == mSplitBackground && mIsSplit) || super.verifyDrawable(who); 157242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 158242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes 159242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes @Override 160242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes protected void drawableStateChanged() { 161242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes super.drawableStateChanged(); 162242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (mBackground != null && mBackground.isStateful()) { 163242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes mBackground.setState(getDrawableState()); 164242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 165242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (mStackedBackground != null && mStackedBackground.isStateful()) { 166242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes mStackedBackground.setState(getDrawableState()); 167242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 168242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes if (mSplitBackground != null && mSplitBackground.isStateful()) { 169242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes mSplitBackground.setState(getDrawableState()); 170242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 171242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes } 172242db97d44808da5e2f8ec45076e2353a03882a0Chris Banes 17349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void jumpDrawablesToCurrentState() { 17449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (Build.VERSION.SDK_INT >= 11) { 17549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.jumpDrawablesToCurrentState(); 17649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mBackground != null) { 17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mBackground.jumpToCurrentState(); 17849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 17949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mStackedBackground != null) { 18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mStackedBackground.jumpToCurrentState(); 18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSplitBackground != null) { 18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSplitBackground.jumpToCurrentState(); 18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 18820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns /** 18920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Set the action bar into a "transitioning" state. While transitioning the bar will block focus 19020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * and touch from all of its descendants. This prevents the user from interacting with the bar 19120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * while it is animating in or out. 19220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * 19320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * @param isTransitioning true if the bar is currently transitioning, false otherwise. 19420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns */ 19520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setTransitioning(boolean isTransitioning) { 19620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mIsTransitioning = isTransitioning; 19720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns setDescendantFocusability(isTransitioning ? FOCUS_BLOCK_DESCENDANTS 19820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns : FOCUS_AFTER_DESCENDANTS); 19920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 20020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 20120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 20220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean onInterceptTouchEvent(MotionEvent ev) { 20320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mIsTransitioning || super.onInterceptTouchEvent(ev); 20420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 20520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 20620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 20720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean onTouchEvent(MotionEvent ev) { 20820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onTouchEvent(ev); 20920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 21020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // An action bar always eats touch events. 21120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return true; 21220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 21320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 21420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void setTabContainer(ScrollingTabContainerView tabView) { 21520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mTabContainer != null) { 21620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns removeView(mTabContainer); 21720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 21820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mTabContainer = tabView; 21920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (tabView != null) { 22020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns addView(tabView); 22120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final ViewGroup.LayoutParams lp = tabView.getLayoutParams(); 22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.width = LayoutParams.MATCH_PARENT; 22320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns lp.height = LayoutParams.WRAP_CONTENT; 22420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns tabView.setAllowCollapse(false); 22520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 22620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 22720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 22820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public View getTabContainer() { 22920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mTabContainer; 23020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 23120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 232d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes public android.view.ActionMode startActionModeForChild(View child, 233d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes android.view.ActionMode.Callback callback) { 23420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // No starting an action mode for an action bar child! (Where would it go?) 23520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return null; 23620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 23720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 238d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes public android.view.ActionMode startActionModeForChild(View child, 239d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes android.view.ActionMode.Callback callback, int type) { 240d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes if (type != android.view.ActionMode.TYPE_PRIMARY) { 241d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes return super.startActionModeForChild(child, callback, type); 242d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes } 243c5cbf40d0ef5e4ba3f50adaf2af08d19fecdf55aYigit Boyar return null; 244c5cbf40d0ef5e4ba3f50adaf2af08d19fecdf55aYigit Boyar } 245c5cbf40d0ef5e4ba3f50adaf2af08d19fecdf55aYigit Boyar 24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean isCollapsed(View view) { 24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return view == null || view.getVisibility() == GONE || view.getMeasuredHeight() == 0; 24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 250c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar private int getMeasuredHeightWithMargins(View view) { 251c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar final LayoutParams lp = (LayoutParams) view.getLayoutParams(); 252c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar return view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; 253c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar } 254c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar 25520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 25620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarView == null && 25849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST && mHeight >= 0) { 25949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes heightMeasureSpec = MeasureSpec.makeMeasureSpec( 26049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Math.min(mHeight, MeasureSpec.getSize(heightMeasureSpec)), MeasureSpec.AT_MOST); 26149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 26220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onMeasure(widthMeasureSpec, heightMeasureSpec); 26320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionBarView == null) return; 26520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 266c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar final int mode = MeasureSpec.getMode(heightMeasureSpec); 267c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar if (mTabContainer != null && mTabContainer.getVisibility() != GONE 268c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar && mode != MeasureSpec.EXACTLY) { 269c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar final int topMarginForTabs; 270c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar if (!isCollapsed(mActionBarView)) { 271c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar topMarginForTabs = getMeasuredHeightWithMargins(mActionBarView); 272c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar } else if (!isCollapsed(mContextView)) { 273c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar topMarginForTabs = getMeasuredHeightWithMargins(mContextView); 274c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar } else { 275c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar topMarginForTabs = 0; 27620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 277c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar final int maxHeight = mode == MeasureSpec.AT_MOST ? 278c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar MeasureSpec.getSize(heightMeasureSpec) : Integer.MAX_VALUE; 279c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar setMeasuredDimension(getMeasuredWidth(), 280c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar Math.min(topMarginForTabs + getMeasuredHeightWithMargins(mTabContainer), 281c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar maxHeight)); 28220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 28320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 28420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 28520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns @Override 28620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public void onLayout(boolean changed, int l, int t, int r, int b) { 28720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns super.onLayout(changed, l, t, r, b); 28820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final View tabContainer = mTabContainer; 29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final boolean hasTabs = tabContainer != null && tabContainer.getVisibility() != GONE; 29120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (tabContainer != null && tabContainer.getVisibility() != GONE) { 29320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns final int containerHeight = getMeasuredHeight(); 294c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar final LayoutParams lp = (LayoutParams) tabContainer.getLayoutParams(); 29549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int tabHeight = tabContainer.getMeasuredHeight(); 296c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar tabContainer.layout(l, containerHeight - tabHeight - lp.bottomMargin, r, 297c5f2053af179e480ab0b0b50d1b0aade4e97fbc1Yigit Boyar containerHeight - lp.bottomMargin); 29820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 29920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 30020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean needsInvalidate = false; 30120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mIsSplit) { 30220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mSplitBackground != null) { 30320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); 30420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns needsInvalidate = true; 30520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 30620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } else { 30720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (mBackground != null) { 3087d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar if (mActionBarView.getVisibility() == View.VISIBLE) { 3097d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(), 3107d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar mActionBarView.getRight(), mActionBarView.getBottom()); 3117d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar } else if (mContextView != null && 3127d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar mContextView.getVisibility() == View.VISIBLE) { 3137d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar mBackground.setBounds(mContextView.getLeft(), mContextView.getTop(), 3147d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar mContextView.getRight(), mContextView.getBottom()); 3157d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar } else { 3167d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar mBackground.setBounds(0, 0, 0, 0); 3177d099302a9f49cee558d366a7c615b28cea79e0aYigit Boyar } 31820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns needsInvalidate = true; 31920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 32049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mIsStacked = hasTabs; 32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (hasTabs && mStackedBackground != null) { 32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mStackedBackground.setBounds(tabContainer.getLeft(), tabContainer.getTop(), 32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes tabContainer.getRight(), tabContainer.getBottom()); 32420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns needsInvalidate = true; 32520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 32620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 32720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 32820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (needsInvalidate) { 32920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns invalidate(); 33020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 33120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 332bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell} 333