/* * 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.app.TwsActivity; import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; import android.text.TextUtils.TruncateAt; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.view.Window; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; 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.ActionMenuItem; 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.internal.view.menu.MenuItemImpl; import com.tencent.tws.assistant.internal.view.menu.MenuPresenter; import com.tencent.tws.assistant.internal.view.menu.MenuView; import com.tencent.tws.assistant.internal.view.menu.SubMenuBuilder; 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 ActionBarView extends AbsActionBarView { private static final String TAG = "ActionBarView"; /** * Display options applied by default yongchen modify for plugin theme */ public static final int DISPLAY_DEFAULT = 0xb; /** * Display options that require re-layout as opposed to a simple invalidate */ private static final int DISPLAY_RELAYOUT_MASK = ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO | ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_TITLE; private static final int DEFAULT_CUSTOM_GRAVITY = Gravity.LEFT | Gravity.CENTER_VERTICAL; private int mNavigationMode; private int mDisplayOptions = -1; private CharSequence mTitle; private CharSequence mSubtitle; private ImageButton mHomeLayout; private LinearLayout mTitleLayout; private TextView mTitleView; private TextView mSubtitleView; private ScrollingTabContainerView mTabScrollView; private View mCustomNavView; private int mItemPadding; private int mTitleStyleRes; private int mSubtitleStyleRes; private int mMultiStyleRes; private int mCloseStyleRes; private int mHomeBGStyleRes; private int mHomeSrcStyleRes; private boolean mUserTitle; private boolean mIncludeTabs; private boolean mIsCollapsable; private boolean mIsCollapsed; private MenuBuilder mOptionsMenu; private ActionBarContextView mContextView; private Runnable mTabSelector; private ExpandedActionViewMenuPresenter mExpandedMenuPresenter; Window.Callback mWindowCallback; // tws-start add actionbar0.2 feature::2014-09-28 private boolean firstMeasureTitle = true; private Button mClose; private ToggleButton mMulti; private ImageButton mRightButton; // rigth button private ActionMenuItem mLogoNavItem; // tws-end add actionbar0.2 feature::2014-09-28 // tws-start ActionBar Back Button::2014-7-30 private boolean mIsBackClick = true; // tws-end ActionBar Back Button::2014-7-30 /* tws-start::add::geofffeng::20120219 */ private Activity mActivity = null; private TwsDialog mTwsDialog = null; private boolean homeSendMessage = false; // tws-start ActionBar mini mode::2014-10-14 private boolean isMiniMode; // tws-end ActionBar mini mode::2014-10-14 public boolean mIsMarksPointFlag; private boolean mIsMenuConfigFlag; private boolean mIsRunInPlugins; public void setActionbarViewActivity(Activity fatherActivity, boolean sendMessage) { mActivity = fatherActivity; homeSendMessage = sendMessage; /* tws-start::modified home Background 20121114 */ if (mActivity != null) { TypedValue out = new TypedValue(); mContext.getTheme().resolveAttribute(R.attr.twsHomeAsUp, out, true); if (out.resourceId > 0) { // mHomeLayout.setBackgroundDrawable(mContext.getResources().getDrawable(out.resourceId)); // tws-start add for ripple::2014-12-21 boolean bRipple = ThemeUtils.isShowRipple(mContext); if (bRipple) { if (android.os.Build.VERSION.SDK_INT > 15) { mHomeLayout.setBackground(TwsRippleUtils.getHasContentDrawable(getContext(), mHomeBGStyleRes)); } else { mHomeLayout.setBackgroundDrawable(TwsRippleUtils.getHasContentDrawable(getContext(), mHomeBGStyleRes)); } } else { mHomeLayout.setBackgroundResource(mHomeBGStyleRes); } // tws-end add for ripple::2014-12-21 } } /* tws-end::modified home Background 20121114 */ } /* tws-end::add::geofffeng::20120219 */ public void setActionbarViewDialog(TwsDialog dialog) { mTwsDialog = dialog; } private final OnClickListener mUpClickListener = new OnClickListener() { public void onClick(View v) { // tws-start ActionBar Back Button::2014-7-30 if (mIsBackClick) { if (mActivity != null) { mActivity.onBackPressed(); } if (mTwsDialog != null) { mTwsDialog.dismiss(); } } else { mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mLogoNavItem); } // tws-end ActionBar Back Button::2014-7-30 } }; public ActionBarView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActionBar, R.attr.actionBarStyle, 0); mNavigationMode = a.getInt(R.styleable.ActionBar_navigationMode, ActionBar.NAVIGATION_MODE_STANDARD); // yongchen modify for plugin theme mIsRunInPlugins = false; mTitleStyleRes = a.getResourceId(R.styleable.ActionBar_titleTextStyle, 0); mIsRunInPlugins = 0 == mTitleStyleRes ? true : false; if (mIsRunInPlugins) { mTitleStyleRes = R.style.TextAppearance_tws_Second_twsTextLargerLightTitle_ActionBarTitle; mSubtitleStyleRes = R.style.TextAppearance_tws_Second_twsTextSmallLightTitle; mItemPadding = getResources().getDimensionPixelSize(R.dimen.actionbar_itemPadding); mMultiStyleRes = R.style.TextAppearance_tws_Second_twsTextLargerLightTitleRightButton; mCloseStyleRes = R.style.TextAppearance_tws_Second_twsTextLargerLightTitleLeftButton; mHomeBGStyleRes = R.color.transparent; mHomeSrcStyleRes = R.drawable.ic_ab_back; } else { mSubtitleStyleRes = a.getResourceId(R.styleable.ActionBar_subtitleTextStyle, 0); mItemPadding = a.getDimensionPixelOffset(R.styleable.ActionBar_itemPadding, 0); mMultiStyleRes = a.getResourceId(R.styleable.ActionBar_actionbarrightbtnstyle, 0); mCloseStyleRes = a.getResourceId(R.styleable.ActionBar_actionbarleftbtnstyle, 0); mHomeBGStyleRes = a.getResourceId(R.styleable.ActionBar_homebackground, 0); mHomeSrcStyleRes = a.getResourceId(R.styleable.ActionBar_homebutton, 0); } initHome(context); setDisplayOptions(a.getInt(R.styleable.ActionBar_displayOptions, DISPLAY_DEFAULT)); final int customNavId = a.getResourceId(R.styleable.ActionBar_customNavigationLayout, 0); if (customNavId != 0) { final LayoutInflater inflater = LayoutInflater.from(context); mCustomNavView = (View) inflater.inflate(customNavId, this, false); mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD; setDisplayOptions(mDisplayOptions | ActionBar.DISPLAY_SHOW_CUSTOM); } a.recycle(); mLogoNavItem = new ActionMenuItem(context, 0, android.R.id.home, 0, 0, mTitle); // 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 protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mTitleView = null; mSubtitleView = null; firstMeasureTitle = true; if (mTitleLayout != null && mTitleLayout.getParent() == this) { removeView(mTitleLayout); } mTitleLayout = null; if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0) { initTitle(); initSubTitle(); } if (mTabScrollView != null && mIncludeTabs) { ViewGroup.LayoutParams lp = mTabScrollView.getLayoutParams(); if (lp != null) { lp.width = LayoutParams.WRAP_CONTENT; lp.height = LayoutParams.MATCH_PARENT; } mTabScrollView.setAllowCollapse(true); } } /** * Set the window callback used to invoke menu items; used for dispatching * home button presses. * * @param cb * Window callback to dispatch to */ public void setWindowCallback(Window.Callback cb) { mWindowCallback = cb; } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); removeCallbacks(mTabSelector); if (mActionMenuPresenter != null) { mActionMenuPresenter.hideOverflowMenu(); mActionMenuPresenter.hideSubMenus(); } } @Override public boolean shouldDelayChildPressedState() { return false; } @Override public void setSplitActionBar(boolean splitActionBar) { if (mSplitActionBar != splitActionBar) { if (mMenuView != null) { final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); if (oldParent != null) { oldParent.removeView(mMenuView); } if (splitActionBar) { if (mSplitView != null) { mSplitView.addView(mMenuView); } } else { addView(mMenuView); } } if (mSplitView != null) { mSplitView.setVisibility(splitActionBar ? VISIBLE : GONE); } super.setSplitActionBar(splitActionBar); } } public boolean isSplitActionBar() { return mSplitActionBar; } public boolean hasEmbeddedTabs() { return mIncludeTabs; } public void setEmbeddedTabView(ScrollingTabContainerView tabs) { if (mTabScrollView != null) { removeView(mTabScrollView); } mTabScrollView = tabs; mIncludeTabs = tabs != null; if (mIncludeTabs && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) { addView(mTabScrollView); ViewGroup.LayoutParams lp = mTabScrollView.getLayoutParams(); lp.width = LayoutParams.WRAP_CONTENT; lp.height = LayoutParams.MATCH_PARENT; tabs.setAllowCollapse(true); } } public void setMenu(Menu menu, MenuPresenter.Callback cb) { // mSplitActionBar = true; if (menu == mOptionsMenu) return; if (mOptionsMenu != null) { mOptionsMenu.removeMenuPresenter(mActionMenuPresenter); mOptionsMenu.removeMenuPresenter(mExpandedMenuPresenter); } MenuBuilder builder = (MenuBuilder) menu; mOptionsMenu = builder; if (mOptionsMenu.size() == 0 && !mIsMenuConfigFlag) return; if (mMenuView != null) { final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); if (oldParent != null) { oldParent.removeView(mMenuView); } } if (mActionMenuPresenter == null) { mActionMenuPresenter = new ActionMenuPresenter(mContext);// geofffeng mActionMenuPresenter.setCallback(cb); /* tws-start::modified com.internal to tws 20121011 */ // mActionMenuPresenter.setId(android.R.id.action_menu_presenter); mActionMenuPresenter.setId(R.id.action_menu_presenter); /* tws-end::modified com.internal to tws 20121011 */ mExpandedMenuPresenter = new ExpandedActionViewMenuPresenter(); } ActionMenuView menuView; final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); if (!mSplitActionBar) { /* tws-start::modified com.internal to tws 20121011 */ mActionMenuPresenter.setExpandedActionViewsExclusive(getResources().getBoolean( R.bool.action_bar_expanded_action_views_exclusive)); /* tws-end::modified com.internal to tws 20121011 */ configPresenters(builder); menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); final ViewGroup oldParent = (ViewGroup) menuView.getParent(); if (oldParent != null && oldParent != this) { oldParent.removeView(menuView); } // mSplitView.addView(menuView, layoutParams); // mSplitView.setVisibility(VISIBLE); addView(menuView, layoutParams); } else { mActionMenuPresenter.setExpandedActionViewsExclusive(false); // 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; configPresenters(builder); menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); if (mSplitView != null) { final ViewGroup oldParent = (ViewGroup) menuView.getParent(); if (oldParent != null && oldParent != mSplitView) { oldParent.removeView(menuView); } menuView.setVisibility(getAnimatedVisibility()); layoutParams.height = mContext.getResources().getDimensionPixelSize(R.dimen.tws_actionbar_split_height); if (menuView != null && menuView.getChildCount() != 0) { mSplitView.addView(menuView, layoutParams); mSplitView.setVisibility(VISIBLE); } else { mSplitView.setVisibility(GONE); } } else { // We'll add this later if we missed it this time. menuView.setLayoutParams(layoutParams); } } mMenuView = menuView; } private void configPresenters(MenuBuilder builder) { if (builder != null) { builder.addMenuPresenter(mActionMenuPresenter); builder.addMenuPresenter(mExpandedMenuPresenter); } else { mActionMenuPresenter.initForMenu(mContext, null); mExpandedMenuPresenter.initForMenu(mContext, null); mActionMenuPresenter.updateMenuView(true); mExpandedMenuPresenter.updateMenuView(true); } } public boolean hasExpandedActionView() { return mExpandedMenuPresenter != null && mExpandedMenuPresenter.mCurrentExpandedItem != null; } public void collapseActionView() { final MenuItemImpl item = mExpandedMenuPresenter == null ? null : mExpandedMenuPresenter.mCurrentExpandedItem; if (item != null) { item.collapseActionView(); } } public void setCustomNavigationView(View view) { final boolean showCustom = (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0; // tws-start geofffeng 20130327 if (showCustom) { mUserTitle = true; } // tws-end geofffeng 20130327 if (mCustomNavView != null && showCustom) { removeView(mCustomNavView); } mCustomNavView = view; if (mCustomNavView != null && showCustom) { addView(mCustomNavView); } // tws-start alanhuang 20130401 if (mCustomNavView != null) { final ViewGroup.LayoutParams lp = mCustomNavView.getLayoutParams(); if (lp != null) { int height = lp.height; if (height > 0) { mContentHeight = height; } } } // tws-end alanhuang 20130401 } public CharSequence getTitle() { return mTitle; } /** * Set the action bar title. This will always replace or override window * titles. * * @param title * Title to set * * @see #setWindowTitle(CharSequence) */ public void setTitle(CharSequence title) { mUserTitle = true; setTitleImpl(title); firstMeasureTitle = true; requestLayout(); } /** * Set the window title. A window title will always be replaced or * overridden by a user title. * * @param title * Title to set * * @see #setTitle(CharSequence) */ public void setWindowTitle(CharSequence title) { if (!mUserTitle) { setTitleImpl(title); } } private void setTitleImpl(CharSequence title) { mTitle = title; if (mTitleView != null) { mTitleView.setText(title); final boolean visible = (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0 && (!TextUtils.isEmpty(mTitle) || !TextUtils.isEmpty(mSubtitle)); mTitleLayout.setVisibility(visible ? VISIBLE : GONE); } } public CharSequence getSubtitle() { return mSubtitle; } public void setSubtitle(CharSequence subtitle) { mSubtitle = subtitle; initSubTitle(); if (mSubtitleView != null) { mSubtitleView.setText(subtitle); mSubtitleView.setVisibility(subtitle != null ? VISIBLE : GONE); final boolean visible = (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0 && (!TextUtils.isEmpty(mTitle) || !TextUtils.isEmpty(mSubtitle)); mTitleLayout.setVisibility(visible ? VISIBLE : GONE); } } public void setHomeButtonEnabled(boolean enable) { mHomeLayout.setFocusable(enable); // Make sure the home button has an accurate content description for // accessibility. /* tws-start::modified com.internal to tws 20121011 */ if (!enable) { mHomeLayout.setContentDescription(null); } else if ((mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0) { mHomeLayout.setContentDescription(mContext.getResources().getText(R.string.action_bar_up_description)); } else { mHomeLayout.setContentDescription(mContext.getResources().getText(R.string.action_bar_home_description)); } /* tws-end::modified com.internal to tws 20121011 */ } public void setDisplayOptions(int options) { final int flagsChanged = mDisplayOptions == -1 ? -1 : options ^ mDisplayOptions; mDisplayOptions = options; if ((flagsChanged & DISPLAY_RELAYOUT_MASK) != 0) { final boolean showHome = (options & ActionBar.DISPLAY_SHOW_HOME) != 0; if (showHome) { mHomeLayout.setVisibility(VISIBLE); if (mClose != null) { mClose.setVisibility(GONE); } } else { mHomeLayout.setVisibility(GONE); } if ((flagsChanged & ActionBar.DISPLAY_HOME_AS_UP) != 0) { final boolean setUp = (options & ActionBar.DISPLAY_HOME_AS_UP) != 0; // Showing home as up implicitly enables interaction with it. // In honeycomb it was always enabled, so make this transition // a bit easier for developers in the common case. // (It would be silly to show it as up without responding to // it.) if (setUp) { setHomeButtonEnabled(true); } } if ((flagsChanged & ActionBar.DISPLAY_SHOW_TITLE) != 0) { if ((options & ActionBar.DISPLAY_SHOW_TITLE) != 0) { initTitle(); } else { removeView(mTitleLayout); } } if (mTitleLayout != null && (flagsChanged & (ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_HOME)) != 0) { final boolean homeAsUp = (mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0; mTitleLayout.setEnabled(!showHome && homeAsUp); } if ((flagsChanged & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomNavView != null) { if ((options & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { addView(mCustomNavView); } else { removeView(mCustomNavView); } } requestLayout(); } else { invalidate(); } // Make sure the home button has an accurate content description for // accessibility. /* tws-start::modified com.internal to tws 20121011 */ if (!mHomeLayout.isEnabled()) { mHomeLayout.setContentDescription(null); } else if ((options & ActionBar.DISPLAY_HOME_AS_UP) != 0) { mHomeLayout.setContentDescription(mContext.getResources().getText(R.string.action_bar_up_description)); } else { mHomeLayout.setContentDescription(mContext.getResources().getText(R.string.action_bar_home_description)); } /* tws-end::modified com.internal to tws 20121011 */ } public void setNavigationMode(int mode) { final int oldMode = mNavigationMode; if (mode != oldMode) { switch (oldMode) { case ActionBar.NAVIGATION_MODE_TABS: if (mTabScrollView != null && mIncludeTabs) { removeView(mTabScrollView); } } switch (mode) { case ActionBar.NAVIGATION_MODE_TABS: if (mTabScrollView != null && mIncludeTabs) { addView(mTabScrollView); } break; } mNavigationMode = mode; requestLayout(); } } public View getCustomNavigationView() { return mCustomNavView; } public int getNavigationMode() { return mNavigationMode; } public int getDisplayOptions() { return mDisplayOptions; } @Override protected ViewGroup.LayoutParams generateDefaultLayoutParams() { // Used by custom nav views if they don't supply layout params. // Everything else // added to an ActionBarView should have them already. return new ActionBar.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, DEFAULT_CUSTOM_GRAVITY); } @Override protected void onFinishInflate() { super.onFinishInflate(); addView(mHomeLayout); if (mCustomNavView != null && (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { final ViewParent parent = mCustomNavView.getParent(); if (parent != this) { if (parent instanceof ViewGroup) { ((ViewGroup) parent).removeView(mCustomNavView); } addView(mCustomNavView); } } } private void initTitle() { if (mTitleLayout == null) { LayoutInflater inflater = LayoutInflater.from(getContext()); /* tws-start::modified com.internal to tws 20121011 */ mTitleLayout = (LinearLayout) inflater.inflate(R.layout.action_bar_title_item, this, false); mTitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_title); /* tws-end::modified com.internal to tws 20121011 */ mTitleLayout.setOnClickListener(mUpClickListener); if (mTitleStyleRes != 0) { mTitleView.setTextAppearance(mContext, mTitleStyleRes); // yongchen add for plugin theme if (mIsRunInPlugins) { mTitleView.setTextColor(getResources().getColor(R.color.tws_light_title_actionBar)); // <dimen name="tws_Large_TextSize_Title">18sp</dimen> mTitleView.setTextSize(18.0f); } } if (mTitle != null) { mTitleView.setText(mTitle); } final boolean homeAsUp = (mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0; final boolean showHome = (mDisplayOptions & ActionBar.DISPLAY_SHOW_HOME) != 0; mTitleLayout.setEnabled(homeAsUp && !showHome); } addView(mTitleLayout); if (TextUtils.isEmpty(mTitle) && TextUtils.isEmpty(mSubtitle)) { // Don't show while in expanded mode or with empty text mTitleLayout.setVisibility(GONE); } } 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); // yongchen add for plugin theme if (mIsRunInPlugins) { mSubtitleView.setTextColor(getResources().getColor(R.color.tws_light_subtitle_actionBar)); mSubtitleView.setHintTextColor(getResources().getColor(R.color.tws_second_Hint)); // mSubtitleView.setTextSize(getResources().getDimension(R.dimen.tws_Micro_TextSize)); // <dimen name="tws_Micro_TextSize">12sp</dimen> mSubtitleView.setTextSize(12.0f); } } if (mSubtitle != null) { mSubtitleView.setText(mSubtitle); mSubtitleView.setVisibility(VISIBLE); } } private void initHome(Context context) { mHomeLayout = new ImageButton(context); mHomeLayout.setId(android.R.id.home); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((int) mContext.getResources().getDimension( R.dimen.action_bar_back_btn_width), LayoutParams.MATCH_PARENT);// TODO // gordonbi params.gravity = Gravity.CENTER; mHomeLayout.setLayoutParams(params); // tws-start add for ripple::2014-12-21 boolean bRipple = ThemeUtils.isShowRipple(context); if (bRipple) { if (android.os.Build.VERSION.SDK_INT > 15) { mHomeLayout.setBackground(TwsRippleUtils.getDefaultDarkDrawable(mContext)); } else { mHomeLayout.setBackgroundDrawable(TwsRippleUtils.getDefaultDarkDrawable(mContext)); } } else { mHomeLayout.setBackgroundResource(mHomeBGStyleRes); } // tws-end add for ripple::2014-12-21 mHomeLayout.setFocusable(false); mHomeLayout.setImageResource(mHomeSrcStyleRes); mHomeLayout.setOnClickListener(mUpClickListener); mHomeLayout.setClickable(true); mHomeLayout.setEnabled(true); } // tws-start add actionbar0.2 feature::2014-09-28 public ToggleButton getMultiChoiceView() { 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); } mSplitActionBar = true; if (mMulti != null && mMulti.getVisibility() != VISIBLE) { mMulti.setVisibility(VISIBLE); } return mMulti; } // get rigth button add by jackymli public ImageView getRighButtonView() { if (mRightButton == null) { mRightButton = new ImageButton(mContext); // tws-start add for ripple::2014-12-21 boolean bRipple = ThemeUtils.isShowRipple(mContext); if (bRipple) { if (android.os.Build.VERSION.SDK_INT > 15) { mRightButton.setBackground(TwsRippleUtils.getDefaultDarkDrawable(getContext())); } else { mRightButton.setBackgroundDrawable(TwsRippleUtils.getDefaultDarkDrawable(getContext())); } } else { mRightButton.setBackgroundResource(mHomeBGStyleRes); } // tws-end add for ripple::2014-12-21 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((int) mContext.getResources() .getDimension(R.dimen.action_bar_right_btn_width), LayoutParams.WRAP_CONTENT); params.gravity = Gravity.CENTER; mRightButton.setLayoutParams(params); mRightButton.setFocusable(false); // mRightButton.setPadding( // getResources().getDimensionPixelSize(R.dimen.actionbar_mode_padding), // 0, // getResources().getDimensionPixelSize(R.dimen.actionbar_mode_padding), // 0); addView(mRightButton); } else if (mRightButton.getParent() == null) { addView(mRightButton); } mSplitActionBar = true; if (mRightButton != null && mRightButton.getVisibility() != VISIBLE) { mRightButton.setVisibility(VISIBLE); } return mRightButton; } public View getCloseView() { if (mClose == null) { mClose = new Button(mContext); mClose.setId(R.id.action_mode_close_button); mClose.setTextAppearance(mContext, mCloseStyleRes); mClose.setVisibility(GONE); // tws-start add for ripple::2014-12-21 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); } } // 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; 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), 0, getResources() .getDimensionPixelSize(R.dimen.actionbar_mode_padding), 0); addView(mClose); } else if (mClose.getParent() == null) { addView(mClose); } if (mHomeLayout != null) { mHomeLayout.setVisibility(GONE); } if (mClose != null && mClose.getVisibility() != VISIBLE) { mClose.setVisibility(VISIBLE); } return mClose; } public EditText getEditView() { initEdit(); if (mTitleLayout != null) { mTitleView.setVisibility(GONE); mTitleLayout.setVisibility(GONE); } if (mEdit != null && mEdit.getVisibility() != VISIBLE) { mEdit.setVisibility(VISIBLE); } return mEdit; } // tws-start ActionBar mini mode::2014-10-14 public TextView getTitleView() { return mTitleView; } public TextView getSubtitleView() { initSubTitle(); return mSubtitleView; } // tws-start ActionBar homeLayout interface::2014-12-26 public ImageButton getActionBarHome() { return mHomeLayout; } // tws-end ActionBar homeLayout interface::2014-12-26 public boolean startMiniMode() { mMenuView.setVisibility(GONE); for (int i = 0; i < mMenuView.getChildCount(); i++) { mMenuView.getChildAt(i).setVisibility(GONE); } if (mSplitActionBar) { if (mSplitView != null) { mSplitView.removeView(mMenuView); } } isMiniMode = true; return true; } public boolean exitMiniMode() { mMenuView.setVisibility(VISIBLE); for (int i = 0; i < mMenuView.getChildCount(); i++) { mMenuView.getChildAt(i).setVisibility(VISIBLE); } if (mSplitActionBar) { if (mSplitView != null) { mSplitView.removeView(mMenuView); mSplitView.addView(mMenuView); } } isMiniMode = false; return false; } // tws-end ActionBar mini mode::2014-10-14 // tws-end add actionbar0.2 feature::2014-09-28 public void setContextView(ActionBarContextView view) { mContextView = view; } public void setCollapsable(boolean collapsable) { mIsCollapsable = collapsable; } public boolean isCollapsed() { return mIsCollapsed; } @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 childCount = getChildCount(); if (mIsCollapsable) { int visibleChildren = 0; for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); if (child.getVisibility() != GONE && !(child == mMenuView && mMenuView.getChildCount() == 0)) { visibleChildren++; } } if (visibleChildren == 0) { setMeasuredDimension(0, 0); mIsCollapsed = true; return; } } mIsCollapsed = false; int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (heightMode != MeasureSpec.AT_MOST) { throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + "with android:layout_height=\"wrap_content\""); } int contentWidth = MeasureSpec.getSize(widthMeasureSpec); int maxHeight = mContentHeight > 0 ? mContentHeight : MeasureSpec.getSize(heightMeasureSpec); final int verticalPadding = getPaddingTop() + getPaddingBottom(); final int paddingLeft = getPaddingLeft(); final int paddingRight = getPaddingRight(); final int height = maxHeight - verticalPadding; final int childSpecHeight = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST); int availableWidth = contentWidth - paddingLeft - paddingRight; int leftOfCenter = availableWidth / 2; int rightOfCenter = leftOfCenter; if (mHomeLayout.getVisibility() != GONE) { final ViewGroup.LayoutParams lp = mHomeLayout.getLayoutParams(); int homeWidthSpec; if (lp.width < 0) { homeWidthSpec = MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST); } else { homeWidthSpec = MeasureSpec.makeMeasureSpec( (int) getResources().getDimension(R.dimen.actionbar_home_width), MeasureSpec.EXACTLY); } mHomeLayout.measure(homeWidthSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); final int homeWidth = mHomeLayout.getMeasuredWidth(); availableWidth = Math.max(0, availableWidth - homeWidth); leftOfCenter = Math.max(0, availableWidth - homeWidth); } if (mMenuView != null && mMenuView.getParent() == this) { availableWidth = measureChildView(mMenuView, availableWidth, childSpecHeight, 0); rightOfCenter = Math.max(0, rightOfCenter - mMenuView.getMeasuredWidth()); } if (mClose != null && mClose.getVisibility() == VISIBLE) { mClose.measure(MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY)); } if (mMulti != null && mMulti.getVisibility() == VISIBLE) { mMulti.measure(MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY)); } if (mRightButton != null && mRightButton.getVisibility() == VISIBLE) { final ViewGroup.LayoutParams lp = mRightButton.getLayoutParams(); int RightButtonWidthSpec; if (lp.width < 0) { RightButtonWidthSpec = MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST); } else { RightButtonWidthSpec = MeasureSpec.makeMeasureSpec( (int) getResources().getDimension(R.dimen.action_bar_right_btn_width), MeasureSpec.EXACTLY); } mRightButton.measure(RightButtonWidthSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); // mRightButton.measure( // MeasureSpec.makeMeasureSpec((int)getResources().getDimension(R.dimen.actionbar_home_width), // MeasureSpec.EXACTLY), // MeasureSpec.makeMeasureSpec((int)getResources().getDimension(R.dimen.actionbar_rightbuuton_heigt), // MeasureSpec.EXACTLY)); } if (mEdit != null && mEdit.getVisibility() == VISIBLE) { if (mHomeLayout != null && mMenuView != null && !mSplitActionBar) { int homeWidth = mHomeLayout.getMeasuredWidth(); int menuWidth = mMenuView.getMeasuredWidth(); mEdit.setMaxWidth((contentWidth / 2 - Math.max(homeWidth, menuWidth) - getPaddingLeft()) * 2); } else if (mClose != null && mMulti != null) { int closeWidth = mClose != null ? mClose.getMeasuredWidth() : 0; int multiWidth = mMulti != null ? mMulti.getMeasuredWidth() : 0; mEdit.setMaxWidth((contentWidth / 2 - Math.max(closeWidth, multiWidth + (int) mContext.getResources().getDimension(R.dimen.actionbar_mode_padding)) - getPaddingLeft()) * 2); } else if (mHomeLayout != null && mMenuView != null && mSplitActionBar && mClose == null && mMulti == null) { int homeWidth = mHomeLayout.getMeasuredWidth(); mEdit.setMaxWidth((contentWidth / 2 - homeWidth - getPaddingLeft()) * 2); } mEdit.measure(MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED)); } final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE && (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0; switch (mNavigationMode) { case ActionBar.NAVIGATION_MODE_TABS: if (mTabScrollView != null) { final int itemPaddingSize = showTitle ? mItemPadding * 2 : mItemPadding; availableWidth = Math.max(0, availableWidth - itemPaddingSize); leftOfCenter = Math.max(0, leftOfCenter - itemPaddingSize); mTabScrollView.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); final int tabWidth = mTabScrollView.getMeasuredWidth(); availableWidth = Math.max(0, availableWidth - tabWidth); leftOfCenter = Math.max(0, leftOfCenter - tabWidth); } break; } View customView = null; if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomNavView != null) { customView = mCustomNavView; } if (customView != null) { final ViewGroup.LayoutParams lp = generateLayoutParams(customView.getLayoutParams()); final ActionBar.LayoutParams ablp = lp instanceof ActionBar.LayoutParams ? (ActionBar.LayoutParams) lp : null; int horizontalMargin = 0; int verticalMargin = 0; if (ablp != null) { horizontalMargin = ablp.leftMargin + ablp.rightMargin; verticalMargin = ablp.topMargin + ablp.bottomMargin; } // If the action bar is wrapping to its content height, don't allow // a custom // view to MATCH_PARENT. int customNavHeightMode; if (mContentHeight <= 0) { customNavHeightMode = MeasureSpec.AT_MOST; } else { customNavHeightMode = lp.height != LayoutParams.WRAP_CONTENT ? MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; } final int customNavHeight = Math.max(0, (lp.height >= 0 ? Math.min(lp.height, height) : height) - verticalMargin); final int customNavWidthMode = lp.width != LayoutParams.WRAP_CONTENT ? MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; int customNavWidth = Math.max(0, (lp.width >= 0 ? Math.min(lp.width, availableWidth) : availableWidth) - horizontalMargin); final int hgrav = (ablp != null ? ablp.gravity : DEFAULT_CUSTOM_GRAVITY) & Gravity.HORIZONTAL_GRAVITY_MASK; // Centering a custom view is treated specially; we try to center // within the whole // action bar rather than in the available space. if (hgrav == Gravity.CENTER_HORIZONTAL && lp.width == LayoutParams.MATCH_PARENT) { customNavWidth = Math.min(leftOfCenter, rightOfCenter) * 2; } // tws-start ActionBar mini mode::2014-10-14 if (!isMiniMode) { customView.measure(MeasureSpec.makeMeasureSpec(customNavWidth, customNavWidthMode), MeasureSpec.makeMeasureSpec(customNavHeight, customNavHeightMode)); } else { customView.measure(MeasureSpec.makeMeasureSpec(contentWidth, customNavWidthMode), MeasureSpec.makeMeasureSpec(customNavHeight, customNavHeightMode)); } // tws-end ActionBar mini mode::2014-10-14 availableWidth -= horizontalMargin + customView.getMeasuredWidth(); } if (showTitle) { // tws-start add actionbar0.2 feature::2014-09-28 if (firstMeasureTitle) { if (mTitleView != null) mTitleView.requestLayout(); if (mSubtitleView != null) mSubtitleView.requestLayout(); mTitleLayout.measure(MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY)); firstMeasureTitle = false; } int tagWidth = mTitleLayout.getMeasuredWidth(); int maxWidth = tagWidth; if (mMenuView != null) { if (!mSplitActionBar) { int temp = Math.max(mMenuView.getMeasuredWidth(), mHomeLayout.getMeasuredWidth()); maxWidth = (contentWidth / 2 - temp - paddingLeft - paddingRight) * 2; } else { maxWidth = (contentWidth / 2 - ((mHomeLayout != null && mHomeLayout.getVisibility() != View.GONE) ? mHomeLayout .getMeasuredWidth() : 0) - paddingLeft - paddingRight) * 2; } tagWidth = Math.min(tagWidth, maxWidth); } else if (mHomeLayout != null && mHomeLayout.getVisibility() != View.GONE) { tagWidth = (contentWidth / 2 - mHomeLayout.getMeasuredWidth() - paddingLeft - paddingRight) * 2; } else if (mRightButton != null && mRightButton.getVisibility() != View.GONE) { tagWidth = (contentWidth / 2 - mRightButton.getMeasuredWidth() - paddingLeft - paddingRight) * 2; } else { tagWidth = (contentWidth / 2 - 0 - paddingLeft - paddingRight) * 2; } if (mClose != null) { int closeWidth = mClose.getVisibility() == VISIBLE ? mClose.getMeasuredWidth() : 0; if (tagWidth > (contentWidth / 2 - Math.max(closeWidth, closeWidth + (int) mContext.getResources().getDimension(R.dimen.actionbar_mode_padding)) - getPaddingLeft()) * 2) { tagWidth = (contentWidth / 2 - Math.max( closeWidth, closeWidth + (int) mContext.getResources() .getDimension(R.dimen.actionbar_mode_padding)) - getPaddingLeft()) * 2; } } if (mMulti != null) { int multiWidth = mMulti.getVisibility() == VISIBLE ? mMulti.getMeasuredWidth() : 0; if (tagWidth > (contentWidth / 2 - Math.max(multiWidth, multiWidth + (int) mContext.getResources().getDimension(R.dimen.actionbar_mode_padding)) - getPaddingRight()) * 2) { tagWidth = (contentWidth / 2 - Math.max( multiWidth, multiWidth + (int) mContext.getResources() .getDimension(R.dimen.actionbar_mode_padding)) - getPaddingRight()) * 2; } } if (mClose != null && mMulti != null) { int closeWidth = mClose.getVisibility() == VISIBLE ? mClose.getMeasuredWidth() : 0; int multiWidth = mMulti.getVisibility() == VISIBLE ? mMulti.getMeasuredWidth() : 0; int buttonWidth = Math.max(closeWidth, multiWidth); if (tagWidth > (contentWidth / 2 - Math.max(buttonWidth, buttonWidth + (int) mContext.getResources().getDimension(R.dimen.actionbar_mode_padding)) - getPaddingRight()) * 2) { tagWidth = (contentWidth / 2 - Math.max( buttonWidth, buttonWidth + (int) mContext.getResources() .getDimension(R.dimen.actionbar_mode_padding)) - getPaddingRight()) * 2; } } mTitleLayout.measure(MeasureSpec.makeMeasureSpec(tagWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY)); // tws-end add actionbar0.2 feature::2014-09-28 } if (mContentHeight <= 0) { int measuredHeight = 0; for (int i = 0; i < childCount; i++) { View v = getChildAt(i); int paddedViewHeight = v.getMeasuredHeight() + verticalPadding; if (paddedViewHeight > measuredHeight) { measuredHeight = paddedViewHeight; } } setMeasuredDimension(contentWidth, measuredHeight); } else { setMeasuredDimension(contentWidth, maxHeight); } if (mContextView != null) { mContextView.setContentHeight(mContentHeight); mContextView.setPadding(0, getPaddingTop(), 0, 0); } } @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 (contentHeight <= 0) { // Nothing to do if we can't see anything. return; } if (mHomeLayout.getVisibility() != GONE) { x += positionChild(mHomeLayout, x, y, contentHeight); // tws-start ActionBar BackBtn Width::2014-8-20 int paddingRight = 0; x -= paddingRight; // tws-end ActionBar BackBtn Width::2014-8-20 } final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE && (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0; if (showTitle) { positionChild(mTitleLayout, mContext.getResources().getDisplayMetrics().widthPixels / 2 - mTitleLayout.getMeasuredWidth() / 2, y, contentHeight); // x += positionChild(mTitleLayout, x, y, contentHeight); } switch (mNavigationMode) { case ActionBar.NAVIGATION_MODE_TABS: if (mTabScrollView != null) { if (showTitle) x += mItemPadding; x += positionChild(mTabScrollView, x, y, contentHeight) + mItemPadding; } break; } int menuLeft = r - l - getPaddingRight(); if (mMenuView != null && mMenuView.getParent() == this) { positionChildInverse(mMenuView, menuLeft, y, contentHeight); menuLeft -= mMenuView.getMeasuredWidth(); } View customView = null; if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomNavView != null) { customView = mCustomNavView; } if (customView != null) { ViewGroup.LayoutParams lp = customView.getLayoutParams(); final ActionBar.LayoutParams ablp = lp instanceof ActionBar.LayoutParams ? (ActionBar.LayoutParams) lp : null; final int gravity = ablp != null ? ablp.gravity : DEFAULT_CUSTOM_GRAVITY; final int navWidth = customView.getMeasuredWidth(); int topMargin = 0; int bottomMargin = 0; if (ablp != null) { x += ablp.leftMargin; menuLeft -= ablp.rightMargin; topMargin = ablp.topMargin; bottomMargin = ablp.bottomMargin; } int hgravity = gravity & Gravity.HORIZONTAL_GRAVITY_MASK; // See if we actually have room to truly center; if not push against // left or right. if (hgravity == Gravity.CENTER_HORIZONTAL) { final int centeredLeft = ((mRight - mLeft) - navWidth) / 2; if (centeredLeft < x) { hgravity = Gravity.LEFT; } else if (centeredLeft + navWidth > menuLeft) { hgravity = Gravity.RIGHT; } } else if (gravity == -1) { hgravity = Gravity.LEFT; } int xpos = 0; switch (hgravity) { case Gravity.CENTER_HORIZONTAL: xpos = ((mRight - mLeft) - navWidth) / 2; break; case Gravity.LEFT: xpos = x; break; case Gravity.RIGHT: xpos = menuLeft - navWidth; break; } int vgravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; if (gravity == -1) { vgravity = Gravity.CENTER_VERTICAL; } int ypos = 0; switch (vgravity) { case Gravity.CENTER_VERTICAL: final int paddedTop = getPaddingTop(); final int paddedBottom = mBottom - mTop - getPaddingBottom(); ypos = ((paddedBottom - paddedTop) - customView.getMeasuredHeight()) / 2; break; case Gravity.TOP: ypos = getPaddingTop() + topMargin; break; case Gravity.BOTTOM: ypos = getHeight() - getPaddingBottom() - customView.getMeasuredHeight() - bottomMargin; break; } final int customWidth = customView.getMeasuredWidth(); if (android.os.Build.VERSION.SDK_INT > 18 && getResources().getBoolean(R.bool.config_statusbar_state)) { customView.layout(xpos, ypos + TwsActivity.getStatusBarHeight(), xpos + customWidth, ypos + TwsActivity.getStatusBarHeight() + customView.getMeasuredHeight()); } else { customView.layout(xpos, ypos, xpos + customWidth, ypos + customView.getMeasuredHeight()); } x += customWidth; } // tws-start add actionbar0.2 feature::2014-09-28 if (mClose != null && mClose.getVisibility() != GONE) { positionChild(mClose, getPaddingLeft(), y, contentHeight); } if (mMulti != null && mMulti.getVisibility() != GONE) { positionChild(mMulti, mContext.getResources().getDisplayMetrics().widthPixels - mMulti.getMeasuredWidth() - getPaddingRight(), y, contentHeight); } if (mRightButton != null && mRightButton.getVisibility() != GONE) { positionChild(mRightButton, mContext.getResources().getDisplayMetrics().widthPixels - mRightButton.getMeasuredWidth() - mRightButton.getPaddingRight(), 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 } @Override public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { return new ActionBar.LayoutParams(getContext(), attrs); } @Override public ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { if (lp == null) { lp = generateDefaultLayoutParams(); } return lp; } @Override public Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); SavedState state = new SavedState(superState); if (mExpandedMenuPresenter != null && mExpandedMenuPresenter.mCurrentExpandedItem != null) { state.expandedMenuItemId = mExpandedMenuPresenter.mCurrentExpandedItem.getItemId(); } state.isOverflowOpen = isOverflowMenuShowing(); return state; } @Override public void onRestoreInstanceState(Parcelable p) { SavedState state = (SavedState) p; super.onRestoreInstanceState(state.getSuperState()); if (state.expandedMenuItemId != 0 && mExpandedMenuPresenter != null && mOptionsMenu != null) { final MenuItem item = mOptionsMenu.findItem(state.expandedMenuItemId); if (item != null) { item.expandActionView(); } } if (state.isOverflowOpen) { postShowOverflowMenu(); } } static class SavedState extends BaseSavedState { int expandedMenuItemId; boolean isOverflowOpen; SavedState(Parcelable superState) { super(superState); } private SavedState(Parcel in) { super(in); expandedMenuItemId = in.readInt(); isOverflowOpen = in.readInt() != 0; } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(expandedMenuItemId); out.writeInt(isOverflowOpen ? 1 : 0); } public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { public SavedState createFromParcel(Parcel in) { return new SavedState(in); } public SavedState[] newArray(int size) { return new SavedState[size]; } }; } private class ExpandedActionViewMenuPresenter implements MenuPresenter { MenuBuilder mMenu; MenuItemImpl mCurrentExpandedItem; @Override public void initForMenu(Context context, MenuBuilder menu) { // Clear the expanded action view when menus change. if (mMenu != null && mCurrentExpandedItem != null) { mMenu.collapseItemActionView(mCurrentExpandedItem); } mMenu = menu; } @Override public MenuView getMenuView(ViewGroup root) { return null; } @Override public void updateMenuView(boolean cleared) { // Make sure the expanded item we have is still there. if (mCurrentExpandedItem != null) { boolean found = false; if (mMenu != null) { final int count = mMenu.size(); for (int i = 0; i < count; i++) { final MenuItem item = mMenu.getItem(i); if (item == mCurrentExpandedItem) { found = true; break; } } } if (!found) { // The item we had expanded disappeared. Collapse. collapseItemActionView(mMenu, mCurrentExpandedItem); } } } @Override public void setCallback(Callback cb) { } @Override public boolean onSubMenuSelected(SubMenuBuilder subMenu) { return false; } @Override public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { } @Override public boolean flagActionItems() { return false; } @Override public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { mCurrentExpandedItem = item; mHomeLayout.setVisibility(GONE); if (mTitleLayout != null) mTitleLayout.setVisibility(GONE); if (mTabScrollView != null) mTabScrollView.setVisibility(GONE); if (mCustomNavView != null) mCustomNavView.setVisibility(GONE); requestLayout(); item.setActionViewExpanded(true); return true; } @Override public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { // Do this before detaching the actionview from the hierarchy, in // case // it needs to dismiss the soft keyboard, etc. if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_HOME) != 0) { mHomeLayout.setVisibility(VISIBLE); if (mClose != null) { mClose.setVisibility(GONE); } } if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0) { if (mTitleLayout == null) { initTitle(); } else { mTitleLayout.setVisibility(VISIBLE); } } if (mTabScrollView != null && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) { mTabScrollView.setVisibility(VISIBLE); } if (mCustomNavView != null && (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { mCustomNavView.setVisibility(VISIBLE); } mCurrentExpandedItem = null; requestLayout(); item.setActionViewExpanded(false); return true; } @Override public int getId() { return 0; } @Override public Parcelable onSaveInstanceState() { return null; } @Override public void onRestoreInstanceState(Parcelable state) { } } // tws-start ActionBar Back Button::2014-7-30 public void twsSetBackOnclickEnabled(boolean enable) { mIsBackClick = enable; } public boolean twsGetBackOnclickEnabled() { return mIsBackClick; } // tws-end ActionBar Back Button::2014-7-30 public void setOverflowButtonState(boolean enable) { if (mActionMenuPresenter == null) mActionMenuPresenter = new ActionMenuPresenter(mContext); mActionMenuPresenter.setOverflowButtonState(enable); } public void setTopOverflowButtonState(boolean enable) { if (mActionMenuPresenter == null) mActionMenuPresenter = new ActionMenuPresenter(mContext); mActionMenuPresenter.setTopOverflowButtonState(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) { mIsMarksPointFlag = true; mActionMenuPresenter.setPopupMenuMarks(isMarks); } } // tws-end add PopupMenuRedPoint interface::2015-3-12 // tws-start add PopupMenuText interface::2015-5-18 public void setPopupTextColors(int[] textColors) { if (mActionMenuPresenter != null) { mIsMarksPointFlag = true; mActionMenuPresenter.setPopupTextColors(textColors); } } // tws-end add PopupMenuText interface::2015-5-18 // tws-start add Overflow clickDelay interface::2015-3-19 public void setOverflowDelay(boolean isDelay) { if (mActionMenuPresenter != null) { mActionMenuPresenter.setOverflowDelay(isDelay); } } public void setTopOverflowDelay(boolean isDelay) { if (mActionMenuPresenter != null) { mActionMenuPresenter.setTopOverflowDelay(isDelay); } } // tws-end add Overflow clickDelay interface::2015-3-19 // tws-start add Menu Config flag::2015-3-31 public void setMenuConfigFlag(boolean isConfig) { mIsMenuConfigFlag = isConfig; } // tws-end add Menu Config flag::2015-3-31 }