/* * 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.tencent.tws.assistant.internal.widget; import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; import com.tencent.tws.assistant.app.ActionBar; import com.tencent.tws.sharelib.R; /** * 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 FrameLayout { private static final String TAG = "rick_Debug:ActionBarContainer"; private boolean mIsTransitioning; private ScrollingTabContainerView mTabContainer; private ActionBarView mActionBarView; private Drawable mBackground; private Drawable mStackedBackground; private Drawable mSplitBackground; private boolean mIsSplit; private boolean mIsStacked; private int mBackgroundResId; 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.ActionBar); mBackground = a.getDrawable(R.styleable.ActionBar_background); if (mBackground == null) { boolean hasOverlayActionbar = false; if (context instanceof Activity) { Window window = ((Activity) context).getWindow(); hasOverlayActionbar = window.hasFeature(Window.FEATURE_ACTION_BAR_OVERLAY); window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } if (hasOverlayActionbar) { mBackground = new ColorDrawable(getResources().getColor(R.color.transparent)); } else { mBackground = new ColorDrawable(getResources().getColor(R.color.tws_bar_background)); } } mBackgroundResId = a.getResourceId(R.styleable.ActionBar_background, R.color.tws_bar_background); mStackedBackground = a.getDrawable(R.styleable.ActionBar_backgroundStacked); if (mStackedBackground == null) { mStackedBackground = new ColorDrawable(getResources().getColor(R.color.tws_bar_background)); } Log.d(TAG, "mBackground is " + mBackground + " mBackgroundResId=" + Integer.toHexString(mBackgroundResId) + " mStackedBackground=" + mStackedBackground); if (getId() == R.id.tws_split_action_bar) { mIsSplit = true; mSplitBackground = a.getDrawable(R.styleable.ActionBar_backgroundSplit); } a.recycle(); setWillNotDraw(mIsSplit ? mSplitBackground == null : mBackground == null && mStackedBackground == null); } @Override public void onFinishInflate() { super.onFinishInflate(); mActionBarView = (ActionBarView) findViewById(R.id.tws_action_bar); } public void setPrimaryBackground(Drawable bg) { if (mBackground != null) { mBackground.setCallback(null); unscheduleDrawable(mBackground); } mBackground = bg; if (bg != null) { bg.setCallback(this); if (mActionBarView != null) { mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(), mActionBarView.getRight(), mActionBarView.getBottom()); } } setWillNotDraw(mIsSplit ? mSplitBackground == null : mBackground == null && mStackedBackground == null); invalidate(); } public void setStackedBackground(Drawable bg) { if (mStackedBackground != null) { mStackedBackground.setCallback(null); unscheduleDrawable(mStackedBackground); } mStackedBackground = bg; if (bg != null) { bg.setCallback(this); if ((mIsStacked && mStackedBackground != null)) { mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(), mTabContainer.getRight(), mTabContainer.getBottom()); } } setWillNotDraw(mIsSplit ? mSplitBackground == null : mBackground == null && mStackedBackground == null); invalidate(); } public void setSplitBackground(Drawable bg) { if (mSplitBackground != null) { mSplitBackground.setCallback(null); unscheduleDrawable(mSplitBackground); } mSplitBackground = bg; if (bg != null) { bg.setCallback(this); if (mIsSplit && mSplitBackground != null) { mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); } } setWillNotDraw(mIsSplit ? mSplitBackground == null : mBackground == null && mStackedBackground == null); invalidate(); } @Override public void setVisibility(int visibility) { super.setVisibility(visibility); final boolean isVisible = visibility == VISIBLE; if (mBackground != null) mBackground.setVisible(isVisible, false); if (mStackedBackground != null) mStackedBackground.setVisible(isVisible, false); if (mSplitBackground != null) mSplitBackground.setVisible(isVisible, false); } @Override protected boolean verifyDrawable(Drawable who) { return (who == mBackground && !mIsSplit) || (who == mStackedBackground && mIsStacked) || (who == mSplitBackground && mIsSplit) || super.verifyDrawable(who); } @Override protected void drawableStateChanged() { super.drawableStateChanged(); if (mBackground != null && mBackground.isStateful()) { mBackground.setState(getDrawableState()); } if (mStackedBackground != null && mStackedBackground.isStateful()) { mStackedBackground.setState(getDrawableState()); } if (mSplitBackground != null && mSplitBackground.isStateful()) { mSplitBackground.setState(getDrawableState()); } } @Override public void jumpDrawablesToCurrentState() { super.jumpDrawablesToCurrentState(); if (mBackground != null) { mBackground.jumpToCurrentState(); } if (mStackedBackground != null) { mStackedBackground.jumpToCurrentState(); } if (mSplitBackground != null) { mSplitBackground.jumpToCurrentState(); } } public int getPrimaryBackgroundResId() { return mBackgroundResId; } /** * 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 (mTabContainer != null) mTabContainer.setStackedDrawable(mStackedBackground); if (tabView != null) { addView(tabView); final ViewGroup.LayoutParams lp = tabView.getLayoutParams(); lp.width = LayoutParams.MATCH_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 (mTabContainer != null && mTabContainer.getTabWaveEnable()) { if (mTabContainer.getTabMode() == ActionBar.ACTIONBAR_TAB_OVERLAY) { return; } else if (mTabContainer.getTabMode() == ActionBar.ACTIONBAR_TAB_OVERLAY_SECOND || mTabContainer.getTabMode() == ActionBar.ACTIONBAR_TAB_STANDARD_SECOND) { if (mStackedBackground != null && mIsStacked) { mStackedBackground.draw(canvas); } } } else { if (mStackedBackground != null && mIsStacked) { mStackedBackground.draw(canvas); } } } } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (mActionBarView == null) return; 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); // tws-start modify for actionbar shadow::2014-12-24 // final boolean hasTabs = mTabContainer != null && // mTabContainer.getVisibility() != GONE; final boolean hasTabs = mTabContainer != null; // tws-end modify for actionbar shadow::2014-12-24 if (mTabContainer != null && mTabContainer.getVisibility() != GONE) { final int containerHeight = getMeasuredHeight(); final int tabHeight = mTabContainer.getMeasuredHeight(); final int shadowHeight = getResources().getDimensionPixelSize(R.dimen.tws_action_bar_shadow_height); if (((mActionBarView.getDisplayOptions() & ActionBar.DISPLAY_SHOW_HOME) == 0) && ((mActionBarView.getDisplayOptions() & ActionBar.DISPLAY_SHOW_TITLE) == 1)) { // 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 { if (mTabContainer.getTabMode() == ActionBar.ACTIONBAR_TAB_OVERLAY_SECOND || mTabContainer.getTabMode() == ActionBar.ACTIONBAR_TAB_STANDARD_SECOND) { mTabContainer.layout(l, containerHeight - tabHeight - shadowHeight, r, containerHeight); } else { mTabContainer.layout(l, containerHeight - tabHeight, r, containerHeight); } } } boolean needsInvalidate = false; if (mIsSplit) { if (mSplitBackground != null) { mSplitBackground.setBounds(0, 0, 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)) { if (mTabContainer.getTabMode() == ActionBar.ACTIONBAR_TAB_OVERLAY_SECOND || mTabContainer.getTabMode() == ActionBar.ACTIONBAR_TAB_STANDARD_SECOND) { mStackedBackground.setBounds( getLeft(), getTop(), getRight(), getBottom() - (mTabContainer.getTabWaveEnable() ? (int) getResources().getDimension( R.dimen.tws_actionbartab_overlay_offset) : 0)); } else if (mTabContainer.getTabMode() == ActionBar.ACTIONBAR_TAB_OVERLAY) { mStackedBackground.setBounds(getLeft(), getTop(), getRight(), mTabContainer.getBottom()); } else { mStackedBackground.setBounds(mTabContainer.getLeft(), getTop(), getRight(), mTabContainer.getBottom()); } needsInvalidate = true; } } if (needsInvalidate) { invalidate(); } } public void twsSetTabTextSelectChange(boolean change) { if (mTabContainer != null) { mTabContainer.twsSetTabTextSelectChange(change); } requestLayout(); } public void twsSetTabLeftView(View view) { if (mTabContainer != null) { mTabContainer.twsSetTabLeftView(view); } requestLayout(); } public void twsSetTabRightView(View view) { if (mTabContainer != null) { mTabContainer.twsSetTabRightView(view); } requestLayout(); } public void twsSetTabCustomEnd() { if (mTabContainer != null) { mTabContainer.twsSetTabCustomEnd(); } requestLayout(); } }