/* * 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.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.ObjectAnimator; import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.GradientDrawable.Orientation; import android.text.TextUtils; import android.text.TextUtils.TruncateAt; import android.util.AttributeSet; import android.util.TypedValue; import android.view.ActionMode; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import com.tencent.tws.assistant.app.ActionBar; import com.tencent.tws.assistant.internal.view.menu.ActionMenuPresenter; import com.tencent.tws.assistant.internal.view.menu.ActionMenuView; import com.tencent.tws.assistant.internal.view.menu.MenuBuilder; import com.tencent.tws.assistant.utils.ThemeUtils; import com.tencent.tws.assistant.utils.TwsRippleUtils; import com.tencent.tws.assistant.widget.ToggleButton; import com.tencent.tws.sharelib.R; /** * @hide */ public class ActionBarContextView extends AbsActionBarView implements AnimatorListener { private static final String TAG = "ActionBarContextView"; private CharSequence mTitle; private CharSequence mSubtitle; private Button mClose; private ToggleButton mMulti; private View mCustomView; private LinearLayout mTitleLayout; private TextView mTitleView; private TextView mSubtitleView; private ActionMode mActionMode = null; private int mContextSplitHeight = 0; private int mTitleStyleRes; private int mSubtitleStyleRes; private int mMultiStyleRes; private int mCloseStyleRes; private Drawable mCloseDrawable; private Drawable mSplitBackground; private Animator mCurrentAnimation; private boolean mAnimateInOnLayout; private int mAnimationMode; private static final int ANIMATE_IDLE = 0; private static final int ANIMATE_IN = 1; private static final int ANIMATE_OUT = 2; // tws-start ActionMode BackBtn OnClickListener::2014-8-7 private OnClickListener mActionModeBackOnClickListener = null; // tws-end ActionMode BackBtn OnClickListener::2014-8-7 private boolean firstMeasureTitle = true; public ActionBarContextView(Context context) { this(context, null); } public ActionBarContextView(Context context, AttributeSet attrs) { this(context, attrs, R.attr.actionModeStyle); } public ActionBarContextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActionMode, defStyle, 0); Drawable background = a.getDrawable(R.styleable.ActionMode_backgroundActionMode); int isActionBarTheme = a.getInt(R.styleable.ActionMode_backgroundMode, ThemeUtils.ACTIONBAR_BACKGROUND_NORMAL); boolean isActionBarBgGradient = ThemeUtils.isActionBarBackgroundGradient(context); if (isActionBarBgGradient && isActionBarTheme == ThemeUtils.ACTIONBAR_BACKGROUND_GRADIENT) { final int startColor = a.getColor(R.styleable.ActionMode_gradientBackgroundStartColor, R.color.actionbar_gradient_background_start_color); final int endColor = a.getColor(R.styleable.ActionMode_gradientBackgroundEndColor, R.color.actionbar_gradient_background_end_color); int gradientColors[] = new int[] { startColor, endColor }; background = new GradientDrawable(Orientation.LEFT_RIGHT, gradientColors); } setBackgroundDrawable(background); mTitleStyleRes = a.getResourceId(R.styleable.ActionMode_titleTextStyle, 0); mSubtitleStyleRes = a.getResourceId(R.styleable.ActionMode_subtitleTextStyle, 0); TypedArray aTyped = context.obtainStyledAttributes(attrs, R.styleable.ActionBar, R.attr.actionBarStyle, 0); mMultiStyleRes = aTyped.getResourceId(R.styleable.ActionBar_actionbarrightbtnstyle, 0); mCloseStyleRes = aTyped.getResourceId(R.styleable.ActionBar_actionbarleftbtnstyle, 0); mCloseDrawable = aTyped.getDrawable(R.styleable.ActionBar_homebutton); if (mCloseDrawable == null) { mCloseDrawable = getResources().getDrawable(R.drawable.ic_ab_back); } mContentHeight = a.getLayoutDimension(R.styleable.ActionMode_height, 0); mSplitBackground = a.getDrawable(R.styleable.ActionMode_backgroundSplit); mContextSplitHeight = context.getResources().getDimensionPixelSize(R.dimen.tws_actionbar_split_height); a.recycle(); // tws-start add for ripple::2014-12-21 if (android.os.Build.VERSION.SDK_INT > 17) { setClipChildren(false); setClipToPadding(true); } // tws-end add for ripple::2014-12-21 } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mActionMenuPresenter != null) { mActionMenuPresenter.hideOverflowMenu(); mActionMenuPresenter.hideSubMenus(); } } // tws-start add actionbar0.2 feature::2014-09-28 public ToggleButton getMultiChoiceView() { initTitle(); if (mMulti == null) { mMulti = new ToggleButton(mContext); mMulti.setId(R.id.actionbar_multichoice); mMulti.setTextAppearance(mContext, mMultiStyleRes); // tws-start add for ripple::2014-12-21 boolean bRipple = ThemeUtils.isShowRipple(mContext); if (bRipple) { if (android.os.Build.VERSION.SDK_INT > 15) { mMulti.setBackground(TwsRippleUtils.getDefaultDarkDrawable(getContext())); } else { mMulti.setBackgroundDrawable(TwsRippleUtils.getDefaultDarkDrawable(getContext())); } } else { if (android.os.Build.VERSION.SDK_INT > 15) { mMulti.setBackground(null); } else { mMulti.setBackgroundDrawable(null); } } // tws-end add for ripple::2014-12-21 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, (int) mContext .getResources().getDimension(R.dimen.actionbar_btn_height)); params.gravity = Gravity.CENTER; mMulti.setLayoutParams(params); mMulti.setEllipsize(TruncateAt.END); mMulti.setGravity(Gravity.CENTER); mMulti.setFocusable(false); mMulti.setSingleLine(true); mMulti.setPadding(getResources().getDimensionPixelSize(R.dimen.actionbar_mode_padding), 0, getResources() .getDimensionPixelSize(R.dimen.actionbar_mode_padding), 0); // mMulti.setMinWidth((int)mContext.getResources().getDimension(R.dimen.actionbar_btn_width)); addView(mMulti); } else if (mMulti.getParent() == null) { addView(mMulti); } if (mMulti != null && mMulti.getVisibility() != VISIBLE) { mMulti.setVisibility(VISIBLE); } return mMulti; } public View getCloseView() { initTitle(); if (mClose != null) { mClose.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); mClose.setPadding(getResources().getDimensionPixelSize(R.dimen.actionbar_mode_padding), 0, getResources() .getDimensionPixelSize(R.dimen.actionbar_mode_padding), 0); if (mActionModeBackOnClickListener != null) { mClose.setOnClickListener(mActionModeBackOnClickListener); } else { mClose.setOnClickListener(new OnClickListener() { public void onClick(View v) { mActionMode.finish(); } }); } } return mClose; } public EditText getEditView() { initEdit(); if (mTitleLayout != null) { mTitleLayout.setVisibility(GONE); } if (mEdit != null && mEdit.getVisibility() != VISIBLE) { mEdit.setVisibility(VISIBLE); } return mEdit; } public TextView getTitleView() { return mTitleView; } public TextView getSubtitleView() { initSubTitle(); return mSubtitleView; } public boolean startMiniMode() { return false; } public boolean exitMiniMode() { return false; } // tws-end add actionbar0.2 feature::2014-09-28 @Override public void setSplitActionBar(boolean split) { if (mSplitActionBar != split) { if (mActionMenuPresenter != null) { // Mode is already active; move everything over and adjust the // menu itself. final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); if (!split) { mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); mMenuView.setBackgroundDrawable(null); final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); if (oldParent != null) oldParent.removeView(mMenuView); addView(mMenuView, layoutParams); } else { // Allow full screen width in split mode. mActionMenuPresenter.setWidthLimit(getContext().getResources().getDisplayMetrics().widthPixels, true); // No limit to the item count; use whatever will fit. mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE); // Span the whole width layoutParams.width = LayoutParams.MATCH_PARENT; // layoutParams.height = mContentHeight; layoutParams.height = mContextSplitHeight; mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); mMenuView.setBackgroundDrawable(null); final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); if (oldParent != null) oldParent.removeView(mMenuView); mSplitView.addView(mMenuView, layoutParams); } } super.setSplitActionBar(split); } } public void setContentHeight(int height) { mContentHeight = height; } public void setCustomView(View view) { if (mCustomView != null) { removeView(mCustomView); } mCustomView = view; if (mTitleLayout != null) { removeView(mTitleLayout); mTitleLayout = null; } if (view != null) { addView(view); } requestLayout(); } public void setTitle(CharSequence title) { mTitle = title; initTitle(); firstMeasureTitle = true; requestLayout(); } public void setSubtitle(CharSequence subtitle) { mSubtitle = subtitle; initTitle(); initSubTitle(); } public CharSequence getTitle() { return mTitle; } public CharSequence getSubtitle() { return mSubtitle; } private void initTitle() { if (mTitleLayout == null) { LayoutInflater inflater = LayoutInflater.from(getContext()); /* tws-start::modified com.internal to tws 20121011 */ TypedValue res = new TypedValue(); mContext.getTheme().resolveAttribute(R.attr.twsActionModMenuFontColor, res, true); inflater.inflate(R.layout.action_bar_title_item, this); mTitleLayout = (LinearLayout) getChildAt(getChildCount() - 1); mTitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_title); if (mTitleStyleRes != 0) { mTitleView.setTextAppearance(mContext, mTitleStyleRes); } } mTitleView.setText(mTitle); final boolean hasTitle = !TextUtils.isEmpty(mTitle); mTitleLayout.setVisibility(hasTitle/* || hasSubtitle */? VISIBLE : GONE); if (mTitleLayout.getParent() == null) { // tws-start add actionbar0.2 feature::2014-09-28 final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); // tws-end add actionbar0.2 feature::2014-09-28 mTitleLayout.setLayoutParams(layoutParams); addView(mTitleLayout); } } private void initSubTitle() { if (mSubtitleView == null && mTitleLayout != null) { mSubtitleView = new TextView(mContext); mSubtitleView.setId(R.id.action_bar_subtitle); mSubtitleView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); mSubtitleView.setEllipsize(TruncateAt.END); mSubtitleView.setSingleLine(true); mSubtitleView.setGravity(Gravity.CENTER); mSubtitleView.setVisibility(View.GONE); mTitleLayout.addView(mSubtitleView); } if (mSubtitleStyleRes != 0) { mSubtitleView.setTextAppearance(mContext, mSubtitleStyleRes); } mSubtitleView.setText(mSubtitle); final boolean hasSubtitle = !TextUtils.isEmpty(mSubtitle); mSubtitleView.setVisibility(hasSubtitle ? VISIBLE : GONE); } /* tws-start::add::geofffeng::20120224 */ public void initForMode(final ActionMode mode) { initForMode(mode, ActionBar.DISPLAY_DEFAULT_IMAGE); } public void initForMode(final ActionMode mode, int imageType) { TypedValue res = new TypedValue(); mContext.getTheme().resolveAttribute(R.attr.twsActionModMenuFontColor, res, true); if (mClose == null) { /* tws-start::modified com.internal to tws 20121011 */ // mClose = // (ViewGroup)inflater.inflate(R.layout.action_mode_close_item, // this, false); mClose = new Button(mContext); mClose.setId(R.id.action_mode_close_button); mClose.setTextAppearance(mContext, mCloseStyleRes); mClose.setCompoundDrawablesWithIntrinsicBounds(mCloseDrawable, null, null, null); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, (int) mContext .getResources().getDimension(R.dimen.actionbar_btn_height)); params.gravity = Gravity.CENTER; mClose.setLayoutParams(params); mClose.setEllipsize(TruncateAt.END); mClose.setGravity(Gravity.CENTER); mClose.setFocusable(false); mClose.setSingleLine(true); mClose.setPadding(getResources().getDimensionPixelSize(R.dimen.actionbar_mode_padding_backbtn), 0, getResources().getDimensionPixelSize(R.dimen.actionbar_mode_padding_backbtn), 0); boolean bRipple = ThemeUtils.isShowRipple(mContext); if (bRipple) { if (android.os.Build.VERSION.SDK_INT > 15) { mClose.setBackground(TwsRippleUtils.getDefaultDarkDrawable(getContext())); } else { mClose.setBackgroundDrawable(TwsRippleUtils.getDefaultDarkDrawable(getContext())); } } else { if (android.os.Build.VERSION.SDK_INT > 15) { mClose.setBackground(null); } else { mClose.setBackgroundDrawable(null); } } addView(mClose); } else if (mClose.getParent() == null) { addView(mClose); } // tws-start ActionMode BackBtn OnClickListener::2014-8-7 if (mActionModeBackOnClickListener != null) { mClose.setOnClickListener(mActionModeBackOnClickListener); } else { mClose.setOnClickListener(new OnClickListener() { public void onClick(View v) { mode.finish(); } }); } // tws-end ActionMode BackBtn OnClickListener::2014-8-7 final MenuBuilder menu = (MenuBuilder) mode.getMenu(); if (mActionMenuPresenter != null) { mActionMenuPresenter.dismissPopupMenus(); } /* tws-start::add::geofffeng::20120605 set menucolor to white */ // Log.d("actionbarContextView", "initForMode 2="+res.resourceId); if (res.resourceId > 0) { mActionMenuPresenter = new ActionMenuPresenter(mContext, 0);// tws // actionmod } else { mActionMenuPresenter = new ActionMenuPresenter(mContext);// other // actionmod } mActionMenuPresenter.setReserveOverflow(true); final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); if (!mSplitActionBar && imageType != 0) { menu.addMenuPresenter(mActionMenuPresenter); mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); mMenuView.setBackgroundDrawable(null); addView(mMenuView, layoutParams); } else { // Allow full screen width in split mode. mActionMenuPresenter.setWidthLimit(getContext().getResources().getDisplayMetrics().widthPixels, true); // No limit to the item count; use whatever will fit. mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE); // Span the whole width layoutParams.width = LayoutParams.MATCH_PARENT; // layoutParams.height = mContentHeight; layoutParams.height = mContextSplitHeight; menu.addMenuPresenter(mActionMenuPresenter); mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); mMenuView.setBackgroundDrawable(null); mSplitView.addView(mMenuView, layoutParams); } mAnimateInOnLayout = true; // tws-start alanhuang 20130509 mActionMode = mode; // tws-end alanhuang 20130509 } /* tws-end::add::geofffeng::20120224 */ public void closeMode() { if (mAnimationMode == ANIMATE_OUT) { // Called again during close; just finish what we were doing. return; } if (mClose == null) { killMode(); return; } finishAnimation(); /* tws-start::delete::geofffeng::20121103 */ // mAnimationMode = ANIMATE_OUT; // mCurrentAnimation = makeOutAnimation(); // mCurrentAnimation.start(); mAnimationMode = ANIMATE_OUT; mCurrentAnimation = makeSplitMenuOutAnimation(); if (mCurrentAnimation != null) { mCurrentAnimation.start(); } /* tws-end::delete::geofffeng::20121103 */ } private void finishAnimation() { final Animator a = mCurrentAnimation; if (a != null) { mCurrentAnimation = null; a.end(); } } public void killMode() { finishAnimation(); removeAllViews(); if (mSplitView != null) { mSplitView.removeView(mMenuView); } mCustomView = null; mMenuView = null; mAnimateInOnLayout = false; } @Override public boolean showOverflowMenu() { if (mActionMenuPresenter != null) { return mActionMenuPresenter.showOverflowMenu(); } return false; } @Override public boolean hideOverflowMenu() { if (mActionMenuPresenter != null) { return mActionMenuPresenter.hideOverflowMenu(); } return false; } @Override public boolean isOverflowMenuShowing() { if (mActionMenuPresenter != null) { return mActionMenuPresenter.isOverflowMenuShowing(); } return false; } @Override protected ViewGroup.LayoutParams generateDefaultLayoutParams() { // Used by custom views if they don't supply layout params. Everything // else // added to an ActionBarContextView should have them already. return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); } @Override public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { return new MarginLayoutParams(getContext(), attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // tws-start modify for ripple::2014-12-23 setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getResources().getDimensionPixelSize(R.dimen.tws_action_bar_shadow_height)); // tws-end modify for ripple::2014-12-23 final int widthMode = MeasureSpec.getMode(widthMeasureSpec); if (widthMode != MeasureSpec.EXACTLY) { throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + "with android:layout_width=\"match_parent\" (or fill_parent)"); } final int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (heightMode == MeasureSpec.UNSPECIFIED) { throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + "with android:layout_height=\"wrap_content\""); } final int contentWidth = MeasureSpec.getSize(widthMeasureSpec); int maxHeight = mContentHeight > 0 ? mContentHeight : MeasureSpec.getSize(heightMeasureSpec); final int verticalPadding = getPaddingTop() + getPaddingBottom(); int availableWidth = contentWidth - getPaddingLeft() - getPaddingRight(); final int height = maxHeight - verticalPadding; final int childSpecHeight = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST); if (mClose != null) { // if (mCloseButton != null && mCloseButton.getVisibility() == GONE) // { // mClose.removeView(mCloseButton); // } availableWidth = measureChildView(mClose, availableWidth, childSpecHeight, 0); MarginLayoutParams lp = (MarginLayoutParams) mClose.getLayoutParams(); availableWidth -= lp.leftMargin + lp.rightMargin; } // tws-start add actionbar0.2 feature::2014-09-28 if (mMulti != null) { mMulti.measure(MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY)); } if (mEdit != null) { int closeWidth = mClose != null ? mClose.getMeasuredWidth() : 0; int multiWidth = mMulti != null && !mMulti.getText().equals("") ? mMulti.getMeasuredWidth() : 0; mEdit.setMaxWidth((contentWidth / 2 - Math.max(closeWidth, multiWidth + (int) mContext.getResources().getDimension(R.dimen.actionbar_mode_padding))) * 2); mEdit.measure(MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED)); } // tws-end add actionbar0.2 feature::2014-09-28 if (mMenuView != null && mMenuView.getParent() == this) { availableWidth = measureChildView(mMenuView, availableWidth, childSpecHeight, 0); } // tws-start add actionbar0.2 feature::2014-09-28 if (mTitleLayout != null && mCustomView == null) { // availableWidth = measureChildView(mTitleLayout, availableWidth, // childSpecHeight, 0); int closeWidth = mClose != null ? mClose.getMeasuredWidth() : 0; int multiWidth = mMulti != null && !mMulti.getText().equals("") ? mMulti.getMeasuredWidth() : 0; if (firstMeasureTitle) { if (mTitleView != null) mTitleView.requestLayout(); if (mSubtitleView != null) mSubtitleView.requestLayout(); mTitleLayout.measure(MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY)); firstMeasureTitle = false; } int tagWidth = mTitleLayout.getMeasuredWidth(); if (tagWidth > (contentWidth / 2 - Math.max(closeWidth, multiWidth + (int) mContext.getResources().getDimension(R.dimen.actionbar_mode_padding))) * 2) { tagWidth = (contentWidth / 2 - Math.max(closeWidth, multiWidth + (int) mContext.getResources().getDimension(R.dimen.actionbar_mode_padding))) * 2; } mTitleLayout.measure(MeasureSpec.makeMeasureSpec(tagWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY)); } if (mCustomView != null) { ViewGroup.LayoutParams lp = mCustomView.getLayoutParams(); final int customWidthMode = lp.width != LayoutParams.WRAP_CONTENT ? MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; final int customWidth = lp.width >= 0 ? Math.min(lp.width, availableWidth) : availableWidth; final int customHeightMode = lp.height != LayoutParams.WRAP_CONTENT ? MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; final int customHeight = lp.height >= 0 ? Math.min(lp.height, height) : height; mCustomView.measure(MeasureSpec.makeMeasureSpec(customWidth, customWidthMode), MeasureSpec.makeMeasureSpec(customHeight, customHeightMode)); } // tws-end add actionbar0.2 feature::2014-09-28 if (mContentHeight <= 0) { int measuredHeight = 0; final int count = getChildCount(); for (int i = 0; i < count; i++) { View v = getChildAt(i); int paddedViewHeight = v.getMeasuredHeight() + verticalPadding; if (paddedViewHeight > measuredHeight) { measuredHeight = paddedViewHeight; } } setMeasuredDimension(contentWidth, measuredHeight); } else { setMeasuredDimension(contentWidth, maxHeight); } } private Animator makeInAnimation() { /* tws-start::delete::geofffeng::20121106 */ /* * mClose.setTranslationX(-mClose.getWidth() - ((MarginLayoutParams) * mClose.getLayoutParams()).leftMargin); ObjectAnimator buttonAnimator * = ObjectAnimator.ofFloat(mClose, "translationX", 0); * buttonAnimator.setDuration(200); buttonAnimator.addListener(this); * buttonAnimator.setInterpolator(new DecelerateInterpolator()); * * AnimatorSet set = new AnimatorSet(); AnimatorSet.Builder b = * set.play(buttonAnimator); * * if (mMenuView != null) { final int count = mMenuView.getChildCount(); * if (count > 0) { for (int i = count - 1, j = 0; i >= 0; i--, j++) { * View child = mMenuView.getChildAt(i); child.setScaleY(0); * ObjectAnimator a = ObjectAnimator.ofFloat(child, "scaleY", 0, 1); * a.setDuration(300); b.with(a); } } } */ /* tws-end::delete::geofffeng::20121106 */ return null; } private Animator makeOutAnimation() { /* tws-start::delete::geofffeng::20121106 */ /* * ObjectAnimator buttonAnimator = ObjectAnimator.ofFloat(mClose, * "translationX", -mClose.getWidth() - ((MarginLayoutParams) * mClose.getLayoutParams()).leftMargin); * buttonAnimator.setDuration(200); buttonAnimator.addListener(this); * buttonAnimator.setInterpolator(new DecelerateInterpolator()); * * AnimatorSet set = new AnimatorSet(); AnimatorSet.Builder b = * set.play(buttonAnimator); if (mMenuView != null) { final int count = * mMenuView.getChildCount(); if (count > 0) { for (int i = 0; i < 0; * i++) { View child = mMenuView.getChildAt(i); child.setScaleY(0); * ObjectAnimator a = ObjectAnimator.ofFloat(child, "scaleY", 0); * a.setDuration(300); b.with(a); } } } */ /* tws-end::delete::geofffeng::20121106 */ return null; } private Animator makeSplitMenuInAnimation() { ObjectAnimator animator = null; if (mMenuView != null) { animator = ObjectAnimator.ofFloat(mMenuView, "translationY", mContextSplitHeight, 0); animator.setDuration(200); animator.addListener(this); } return animator; } private Animator makeSplitMenuOutAnimation() { ObjectAnimator animator = null; if (mMenuView != null) { animator = ObjectAnimator.ofFloat(mMenuView, "translationY", 0, mContextSplitHeight); animator.setDuration(200); animator.addListener(this); } return animator; } public void playSplitMenuInAnimation() { if (mAnimateInOnLayout) { mAnimationMode = ANIMATE_IN; mCurrentAnimation = makeSplitMenuInAnimation(); if (mCurrentAnimation != null) { mCurrentAnimation.start(); } mAnimateInOnLayout = false; } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int x = getPaddingLeft(); final int y = getPaddingTop(); final int contentHeight = b - t - getPaddingTop() - getPaddingBottom(); /* * if (mClose != null && mClose.getVisibility() != GONE) { * MarginLayoutParams lp = (MarginLayoutParams) * mClose.getLayoutParams(); x += lp.leftMargin; x += * positionChild(mClose, x, y, contentHeight); x += lp.rightMargin; * * if (mAnimateInOnLayout) { mAnimationMode = ANIMATE_IN; * mCurrentAnimation = makeInAnimation(); mCurrentAnimation.start(); * mAnimateInOnLayout = false; } } */ if (mClose != null && mClose.getVisibility() != GONE) { // MarginLayoutParams lp = (MarginLayoutParams) // mClose.getLayoutParams(); // x += lp.leftMargin; // // tws-start add actionbar0.2 feature::2014-09-28 // x += positionChild(mClose, x, y, contentHeight); // // tws-end add actionbar0.2 feature::2014-09-28 // x += lp.rightMargin; positionChild(mClose, getPaddingLeft(), y, contentHeight); } // tws-start add actionbar0.2 feature::2014-09-28 if (mTitleLayout != null && mCustomView == null) { positionChild(mTitleLayout, mContext.getResources().getDisplayMetrics().widthPixels / 2 - mTitleLayout.getMeasuredWidth() / 2, y, contentHeight); } // if (mMulti != null && mMulti.getVisibility() != GONE) { // positionChild(mMulti, // mContext.getResources().getDisplayMetrics().widthPixels // - mMulti.getMeasuredWidth() // - // (int)mContext.getResources().getDimension(R.dimen.actionbar_mode_padding), // y, contentHeight); // } if (mMulti != null && mMulti.getVisibility() != GONE) { positionChild(mMulti, mContext.getResources().getDisplayMetrics().widthPixels - mMulti.getMeasuredWidth(), y, contentHeight); } if (mEdit != null && mEdit.getVisibility() != GONE) { positionChild(mEdit, mContext.getResources().getDisplayMetrics().widthPixels / 2 - mEdit.getMeasuredWidth() / 2, y, contentHeight); } // tws-end add actionbar0.2 feature::2014-09-28 if (mCustomView != null) { x += positionChild(mCustomView, x, y, contentHeight); } x = r - l - getPaddingRight(); if (mMenuView != null) { // x -= positionChildInverse(mMenuView, x, y, contentHeight); } } @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { if (mAnimationMode == ANIMATE_OUT) { killMode(); } mAnimationMode = ANIMATE_IDLE; } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } @Override public boolean shouldDelayChildPressedState() { return false; } @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { // Action mode started event.setSource(this); event.setClassName(getClass().getName()); event.setPackageName(getContext().getPackageName()); event.setContentDescription(mTitle); } else { super.onInitializeAccessibilityEvent(event); } } // tws-start ActionMode BackBtn OnClickListener::2014-8-7 public void twsSetActionModeBackOnClickListener(OnClickListener clickListener) { mActionModeBackOnClickListener = clickListener; } // tws-end ActionMode BackBtn OnClickListener::2014-8-7 public void setOverflowButtonState(boolean enable) { if (mActionMenuPresenter == null) mActionMenuPresenter = new ActionMenuPresenter(mContext); mActionMenuPresenter.setOverflowButtonState(enable); } // tws-start add overflow click listener::2014-12-18 public void setOverflowClickListener(ActionBar.OverflowClickListener listener) { if (mActionMenuPresenter != null) { mActionMenuPresenter.setOverflowClickListener(listener); } } // tws-end add overflow click listener::2014-12-18 // tws-start add Overflow interface::2015-2-9 public View getOverflowButton() { if (mActionMenuPresenter != null) { return mActionMenuPresenter.getOverflowButton(); } return null; } // tws-end add Overflow interface::2015-2-9 // tws-start add transPopup interface::2015-3-10 public void setIsTransPopup(boolean isTransPopup) { if (mActionMenuPresenter != null) { mActionMenuPresenter.setIsTransPopup(isTransPopup); } } // tws-end add transPopup interface::2015-3-10 // tws-start add PopupMenuRedPoint interface::2015-3-12 public void setPopupMenuMarks(boolean[] isMarks) { if (mActionMenuPresenter != null) { mActionMenuPresenter.setPopupMenuMarks(isMarks); } } // tws-end add PopupMenuRedPoint interface::2015-3-12 public void setPopupTextColors(int[] textColors) { if (mActionMenuPresenter != null) { mActionMenuPresenter.setPopupTextColors(textColors); } } // tws-start add Overflow clickDelay interface::2015-3-19 public void setOverflowDelay(boolean isDelay) { if (mActionMenuPresenter != null) { mActionMenuPresenter.setOverflowDelay(isDelay); } } // tws-end add Overflow clickDelay interface::2015-3-19 }