Project: cow
Code Examples
/*
 * Copyright (C) 2010 The Android Open Source Project 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License. 
 */
 
package com.actionbarsherlock.internal.widget; 
 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Canvas; 
import android.graphics.drawable.Drawable; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 
 
import com.actionbarsherlock.R; 
import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.internal.nineoldandroids.widget.NineFrameLayout; 
 
/**
 * This class acts as a container for the action bar view and action mode context views. 
 * It applies special styles as needed to help handle animated transitions between them. 
 * @hide 
 */
 
public class ActionBarContainer extends NineFrameLayout { 
    private boolean mIsTransitioning; 
    private View mTabContainer; 
    private ActionBarView mActionBarView; 
 
    private Drawable mBackground; 
    private Drawable mStackedBackground; 
    private Drawable mSplitBackground; 
    private boolean mIsSplit; 
    private boolean mIsStacked; 
 
    public ActionBarContainer(Context context) { 
        this(context, null); 
    } 
 
    public ActionBarContainer(Context context, AttributeSet attrs) { 
        super(context, attrs); 
 
        setBackgroundDrawable(null); 
 
        TypedArray a = context.obtainStyledAttributes(attrs, 
                R.styleable.SherlockActionBar); 
        mBackground = a.getDrawable(R.styleable.SherlockActionBar_background); 
        mStackedBackground = a.getDrawable( 
                R.styleable.SherlockActionBar_backgroundStacked); 
 
        if (getId() == R.id.abs__split_action_bar) { 
            mIsSplit = true
            mSplitBackground = a.getDrawable( 
                    R.styleable.SherlockActionBar_backgroundSplit); 
        } 
        a.recycle(); 
 
        setWillNotDraw(mIsSplit ? mSplitBackground == null : 
                mBackground == null && mStackedBackground == null); 
    } 
 
    @Override 
    public void onFinishInflate() { 
        super.onFinishInflate(); 
        mActionBarView = (ActionBarView) findViewById(R.id.abs__action_bar); 
    } 
 
    public void setPrimaryBackground(Drawable bg) { 
        mBackground = bg; 
        invalidate(); 
    } 
 
    public void setStackedBackground(Drawable bg) { 
        mStackedBackground = bg; 
        invalidate(); 
    } 
 
    public void setSplitBackground(Drawable bg) { 
        mSplitBackground = bg; 
        invalidate(); 
    } 
 
    /**
     * Set the action bar into a "transitioning" state. While transitioning 
     * the bar will block focus and touch from all of its descendants. This 
     * prevents the user from interacting with the bar while it is animating 
     * in or out. 
     * 
     * @param isTransitioning true if the bar is currently transitioning, false otherwise. 
     */
 
    public void setTransitioning(boolean isTransitioning) { 
        mIsTransitioning = isTransitioning; 
        setDescendantFocusability(isTransitioning ? FOCUS_BLOCK_DESCENDANTS 
                : FOCUS_AFTER_DESCENDANTS); 
    } 
 
    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
        return mIsTransitioning || super.onInterceptTouchEvent(ev); 
    } 
 
    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
        super.onTouchEvent(ev); 
 
        // An action bar always eats touch events. 
        return true
    } 
 
    @Override 
    public boolean onHoverEvent(MotionEvent ev) { 
        super.onHoverEvent(ev); 
 
        // An action bar always eats hover events. 
        return true
    } 
 
    public void setTabContainer(ScrollingTabContainerView tabView) { 
        if (mTabContainer != null) { 
            removeView(mTabContainer); 
        } 
        mTabContainer = tabView; 
        if (tabView != null) { 
            addView(tabView); 
            final ViewGroup.LayoutParams lp = tabView.getLayoutParams(); 
            lp.width = LayoutParams.FILL_PARENT; 
            lp.height = LayoutParams.WRAP_CONTENT; 
            tabView.setAllowCollapse(false); 
        } 
    } 
 
    public View getTabContainer() { 
        return mTabContainer; 
    } 
 
    @Override 
    public void onDraw(Canvas canvas) { 
        if (getWidth() == 0 || getHeight() == 0) { 
            return
        } 
 
        if (mIsSplit) { 
            if (mSplitBackground != null) mSplitBackground.draw(canvas); 
        } else { 
            if (mBackground != null) { 
                mBackground.draw(canvas); 
            } 
            if (mStackedBackground != null && mIsStacked) { 
                mStackedBackground.draw(canvas); 
            } 
        } 
    } 
 
    //This causes the animation reflection to fail on pre-HC platforms 
    //@Override 
    //public android.view.ActionMode startActionModeForChild(View child, android.view.ActionMode.Callback callback) { 
    //    // No starting an action mode for an action bar child! (Where would it go?) 
    //    return null; 
    //} 
 
    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
        super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
 
        if (mActionBarView == nullreturn
 
        final LayoutParams lp = (LayoutParams) mActionBarView.getLayoutParams(); 
        final int actionBarViewHeight = mActionBarView.isCollapsed() ? 0 : 
                mActionBarView.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; 
 
        if (mTabContainer != null && mTabContainer.getVisibility() != GONE) { 
            final int mode = MeasureSpec.getMode(heightMeasureSpec); 
            if (mode == MeasureSpec.AT_MOST) { 
                final int maxHeight = MeasureSpec.getSize(heightMeasureSpec); 
                setMeasuredDimension(getMeasuredWidth(), 
                        Math.min(actionBarViewHeight + mTabContainer.getMeasuredHeight(), 
                                maxHeight)); 
            } 
        } 
    } 
 
    @Override 
    public void onLayout(boolean changed, int l, int t, int r, int b) { 
        super.onLayout(changed, l, t, r, b); 
 
        final boolean hasTabs = mTabContainer != null && mTabContainer.getVisibility() != GONE; 
 
        if (mTabContainer != null && mTabContainer.getVisibility() != GONE) { 
            final int containerHeight = getMeasuredHeight(); 
            final int tabHeight = mTabContainer.getMeasuredHeight(); 
 
            if ((mActionBarView.getDisplayOptions() & ActionBar.DISPLAY_SHOW_HOME) == 0) { 
                // Not showing home, put tabs on top. 
                final int count = getChildCount(); 
                for (int i = 0; i < count; i++) { 
                    final View child = getChildAt(i); 
 
                    if (child == mTabContainer) continue
 
                    if (!mActionBarView.isCollapsed()) { 
                        child.offsetTopAndBottom(tabHeight); 
                    } 
                } 
                mTabContainer.layout(l, 0, r, tabHeight); 
            } else { 
                mTabContainer.layout(l, containerHeight - tabHeight, r, containerHeight); 
            } 
        } 
 
        boolean needsInvalidate = false
        if (mIsSplit) { 
            if (mSplitBackground != null) { 
                mSplitBackground.setBounds(00, getMeasuredWidth(), getMeasuredHeight()); 
                needsInvalidate = true
            } 
        } else { 
            if (mBackground != null) { 
                mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(), 
                        mActionBarView.getRight(), mActionBarView.getBottom()); 
                needsInvalidate = true
            } 
            if ((mIsStacked = hasTabs && mStackedBackground != null)) { 
                mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(), 
                        mTabContainer.getRight(), mTabContainer.getBottom()); 
                needsInvalidate = true
            } 
        } 
 
        if (needsInvalidate) { 
            invalidate(); 
        } 
    } 
}