/* * 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.app; import java.lang.ref.WeakReference; import java.util.ArrayList; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.FragmentTransaction; import android.app.TwsActivity; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; import android.util.Log; import android.util.TypedValue; import android.view.ActionMode; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.accessibility.AccessibilityEvent; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.SpinnerAdapter; import android.widget.TextView; import com.tencent.tws.assistant.app.ActionBar; import com.tencent.tws.assistant.app.TwsDialog; import com.tencent.tws.assistant.internal.view.menu.MenuBuilder; import com.tencent.tws.assistant.internal.view.menu.MenuPopupHelper; import com.tencent.tws.assistant.internal.view.menu.SubMenuBuilder; import com.tencent.tws.assistant.internal.widget.ActionBarContainer; import com.tencent.tws.assistant.internal.widget.ActionBarContextView; import com.tencent.tws.assistant.internal.widget.ActionBarView; import com.tencent.tws.assistant.internal.widget.ScrollingTabContainerView; import com.tencent.tws.assistant.widget.FloatView; import com.tencent.tws.sharelib.R; /** * ActionBarImpl is the ActionBar implementation used by devices of all screen * sizes. If it detects a compatible decor, it will split contextual modes * across both the ActionBarView at the top of the screen and a horizontal * LinearLayout at the bottom which is normally hidden. */ public class ActionBarImpl extends ActionBar { private static final String TAG = "ActionBarImpl"; private Context mContext; private Context mThemedContext; private TwsActivity mActivity = null; private boolean mStatusBarOverlay = false; private TwsDialog mDialog; private FloatView mFloatView; private ActionBarContainer mContainerView; private ActionBarView mActionView; private ActionBarContextView mContextView; private ActionBarContainer mSplitView; private View mContentView; private ScrollingTabContainerView mTabScrollView; private ArrayList<TabImpl> mTabs = new ArrayList<TabImpl>(); private TabImpl mSelectedTab; private int mSavedTabPosition = INVALID_POSITION; ActionModeImpl mActionMode; ActionMode mDeferredDestroyActionMode; ActionMode.Callback mDeferredModeDestroyCallback; private boolean mLastMenuVisibility; private ArrayList<OnMenuVisibilityListener> mMenuVisibilityListeners = new ArrayList<OnMenuVisibilityListener>(); private static final int CONTEXT_DISPLAY_NORMAL = 0; private static final int CONTEXT_DISPLAY_SPLIT = 1; private static final int INVALID_POSITION = -1; private int mContextDisplayMode; private boolean mHasEmbeddedTabs; final Handler mHandler = new Handler(); Runnable mTabSelector; private Animator mCurrentShowAnim; private Animator mCurrentModeAnim; private boolean mShowHideAnimationEnabled; boolean mWasHiddenBeforeMode; public boolean mOverflowButtonState; private ActionBar.SplitBlurListener mSplitBlurListener; private ActionBar.ActionBarHideListener mBarHideListener; private ActionBar.ActionBarShowListener mBarShowListener; private ActionBar.ActionModeFinishListener mModeFinishListener; // tws-start add for action tab::2015-1-7 private boolean mTabHasTitle = false; // tws-end add for action tab::2015-1-7 private boolean mTabButtonEnable; private boolean mTabWaveEnable; private final AnimatorListener mSplitShowAnimListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mSplitView.setVisibility(View.VISIBLE); mContextView.setVisibility(View.VISIBLE); mActionView.setVisibility(View.GONE); mCurrentShowAnim = null; mContainerView.requestLayout(); // tws-start modify ActionMode Blur Listener::2014-12-12 if (mSplitBlurListener != null) mSplitBlurListener.doBlur(); // tws-end modify ActionMode Blur Listener::2014-12-12 } }; private final AnimatorListener mSplitHideAnimListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mSplitView.setVisibility(View.GONE); mContextView.setVisibility(View.GONE); mCurrentShowAnim = null; mContainerView.requestLayout(); if (mCallBack != null) mCallBack.onDestroyActionMode(); if (mModeFinishListener != null) mModeFinishListener.doFinish(); } @Override public void onAnimationStart(Animator animation) { mActionView.setVisibility(View.VISIBLE); } }; private final AnimatorListener mSplitContextHideAnimListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mContextView.setVisibility(View.GONE); mCurrentShowAnim = null; mContainerView.requestLayout(); if (mCallBack != null) mCallBack.onDestroyActionMode(); } @Override public void onAnimationStart(Animator animation) { mActionView.setVisibility(View.VISIBLE); } }; ActionBar.Callback mCallBack = null; @Override public void setActionModeCallback(ActionBar.Callback callback) { mCallBack = callback; } final AnimatorListener mHideListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { if (mContentView != null) { mContentView.setTranslationY(0); mContainerView.setTranslationY(0); } if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { mSplitView.setVisibility(View.GONE); } mActionView.setVisibility(View.GONE); mContainerView.setVisibility(View.GONE); mContainerView.setTransitioning(false); mCurrentShowAnim = null; completeDeferredDestroyActionMode(); // tws-start add showhide actionbar listener::2015-1-14 if (mBarHideListener != null) mBarHideListener.doHideBar(); // tws-end add showhide actionbar listener::2015-1-14 } }; final AnimatorListener mShowListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mCurrentShowAnim = null; mContainerView.requestLayout(); if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { mSplitView.setVisibility(View.VISIBLE); } // tws-start add showhide actionbar listener::2015-1-14 if (mBarShowListener != null) mBarShowListener.doShowBar(); // tws-end add showhide actionbar listener::2015-1-14 } }; final AnimatorListener mHideTopListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { if (mContentView != null) { mContentView.setTranslationY(0); mContainerView.setTranslationY(0); } mContainerView.setVisibility(View.GONE); mContainerView.setTransitioning(false); mCurrentShowAnim = null; completeDeferredDestroyActionMode(); // tws-start add showhide actionbar listener::2015-1-14 if (mBarHideListener != null) mBarHideListener.doHideBar(); // tws-end add showhide actionbar listener::2015-1-14 } }; final AnimatorListener mShowTopListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mCurrentShowAnim = null; mContainerView.requestLayout(); // tws-start add showhide actionbar listener::2015-1-14 if (mBarShowListener != null) mBarShowListener.doShowBar(); // tws-end add showhide actionbar listener::2015-1-14 } }; final AnimatorListener mAlphahideTopListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mContainerView.setVisibility(View.GONE); mCurrentShowAnim = null; completeDeferredDestroyActionMode(); if (mBarHideListener != null) mBarHideListener.doHideBar(); } }; final AnimatorListener mAlphashowTopListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mCurrentShowAnim = null; mContainerView.requestLayout(); if (mBarShowListener != null) mBarShowListener.doShowBar(); } }; final AnimatorListener mAlphahideListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { mSplitView.setVisibility(View.GONE); } mContainerView.setVisibility(View.GONE); mCurrentShowAnim = null; completeDeferredDestroyActionMode(); // tws-start add showhide actionbar listener::2015-1-14 if (mBarHideListener != null) mBarHideListener.doHideBar(); // tws-end add showhide actionbar listener::2015-1-14 } }; final AnimatorListener mAlphashowListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mCurrentShowAnim = null; mContainerView.requestLayout(); if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { mSplitView.setVisibility(View.VISIBLE); } // tws-start add showhide actionbar listener::2015-1-14 if (mBarShowListener != null) mBarShowListener.doShowBar(); // tws-end add showhide actionbar listener::2015-1-14 } }; public ActionBarImpl(TwsActivity activity) { this(activity, false); } public ActionBarImpl(TwsActivity activity, boolean isStatusBarOverlay) { mStatusBarOverlay = isStatusBarOverlay; mActivity = activity; Window window = activity.getWindow(); View decor = window.getDecorView(); init(decor); if (!mActivity.getWindow().hasFeature(Window.FEATURE_ACTION_BAR_OVERLAY)) { mContentView = decor.findViewById(android.R.id.content); } mOverflowButtonState = true; mTabHasTitle = false; } public ActionBarImpl(TwsDialog dialog) { mDialog = dialog; init(dialog.getWindow().getDecorView()); // tws-start modify TwsDialog ActionBar style::2014-02-10 if (mActionView != null) { mActionView .setPadding( 0, (Build.VERSION.SDK_INT > 18 && mContext.getResources().getBoolean( R.bool.config_statusbar_state)) ? TwsActivity.getStatusBarHeight() : 0, 0, 0); } // tws-end modify TwsDialog ActionBar style::2014-02-10 } // tws-start add global float view::2014-09-13 public ActionBarImpl(FloatView floatView) { mFloatView = floatView; init(floatView.getWindow().getDecorView()); } // tws-end add global float view::2014-09-13 private int init(View decor) { mContext = decor.getContext(); /* tws-start::modified com.internal to tws 20121011 */ mActionView = (ActionBarView) decor.findViewById(R.id.tws_action_bar); mContextView = (ActionBarContextView) decor.findViewById(R.id.tws_action_context_bar); mContainerView = (ActionBarContainer) decor.findViewById(R.id.tws_action_bar_container); mSplitView = (ActionBarContainer) decor.findViewById(R.id.tws_split_action_bar); /* tws-start::modified com.internal to tws 20121011 */ if (mActionView == null || mContextView == null || mContainerView == null) { // throw new IllegalStateException(getClass().getSimpleName() + // " can only be used " + // "with a compatible window decor layout"); return 0; } mActionView.setActionbarViewDialog(mDialog); mActionView.setContextView(mContextView); mActionView.setSplitView(mSplitView); mContextView.setSplitView(mSplitView); mContextDisplayMode = mActionView.isSplitActionBar() ? CONTEXT_DISPLAY_SPLIT : CONTEXT_DISPLAY_NORMAL; // Older apps get the home button interaction enabled by default. // Newer apps need to enable it explicitly. setHomeButtonEnabled(mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH); setHasEmbeddedTabs(mContext.getResources().getBoolean(R.bool.action_bar_embed_tabs)); return 1; } public void onConfigurationChanged(Configuration newConfig) { /* tws-start::modified com.internal to tws 20121011 */ setHasEmbeddedTabs(mContext.getResources().getBoolean(R.bool.action_bar_embed_tabs)); /* tws-end::modified com.internal to tws 20121011 */ } private void setHasEmbeddedTabs(boolean hasEmbeddedTabs) { mHasEmbeddedTabs = hasEmbeddedTabs; // Switch tab layout configuration if needed if (!mHasEmbeddedTabs) { mActionView.setEmbeddedTabView(null); mContainerView.setTabContainer(mTabScrollView); } else { mContainerView.setTabContainer(null); mActionView.setEmbeddedTabView(mTabScrollView); } final boolean isInTabMode = getNavigationMode() == NAVIGATION_MODE_TABS; if (mTabScrollView != null) { mTabScrollView.setVisibility(isInTabMode ? View.VISIBLE : View.GONE); } mActionView.setCollapsable(!mHasEmbeddedTabs && isInTabMode); } private void ensureTabsExist() { if (mTabScrollView != null) { return; } // tws-start modify for actionbar tab::2015-1-7 int tabMode = ACTIONBAR_TAB_STANDARD; if (mStatusBarOverlay) { if (mTabHasTitle) { tabMode = ACTIONBAR_TAB_OVERLAY_SECOND; } else { tabMode = ACTIONBAR_TAB_OVERLAY; } } else { if (mTabHasTitle) { tabMode = ACTIONBAR_TAB_STANDARD_SECOND; } else { tabMode = ACTIONBAR_TAB_STANDARD; } } ScrollingTabContainerView tabScroller = new ScrollingTabContainerView(mContext, tabMode, mTabButtonEnable, mTabWaveEnable); // tws-end modify for actionbar tab::2015-1-7 if (mHasEmbeddedTabs) { tabScroller.setVisibility(View.VISIBLE); mActionView.setEmbeddedTabView(tabScroller); } else { tabScroller.setVisibility(getNavigationMode() == NAVIGATION_MODE_TABS ? View.VISIBLE : View.GONE); mContainerView.setTabContainer(tabScroller); } tabScroller.setContextView(mContextView); mTabScrollView = tabScroller; } void completeDeferredDestroyActionMode() { if (mDeferredModeDestroyCallback != null) { mDeferredModeDestroyCallback.onDestroyActionMode(mDeferredDestroyActionMode); mDeferredDestroyActionMode = null; mDeferredModeDestroyCallback = null; } } /** * Enables or disables animation between show/hide states. If animation is * disabled using this method, animations in progress will be finished. * * @param enabled * true to animate, false to not animate. */ public void setShowHideAnimationEnabled(boolean enabled) { mShowHideAnimationEnabled = enabled; if (!enabled && mCurrentShowAnim != null) { mCurrentShowAnim.end(); } } public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) { mMenuVisibilityListeners.add(listener); } public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) { mMenuVisibilityListeners.remove(listener); } public void dispatchMenuVisibilityChanged(boolean isVisible) { if (isVisible == mLastMenuVisibility) { return; } mLastMenuVisibility = isVisible; final int count = mMenuVisibilityListeners.size(); for (int i = 0; i < count; i++) { mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible); } } @Override public void setCustomView(int resId) { setCustomView(LayoutInflater.from(getThemedContext()).inflate(resId, mActionView, false)); } @Override public void setDisplayUseLogoEnabled(boolean useLogo) { setDisplayOptions(useLogo ? DISPLAY_USE_LOGO : 0, DISPLAY_USE_LOGO); } @Override public void setDisplayShowHomeEnabled(boolean showHome) { setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME); } @Override public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) { setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP); } @Override public void setDisplayShowTitleEnabled(boolean showTitle) { setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE); } @Override public void setDisplayShowCustomEnabled(boolean showCustom) { setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM); } @Override public void setHomeButtonEnabled(boolean enable) { /* tws-start::add::geofffeng::20120229 */ mActionView.setActionbarViewActivity(mActivity, false); mActionView.setActionbarViewDialog(mDialog); /* tws-end::add::geofffeng::20120229 */ mActionView.setHomeButtonEnabled(enable); } // tws-start add smooth scroll feature to tab::2014-11-18 public void twsSetPageScroll(int position, float positionOffset) { if (mTabScrollView != null) { mTabScrollView.twsSetPageScroll(position, positionOffset); } } public void twsSetScrollEnd() { if (mTabScrollView != null) { mTabScrollView.twsSetScrollEnd(); } }; // tws-end add smooth scroll feature to tab ::2014-11-18 // tws-start add actionbar0.2 feature::2014-09-28 @Override public void setSplitBlurListener(ActionBar.SplitBlurListener listener) { mSplitBlurListener = listener; } // tws-start add overflow click listener::2014-12-18 @Override public void setOverflowClickListener(ActionBar.OverflowClickListener listener, boolean isActionMode) { if (isActionMode) { mContextView.setOverflowClickListener(listener); } else { mActionView.setOverflowClickListener(listener); } } // tws-end add overflow click listener::2014-12-18 // tws-start add Overflow interface::2015-2-9 @Override public View getOverflowButton(boolean isActionMode) { if (isActionMode) { return mContextView.getOverflowButton(); } else { return mActionView.getOverflowButton(); } } // tws-end add Overflow interface::2015-2-9 // tws-start add transPopup interface::2015-3-10 @Override public void setIsTransPopup(boolean isActionMode, boolean isTransPopup) { if (isActionMode) { mContextView.setIsTransPopup(isTransPopup); } else { mActionView.setIsTransPopup(isTransPopup); } } // tws-end add transPopup interface::2015-3-10 // tws-start add PopupMenuRedPoint interface::2015-3-12 @Override public void setPopupMenuMarks(boolean isActionMode, boolean[] isMarks) { if (isActionMode) { mContextView.setPopupMenuMarks(isMarks); } else { mActionView.setPopupMenuMarks(isMarks); } } // tws-end add PopupMenuRedPoint interface::2015-3-12 // tws-start add PopupMenuText interface::2015-5-18 @Override public void setPopupTextColors(boolean isActionMode, int[] textColors) { if (isActionMode) { mContextView.setPopupTextColors(textColors); } else { mActionView.setPopupTextColors(textColors); } } // tws-end add PopupMenuText interface::2015-5-18 // tws-start add Overflow clickDelay interface::2015-3-19 @Override public void setOverflowDelay(boolean isActionMode, boolean isDelay) { if (isActionMode) { mContextView.setOverflowDelay(isDelay); } else { mActionView.setOverflowDelay(isDelay); } } @Override public void setTopOverflowDelay(boolean isDelay) { mActionView.setTopOverflowDelay(isDelay); } // tws-end add Overflow clickDelay interface::2015-3-19 // tws-start add Menu Config flag::2015-3-31 @Override public void setMenuConfigFlag(boolean isConfig) { mActionView.setMenuConfigFlag(isConfig); } // tws-end add Menu Config flag::2015-3-31 @Override public void enableTabClick(boolean isEnable) { mTabScrollView.enableTabClick(isEnable); } // tws-start add showhide actionbar listener::2015-1-14 @Override public void setActionBarShowListener(ActionBarShowListener listener) { mBarShowListener = listener; } @Override public void setActionBarHideListener(ActionBarHideListener listener) { mBarHideListener = listener; } @Override public void setActionModeFinishListener(ActionModeFinishListener listener) { mModeFinishListener = listener; } @Override public void setActionBarAnimTrans(boolean animTrans) { mActionBarAnimTrans = animTrans; } @Override public void setActionBarHideNoAnim(boolean flag) { mActionBarHideNoAnim = flag; } // tws-end add showhide actionbar listener::2015-1-14 @Override public View getMultiChoiceView() { return getMultiChoiceView(true); } @Override public ImageView getRightButtonView() { return mActionView.getRighButtonView(); } @Override public View getMultiChoiceView(boolean isActionMode) { if (isActionMode) { return mContextView.getMultiChoiceView(); } else { return mActionView.getMultiChoiceView(); } } @Override public View getCloseView() { return getCloseView(true); } @Override public View getCloseView(boolean isActionMode) { if (isActionMode) { return mContextView.getCloseView(); } else { return mActionView.getCloseView(); } } @Override public EditText getEditView() { return getEditView(true); } @Override public EditText getEditView(boolean isActionMode) { if (isActionMode) return mContextView.getEditView(); else return mActionView.getEditView(); } @Override public void setActionBarBGColor(int resId) { mActionView.setBackgroundResource(resId); } @Override public void setActionBarBGColor2(int color) { mActionView.setBackgroundColor(color); } @Override public void setActionModeBGColor(int resId) { mContextView.setBackgroundResource(resId); } @Override public TextView getTitleView(boolean isActionMode) { if (isActionMode) return mContextView.getTitleView(); else return mActionView.getTitleView(); } @Override public TextView getSubtitleView(boolean isActionMode) { if (isActionMode) return mContextView.getSubtitleView(); else return mActionView.getSubtitleView(); } // tws-start ActionBar homeLayout interface::2014-12-26 @Override public ImageButton getActionBarHome() { return mActionView.getActionBarHome(); } @Override public ActionBarView getActionBarView() { return mActionView; } // tws-end ActionBar homeLayout interface::2014-12-26 @Override public boolean startMiniMode() { return mActionView.startMiniMode(); } @Override public boolean exitMiniMode() { return mActionView.exitMiniMode(); } @Override public void setOverflowButtonState(boolean isActionMode, boolean enable) { if (isActionMode) mContextView.setOverflowButtonState(enable); else mActionView.setOverflowButtonState(enable); if (enable) mOverflowButtonState = true; else mOverflowButtonState = false; } @Override public void setTopOverflowButtonState(boolean enable) { mActionView.setTopOverflowButtonState(enable); if (enable) mOverflowButtonState = true; else mOverflowButtonState = false; } // tws-end add actionbar0.2 feature::2014-09-28 // tws-start add actionbar tab wave interface::2015-9-28 @Override public void twsSetPageSelected(int position) { if (mTabScrollView != null) { mTabScrollView.twsSetPageSelected(position); } } @Override public void twsSetTabTextSelectChange(boolean change) { if (mContainerView != null) { mContainerView.twsSetTabTextSelectChange(change); } } @Override public void twsSetTabWaveEnable(boolean enable) { mTabWaveEnable = enable; } @Override public void twsSetTabCustomEnable(boolean enable) { mTabButtonEnable = enable; } @Override public void twsSetTabLeftView(View view) { if (mContainerView != null) { mContainerView.twsSetTabLeftView(view); } } @Override public void twsSetTabRightView(View view) { if (mContainerView != null) { mContainerView.twsSetTabRightView(view); } } @Override public void twsSetTabCustomEnd() { if (mContainerView != null) { mContainerView.twsSetTabCustomEnd(); } } // tws-end add actionbar tab wave interface::2015-9-28 @Override public void setTitle(int resId) { setTitle(mContext.getString(resId)); } @Override public void setSubtitle(int resId) { setSubtitle(mContext.getString(resId)); } public void setSelectedNavigationItem(int position) { switch (mActionView.getNavigationMode()) { case NAVIGATION_MODE_TABS: selectTab(mTabs.get(position)); break; case NAVIGATION_MODE_STANDARD: Log.d(TAG, "the current mode is NAVIGATION_MODE_STANDARD"); break; default: throw new IllegalStateException("setSelectedNavigationIndex not valid for current navigation mode"); } } public void removeAllTabs() { cleanupTabs(); } private void cleanupTabs() { if (mSelectedTab != null) { selectTab(null); } mTabs.clear(); if (mTabScrollView != null) { mTabScrollView.removeAllTabs(); } mSavedTabPosition = INVALID_POSITION; } public void setTitle(CharSequence title) { mActionView.setTitle(title); } public void setSubtitle(CharSequence subtitle) { mActionView.setSubtitle(subtitle); } public void setDisplayOptions(int options) { mActionView.setDisplayOptions(options); } public void setDisplayOptions(int options, int mask) { final int current = mActionView.getDisplayOptions(); mActionView.setDisplayOptions((options & mask) | (current & ~mask)); } public void setBackgroundDrawable(Drawable d) { mContainerView.setPrimaryBackground(d); } public int getBackgroundResId() { return mContainerView.getPrimaryBackgroundResId(); } public void setStackedBackgroundDrawable(Drawable d) { mContainerView.setStackedBackground(d); } public void setSplitBackgroundDrawable(Drawable d) { if (mSplitView != null) { mSplitView.setSplitBackground(d); } } public View getCustomView() { return mActionView.getCustomNavigationView(); } public CharSequence getTitle() { return mActionView.getTitle(); } public CharSequence getSubtitle() { return mActionView.getSubtitle(); } public int getNavigationMode() { return mActionView.getNavigationMode(); } public int getDisplayOptions() { return mActionView.getDisplayOptions(); } /* tws-start::add::geofffeng::20120223 */ public ActionMode startActionMode(ActionMode.Callback callback) { boolean wasHidden = false; if (mActionMode != null) { wasHidden = mWasHiddenBeforeMode; mActionMode.finish(); } // Log.d("actionbarImpl", "startActionMode ="+mActionModeSimple); // Log.d("actionbarImpl", "tws startActionMode 0="+mActionModeSimple); if (mActionModeSimple != ACTIONMODE_DEFAULT) { ActionModeImpl mode = new ActionModeImpl(callback); if (mode.dispatchOnCreate()) { mWasHiddenBeforeMode = false; mode.invalidate(); mActionMode = mode; return mode; } } else { mContextView.killMode(); ActionModeImpl mode = new ActionModeImpl(callback); if (mode.dispatchOnCreate()) { mWasHiddenBeforeMode = !isShowing() || wasHidden; mode.invalidate(); mContextView.initForMode(mode, mImageType); animateToMode(true); if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { // TODO animate this mSplitView.setVisibility(View.VISIBLE); } mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); mActionMode = mode; mIsInActionMode = true; return mode; } } return null; } private int mImageType = DISPLAY_DEFAULT_IMAGE; private int mActionModeSimple = ACTIONMODE_DEFAULT; @Override public void setUserCloseImageType(int imageType) { mImageType = imageType; } @Override public void setActionModeSimple(int modeType) { mActionModeSimple = modeType; } @Override public void actionModeManualFinish() { if (mActionMode != null) mActionMode.finish(); } /* tws-end::add::geofffeng::20120223 */ private void configureTab(Tab tab, int position) { final TabImpl tabi = (TabImpl) tab; final ActionBar.TabListener callback = tabi.getCallback(); if (callback == null) { throw new IllegalStateException("Action Bar Tab must have a Callback"); } tabi.setPosition(position); mTabs.add(position, tabi); final int count = mTabs.size(); for (int i = position + 1; i < count; i++) { mTabs.get(i).setPosition(i); } } @Override public void addTab(Tab tab) { addTab(tab, mTabs.isEmpty()); } @Override public void addTab(Tab tab, int position) { addTab(tab, position, mTabs.isEmpty()); } @Override public void addTab(Tab tab, boolean setSelected) { ensureTabsExist(); if (mTabButtonEnable) { mTabScrollView.addTabInternal(tab, setSelected); } else { mTabScrollView.addTab(tab, setSelected); } configureTab(tab, mTabs.size()); if (setSelected) { selectTab(tab); } } @Override public void addTab(Tab tab, int position, boolean setSelected) { ensureTabsExist(); mTabScrollView.addTab(tab, position, setSelected); configureTab(tab, position); if (setSelected) { selectTab(tab); } } @Override public Tab newTab() { return new TabImpl(); } @Override public void removeTab(Tab tab) { removeTabAt(tab.getPosition()); } @Override public void removeTabAt(int position) { if (mTabScrollView == null) { // No tabs around to remove return; } int selectedTabPosition = mSelectedTab != null ? mSelectedTab.getPosition() : mSavedTabPosition; mTabScrollView.removeTabAt(position); TabImpl removedTab = mTabs.remove(position); if (removedTab != null) { removedTab.setPosition(-1); } final int newTabCount = mTabs.size(); for (int i = position; i < newTabCount; i++) { mTabs.get(i).setPosition(i); } if (selectedTabPosition == position) { selectTab(mTabs.isEmpty() ? null : mTabs.get(Math.max(0, position - 1))); } } @Override public void selectTab(Tab tab) { if (getNavigationMode() != NAVIGATION_MODE_TABS) { mSavedTabPosition = tab != null ? tab.getPosition() : INVALID_POSITION; return; } final FragmentTransaction trans = mActivity.getFragmentManager().beginTransaction().disallowAddToBackStack(); if (mSelectedTab == tab) { if (mSelectedTab != null) { mSelectedTab.getCallback().onTabReselected(mSelectedTab, trans); mTabScrollView.animateToTab(tab.getPosition()); } } else { mTabScrollView.setTabSelected(tab != null ? tab.getPosition() : Tab.INVALID_POSITION); if (mSelectedTab != null) { mSelectedTab.getCallback().onTabUnselected(mSelectedTab, trans); } mSelectedTab = (TabImpl) tab; if (mSelectedTab != null) { mSelectedTab.getCallback().onTabSelected(mSelectedTab, trans); } } if (!trans.isEmpty()) { trans.commit(); } } @Override public Tab getSelectedTab() { return mSelectedTab; } @Override public int getHeight() { return mContainerView.getHeight(); } @Override public void show() { show(true); } void show(boolean markHiddenBeforeMode) { if (mCurrentShowAnim != null) { mCurrentShowAnim.end(); } if (mContainerView.getVisibility() == View.VISIBLE) { if (markHiddenBeforeMode) mWasHiddenBeforeMode = false; return; } mActionView.setVisibility(View.VISIBLE); mContainerView.setVisibility(View.VISIBLE); if (mShowHideAnimationEnabled) { mContainerView.setAlpha(0); AnimatorSet anim = new AnimatorSet(); AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 1)); // tws-start ActionBar Overlay Animation::2014-8-18 if (mContentView != null) { b.with(ObjectAnimator.ofFloat(mContentView, "translationY", -mContainerView.getHeight(), 0)); } // tws-start add showhide actionbar listener::2015-1-14 if (mActionBarAnimTrans) { mContentView = mActivity.getWindow().getDecorView().findViewById(android.R.id.content); b.with(ObjectAnimator.ofFloat(mContentView, "translationY", 0, mContainerView.getHeight() - TwsActivity.getStatusBarHeight())); } // tws-end add showhide actionbar listener::2015-1-14 mContainerView.setTranslationY(-mContainerView.getHeight()); b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", 0)); // tws-end ActionBar Overlay Animation::2014-8-18 if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { mSplitView.setAlpha(0); mSplitView.setVisibility(View.VISIBLE); mSplitView.setTranslationY(mSplitView.getHeight()); b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 1)); b.with(ObjectAnimator.ofFloat(mSplitView, "translationY", 0)); } anim.addListener(mShowListener); mCurrentShowAnim = anim; anim.start(); } else { mContainerView.setAlpha(1); mContainerView.setTranslationY(0); mShowListener.onAnimationEnd(null); } } @Override public void hide() { if (mCurrentShowAnim != null) { mCurrentShowAnim.end(); } if (mContainerView.getVisibility() == View.GONE) { return; } if (mContextView.getVisibility() == View.VISIBLE) { return; } if (mShowHideAnimationEnabled) { mContainerView.setAlpha(1); if (mActionBarHideNoAnim) { mContainerView.setAlpha(0); } mContainerView.setTransitioning(true); AnimatorSet anim = new AnimatorSet(); AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 0)); // tws-start ActionBar Overlay Animation::2014-8-18 if (mContentView != null) { b.with(ObjectAnimator.ofFloat(mContentView, "translationY", 0, -mContainerView.getHeight())); } // tws-start add showhide actionbar listener::2015-1-14 if (mActionBarAnimTrans) { mContentView = mActivity.getWindow().getDecorView().findViewById(android.R.id.content); b.with(ObjectAnimator.ofFloat(mContentView, "translationY", 0, -(mContainerView.getHeight() - TwsActivity.getStatusBarHeight()))); } // tws-end add showhide actionbar listener::2015-1-14 b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", -mContainerView.getHeight())); // tws-end ActionBar Overlay Animation::2014-8-18 if (mSplitView != null && mSplitView.getVisibility() == View.VISIBLE) { mSplitView.setAlpha(1); if (mActionBarHideNoAnim) { mSplitView.setAlpha(0); mActionBarHideNoAnim = false; } b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 0)); mSplitView.setTranslationY(0); b.with(ObjectAnimator.ofFloat(mSplitView, "translationY", mSplitView.getHeight())); } anim.addListener(mHideListener); mCurrentShowAnim = anim; anim.start(); } else { mHideListener.onAnimationEnd(null); } } @Override public void topActionbar_show() { if (mCurrentShowAnim != null) { mCurrentShowAnim.end(); } mContainerView.setVisibility(View.VISIBLE); if (mShowHideAnimationEnabled) { mContainerView.setAlpha(0); mContainerView.setTransitioning(true); AnimatorSet anim = new AnimatorSet(); AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 1)); mContainerView.setTranslationY(-mContainerView.getHeight()); b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", 0)); anim.addListener(mShowTopListener); mCurrentShowAnim = anim; anim.start(); } else { mContainerView.setAlpha(1); mContainerView.setTranslationY(0); mShowTopListener.onAnimationEnd(null); } } @Override public void topActionbar_hide() { if (mCurrentShowAnim != null) { mCurrentShowAnim.end(); } if (mShowHideAnimationEnabled) { mContainerView.setAlpha(1); mContainerView.setTransitioning(true); AnimatorSet anim = new AnimatorSet(); AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 0)); b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", -mContainerView.getHeight())); anim.addListener(mHideTopListener); mCurrentShowAnim = anim; anim.start(); } else { mHideTopListener.onAnimationEnd(null); } } @Override public void topActionbar_alphashow() { if (mCurrentShowAnim != null) { mCurrentShowAnim.end(); } mContainerView.setVisibility(View.VISIBLE); if (mShowHideAnimationEnabled) { mContainerView.setAlpha(0); AnimatorSet anim = new AnimatorSet(); AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 1)); anim.addListener(mAlphashowTopListener); mCurrentShowAnim = anim; anim.start(); } else { mContainerView.setAlpha(1); mAlphashowTopListener.onAnimationEnd(null); } } @Override public void topActionbar_alphahide() { if (mCurrentShowAnim != null) { mCurrentShowAnim.end(); } if (mShowHideAnimationEnabled) { mContainerView.setAlpha(1); AnimatorSet anim = new AnimatorSet(); AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 0)); anim.addListener(mAlphahideTopListener); mCurrentShowAnim = anim; anim.start(); } else { mAlphahideTopListener.onAnimationEnd(null); } } @Override public void actionbar_alphashow() { if (mCurrentShowAnim != null) { mCurrentShowAnim.end(); } mContainerView.setVisibility(View.VISIBLE); if (mShowHideAnimationEnabled) { mContainerView.setAlpha(0); AnimatorSet anim = new AnimatorSet(); AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 1)); if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { mSplitView.setAlpha(0); mSplitView.setVisibility(View.VISIBLE); b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 1)); } anim.addListener(mAlphashowListener); mCurrentShowAnim = anim; anim.start(); } else { mContainerView.setAlpha(1); mAlphashowListener.onAnimationEnd(null); } } @Override public void actionbar_alphahide() { if (mCurrentShowAnim != null) { mCurrentShowAnim.end(); } if (mShowHideAnimationEnabled) { mContainerView.setAlpha(1); AnimatorSet anim = new AnimatorSet(); AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 0)); if (mSplitView != null && mSplitView.getVisibility() == View.VISIBLE) { mSplitView.setAlpha(1); b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 0)); } anim.addListener(mAlphahideListener); mCurrentShowAnim = anim; anim.start(); } else { mAlphahideListener.onAnimationEnd(null); } } /* tws-start::add::geofffeng::20120208 */ final AnimatorListener twsSplitShowListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mCurrentShowAnim = null; mSplitView.setVisibility(View.VISIBLE); mContainerView.requestLayout(); } }; @Override public void setHomeButtonEnabledQQ(boolean enable) { setHomeButtonIconEnabled(enable); mActionView.setActionbarViewActivity(mActivity, false); mActionView.setActionbarViewDialog(mDialog); } @Override public void setHomeButtonIconEnabled(boolean enable) { if (enable) { setDisplayShowHomeEnabled(true); setHomeButtonEnabled(true); setDisplayHomeAsUpEnabled(false); } mActionView.setActionbarViewActivity(mActivity, true); mActionView.setActionbarViewDialog(mDialog); } /* * @Override public void setActionMenuItemCount(int itemCount) { * if(mActionView!=null) mActionView.setActionMenuItemCount(itemCount); * if(mContextView!=null) mContextView.setActionMenuItemCount(itemCount); } */ @Override public void setEmbededTabEnable(boolean tabEnable) { setHasEmbeddedTabs(tabEnable); } @Override public void splitActionbar_Init(boolean isShow) { // default show the actionbar if (!isShow) { if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { mSplitView.setVisibility(View.GONE); } mCurrentShowAnim = null; completeDeferredDestroyActionMode(); } } @Override public boolean splitActionbarIsHide() { if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT && mSplitView.getVisibility() == View.GONE) { return true; } return false; } @Override public void splitActionbar_show() { // Log.d("actionbarImpl","splitActionbar_show-----------------------------------1"); if (mCurrentShowAnim != null) { mCurrentShowAnim.end(); } if (mSplitView != null && mSplitView.getVisibility() == View.VISIBLE) { return; } /* tws-start::change 2012-11-13 */ // Log.d("actionbarImpl","splitActionbar_show-----------------------------------"); final int animaHeight = (int) mContext.getResources().getDimension(R.dimen.tws_actionbar_split_height); if (mSplitView != null && mSplitView.getVisibility() == View.GONE) { AnimatorSet anim = new AnimatorSet(); AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mSplitView, "translationY", -animaHeight, 0)); anim.addListener(twsSplitShowListener); anim.setDuration(200); mCurrentShowAnim = anim; anim.start(); } } @Override public void splitActionbar_hide() { // Log.d("actionbarImpl","splitActionbar_hide-----------------------------------1"); if (mCurrentShowAnim != null) { mCurrentShowAnim.end(); } if (mContainerView.getVisibility() == View.GONE) { return; } /* tws-start::change 2012-11-13 */ // Log.d("actionbarImpl","splitActionbar_hide-----------------------------------"); final int animaHeight = (int) mContext.getResources().getDimension(R.dimen.tws_actionbar_split_height); if (mSplitView != null && mSplitView.getVisibility() == View.VISIBLE) { AnimatorSet anim = new AnimatorSet(); AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mSplitView, "translationY", 0, animaHeight)); anim.addListener(mSplitHideAnimListener); anim.setDuration(200); mCurrentShowAnim = anim; anim.start(); } } /* tws-end::add::geofffeng::20120208 */ public boolean isShowing() { return mContainerView.getVisibility() == View.VISIBLE; } void animateToMode(boolean toActionMode) { if (mCurrentShowAnim != null) { mCurrentShowAnim.end(); } AnimatorSet anim = new AnimatorSet(); final int animaHeight = (int) mContext.getResources().getDimension(R.dimen.tws_actionbar_split_height); if (toActionMode) { show(false); mContextView.setVisibility(View.VISIBLE); AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContextView, "translationY", -animaHeight, 0)); if (mSplitView != null) { if (mContextDisplayMode != CONTEXT_DISPLAY_SPLIT) { mSplitView.setVisibility(View.VISIBLE); mSplitView.setTranslationY(animaHeight); b.with(ObjectAnimator.ofFloat(mSplitView, "translationY", 0)); } else { mContextView.playSplitMenuInAnimation(); } } anim.addListener(mSplitShowAnimListener); } else { AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContextView, "translationY", 0, -animaHeight)); if (mSplitView != null) { if (mContextDisplayMode != CONTEXT_DISPLAY_SPLIT) { mSplitView.setTranslationY(0); b.with(ObjectAnimator.ofFloat(mSplitView, "translationY", animaHeight)); anim.addListener(mSplitHideAnimListener); } else { anim.addListener(mSplitContextHideAnimListener); if (splitActionbarIsHide()) { splitActionbar_show(); } } } } mActionView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); mContextView.animateToVisibility(toActionMode ? View.VISIBLE : View.GONE); if (mTabScrollView != null && !mActionView.hasEmbeddedTabs() && mActionView.isCollapsed()) { mTabScrollView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); } anim.setDuration(200); mCurrentShowAnim = anim; anim.start(); } public Context getThemedContext() { if (mThemedContext == null) { TypedValue outValue = new TypedValue(); Resources.Theme currentTheme = mContext.getTheme(); currentTheme.resolveAttribute(R.attr.actionBarWidgetTheme, outValue, true); final int targetThemeRes = outValue.resourceId; if (targetThemeRes != 0 && mContext.getThemeResId() != targetThemeRes) { mThemedContext = new ContextThemeWrapper(mContext, targetThemeRes); } else { mThemedContext = mContext; } } return mThemedContext; } /** * @hide */ public class ActionModeImpl extends ActionMode implements MenuBuilder.Callback { private ActionMode.Callback mCallback; private MenuBuilder mMenu; private WeakReference<View> mCustomView; public ActionModeImpl(ActionMode.Callback callback) { mCallback = callback; mMenu = new MenuBuilder(getThemedContext()).setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); mMenu.setCallback(this); } @Override public MenuInflater getMenuInflater() { return new MenuInflater(getThemedContext()); } @Override public Menu getMenu() { return mMenu; } @Override public void finish() { if (mActionMode != this) { // Not the active action mode - no-op return; } // If we were hidden before the mode was shown, defer the onDestroy // callback until the animation is finished and associated relayout // is about to happen. This lets apps better anticipate visibility // and layout behavior. if (mWasHiddenBeforeMode) { mDeferredDestroyActionMode = this; mDeferredModeDestroyCallback = mCallback; } else { mCallback.onDestroyActionMode(this); } mCallback = null; animateToMode(false); // Clear out the context mode views after the animation finishes mContextView.closeMode(); mActionView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); mActionMode = null; if (mWasHiddenBeforeMode) { hide(); } mIsInActionMode = false; } @Override public void invalidate() { mMenu.stopDispatchingItemsChanged(); try { mCallback.onPrepareActionMode(this, mMenu); } finally { mMenu.startDispatchingItemsChanged(); } } public boolean dispatchOnCreate() { mMenu.stopDispatchingItemsChanged(); try { return mCallback.onCreateActionMode(this, mMenu); } finally { mMenu.startDispatchingItemsChanged(); } } @Override public void setCustomView(View view) { mContextView.setCustomView(view); mCustomView = new WeakReference<View>(view); } @Override public void setSubtitle(CharSequence subtitle) { mContextView.setSubtitle(subtitle); } @Override public void setTitle(CharSequence title) { mContextView.setTitle(title); } @Override public void setTitle(int resId) { setTitle(mContext.getResources().getString(resId)); } @Override public void setSubtitle(int resId) { setSubtitle(mContext.getResources().getString(resId)); } @Override public CharSequence getTitle() { return mContextView.getTitle(); } @Override public CharSequence getSubtitle() { return mContextView.getSubtitle(); } @Override public View getCustomView() { return mCustomView != null ? mCustomView.get() : null; } public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { if (mCallback != null) { return mCallback.onActionItemClicked(this, item); } else { return false; } } public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { } public boolean onSubMenuSelected(SubMenuBuilder subMenu) { if (mCallback == null) { return false; } if (!subMenu.hasVisibleItems()) { return true; } new MenuPopupHelper(getThemedContext(), subMenu).show(); return true; } public void onCloseSubMenu(SubMenuBuilder menu) { } public void onMenuModeChange(MenuBuilder menu) { if (mCallback == null) { return; } invalidate(); mContextView.showOverflowMenu(); } } /** * @hide */ public class TabImpl extends ActionBar.Tab { private ActionBar.TabListener mCallback; private Object mTag; private Drawable mIcon; private CharSequence mText; private CharSequence mContentDesc; private int mPosition = -1; private View mCustomView; @Override public Object getTag() { return mTag; } @Override public Tab setTag(Object tag) { mTag = tag; return this; } public ActionBar.TabListener getCallback() { return mCallback; } @Override public Tab setTabListener(ActionBar.TabListener callback) { mCallback = callback; return this; } @Override public View getCustomView() { return mCustomView; } @Override public Tab setCustomView(View view) { mCustomView = view; if (mPosition >= 0) { mTabScrollView.updateTab(mPosition); } return this; } @Override public Tab setCustomView(int layoutResId) { return setCustomView(LayoutInflater.from(getThemedContext()).inflate(layoutResId, null)); } @Override public Drawable getIcon() { return mIcon; } @Override public int getPosition() { return mPosition; } public void setPosition(int position) { mPosition = position; } @Override public CharSequence getText() { return mText; } @Override public Tab setIcon(Drawable icon) { mIcon = icon; if (mPosition >= 0) { mTabScrollView.updateTab(mPosition); } return this; } @Override public Tab setIcon(int resId) { return setIcon(mContext.getResources().getDrawable(resId)); } @Override public Tab setText(CharSequence text) { mText = text; if (mPosition >= 0) { mTabScrollView.updateTab(mPosition); } return this; } @Override public Tab setText(int resId) { return setText(mContext.getResources().getText(resId)); } @Override public void select() { selectTab(this); } @Override public Tab setContentDescription(int resId) { return setContentDescription(mContext.getResources().getText(resId)); } @Override public Tab setContentDescription(CharSequence contentDesc) { mContentDesc = contentDesc; if (mPosition >= 0) { mTabScrollView.updateTab(mPosition); } return this; } @Override public CharSequence getContentDescription() { return mContentDesc; } } @Override public void setCustomView(View view) { mActionView.setCustomNavigationView(view); } @Override public void setCustomView(View view, LayoutParams layoutParams) { view.setLayoutParams(layoutParams); mActionView.setCustomNavigationView(view); } @Override public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { } @Override public int getSelectedNavigationIndex() { switch (mActionView.getNavigationMode()) { case NAVIGATION_MODE_TABS: return mSelectedTab != null ? mSelectedTab.getPosition() : -1; default: return -1; } } @Override public int getNavigationItemCount() { switch (mActionView.getNavigationMode()) { case NAVIGATION_MODE_TABS: return mTabs.size(); default: return 0; } } @Override public int getTabCount() { return mTabs.size(); } @Override public void setNavigationMode(int mode) { final int oldMode = mActionView.getNavigationMode(); switch (oldMode) { case NAVIGATION_MODE_TABS: mSavedTabPosition = getSelectedNavigationIndex(); selectTab(null); mTabScrollView.setVisibility(View.GONE); break; } mActionView.setNavigationMode(mode); switch (mode) { case NAVIGATION_MODE_TABS: ensureTabsExist(); mTabScrollView.setVisibility(View.VISIBLE); if (mSavedTabPosition != INVALID_POSITION) { setSelectedNavigationItem(mSavedTabPosition); mSavedTabPosition = INVALID_POSITION; } break; } mActionView.setCollapsable(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs); } @Override public Tab getTabAt(int index) { return mTabs.get(index); } @Override public void setIcon(int resId) { } @Override public void setIcon(Drawable icon) { } @Override public void setLogo(int resId) { } @Override public void setLogo(Drawable logo) { } public boolean isMultiMode() { return mContextView.getVisibility() == View.VISIBLE; } // tws-start BottomBar Height::2014-7-23 public int getBottomBarHeight() { int height = mContext.getResources().getDimensionPixelSize(R.dimen.tws_actionbar_split_height); return height; } // tws-end BottomBar Height::2014-7-23 // tws-start ActionBar Back Button::2014-7-30 public void twsSetBackOnclickEnabled(boolean enabled) { mActionView.twsSetBackOnclickEnabled(enabled); } public boolean twsGetBackOnclickEnabled() { return mActionView.twsGetBackOnclickEnabled(); } // tws-end ActionBar Back Button::2014-7-30 // tws-start ActionMode BackBtn OnClickListener::2014-8-7 public void twsSetActionModeBackOnClickListener(OnClickListener clickListener) { mContextView.twsSetActionModeBackOnClickListener(clickListener); } // tws-end ActionMode BackBtn OnClickListener::2014-8-7 // tws-start add for actionbar tab::2015-1-7 public void twsSetActionBarTabHasTitle(boolean hasTitle) { mTabHasTitle = hasTitle; } // tws-end add for actionbar tab::2015-1-7 }