1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/* 2bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Copyright (C) 2012 The Android Open Source Project 3bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 4bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * you may not use this file except in compliance with the License. 6bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * You may obtain a copy of the License at 7bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 8bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * http://www.apache.org/licenses/LICENSE-2.0 9bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 10bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Unless required by applicable law or agreed to in writing, software 11bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * See the License for the specific language governing permissions and 14bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * limitations under the License. 15bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 16bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 17da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownpackage android.support.v7.app; 18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 19bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.app.Dialog; 20bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context; 2159ff0428452802ab5565633e637baa12f29834e8Trevor Johnsimport android.content.res.Configuration; 226b730d46a744ec1621bd294eb626b10b11090ffbChris Banesimport android.content.res.Resources; 23bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.graphics.drawable.Drawable; 24bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.os.Handler; 25da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v4.app.FragmentTransaction; 26da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.appcompat.R; 27da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.view.ActionBarPolicy; 28d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.internal.view.SupportMenuInflater; 29da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.view.menu.MenuBuilder; 30da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.view.menu.SubMenuBuilder; 31da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.widget.ActionBarContainer; 32da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.widget.ActionBarContextView; 33da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.widget.ActionBarOverlayLayout; 34da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.widget.ActionBarView; 35da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownimport android.support.v7.internal.widget.ScrollingTabContainerView; 3630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.support.v7.view.ActionMode; 3730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.support.v4.internal.view.SupportMenuItem; 386b730d46a744ec1621bd294eb626b10b11090ffbChris Banesimport android.util.TypedValue; 396b730d46a744ec1621bd294eb626b10b11090ffbChris Banesimport android.view.ContextThemeWrapper; 40bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.LayoutInflater; 4130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.Menu; 4230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuInflater; 4330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem; 44bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View; 45bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.ViewGroup; 46bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.accessibility.AccessibilityEvent; 47a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banesimport android.view.animation.Animation; 48a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banesimport android.view.animation.AnimationUtils; 49bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.widget.SpinnerAdapter; 50bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 51bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport java.lang.ref.WeakReference; 52bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport java.util.ArrayList; 53bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 54f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powellclass ActionBarImplBase extends ActionBar { 55bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private Context mContext; 56bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private Context mThemedContext; 57c49dc83939fb3a08fcead20b9b9aa44abc151ea6Trevor Johns private ActionBarActivity mActivity; 58bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private Dialog mDialog; 59bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 60bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ActionBarOverlayLayout mOverlayLayout; 61bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ActionBarContainer mContainerView; 62bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ViewGroup mTopVisibilityView; 63bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ActionBarView mActionView; 64bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ActionBarContextView mContextView; 65bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ActionBarContainer mSplitView; 66bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private View mContentView; 67bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ScrollingTabContainerView mTabScrollView; 68bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 69bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ArrayList<TabImpl> mTabs = new ArrayList<TabImpl>(); 70bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 71bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private TabImpl mSelectedTab; 72bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private int mSavedTabPosition = INVALID_POSITION; 73ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 74bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mDisplayHomeAsUpSet; 75bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 76bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell ActionModeImpl mActionMode; 77bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell ActionMode mDeferredDestroyActionMode; 78bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell ActionMode.Callback mDeferredModeDestroyCallback; 79ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 80bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mLastMenuVisibility; 81bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private ArrayList<OnMenuVisibilityListener> mMenuVisibilityListeners = 8220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns new ArrayList<OnMenuVisibilityListener>(); 83bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 84bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private static final int CONTEXT_DISPLAY_NORMAL = 0; 85bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private static final int CONTEXT_DISPLAY_SPLIT = 1; 86ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 87bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private static final int INVALID_POSITION = -1; 88bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 89bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private int mContextDisplayMode; 90bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mHasEmbeddedTabs; 91bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 92bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell final Handler mHandler = new Handler(); 93bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell Runnable mTabSelector; 94bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 95bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private int mCurWindowVisibility = View.VISIBLE; 96bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 97bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mHiddenByApp; 98bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mHiddenBySystem; 99bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mShowingForMode; 100bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 101bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mNowShowing = true; 102bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell private boolean mShowHideAnimationEnabled; 103bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 104ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private Callback mCallback; 105bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 106f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell public ActionBarImplBase(ActionBarActivity activity, Callback callback) { 107bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActivity = activity; 10859ff0428452802ab5565633e637baa12f29834e8Trevor Johns mContext = activity; 109bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mCallback = callback; 11059ff0428452802ab5565633e637baa12f29834e8Trevor Johns init(mActivity); 11159ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 11259ff0428452802ab5565633e637baa12f29834e8Trevor Johns 113c49dc83939fb3a08fcead20b9b9aa44abc151ea6Trevor Johns private void init(ActionBarActivity activity) { 11459ff0428452802ab5565633e637baa12f29834e8Trevor Johns mOverlayLayout = (ActionBarOverlayLayout) activity.findViewById( 11559ff0428452802ab5565633e637baa12f29834e8Trevor Johns R.id.action_bar_overlay_layout); 11659ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (mOverlayLayout != null) { 11759ff0428452802ab5565633e637baa12f29834e8Trevor Johns mOverlayLayout.setActionBar(this); 11859ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 11959ff0428452802ab5565633e637baa12f29834e8Trevor Johns mActionView = (ActionBarView) activity.findViewById(R.id.action_bar); 12059ff0428452802ab5565633e637baa12f29834e8Trevor Johns mContextView = (ActionBarContextView) activity.findViewById(R.id.action_context_bar); 12159ff0428452802ab5565633e637baa12f29834e8Trevor Johns mContainerView = (ActionBarContainer) activity.findViewById(R.id.action_bar_container); 12259ff0428452802ab5565633e637baa12f29834e8Trevor Johns mTopVisibilityView = (ViewGroup) activity.findViewById(R.id.top_action_bar); 12359ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (mTopVisibilityView == null) { 12459ff0428452802ab5565633e637baa12f29834e8Trevor Johns mTopVisibilityView = mContainerView; 12559ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 12659ff0428452802ab5565633e637baa12f29834e8Trevor Johns mSplitView = (ActionBarContainer) activity.findViewById(R.id.split_action_bar); 12759ff0428452802ab5565633e637baa12f29834e8Trevor Johns 12859ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (mActionView == null || mContextView == null || mContainerView == null) { 12959ff0428452802ab5565633e637baa12f29834e8Trevor Johns throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + 13059ff0428452802ab5565633e637baa12f29834e8Trevor Johns "with a compatible window decor layout"); 13159ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 13259ff0428452802ab5565633e637baa12f29834e8Trevor Johns 13359ff0428452802ab5565633e637baa12f29834e8Trevor Johns mActionView.setContextView(mContextView); 13459ff0428452802ab5565633e637baa12f29834e8Trevor Johns mContextDisplayMode = mActionView.isSplitActionBar() ? 13559ff0428452802ab5565633e637baa12f29834e8Trevor Johns CONTEXT_DISPLAY_SPLIT : CONTEXT_DISPLAY_NORMAL; 13659ff0428452802ab5565633e637baa12f29834e8Trevor Johns 13759ff0428452802ab5565633e637baa12f29834e8Trevor Johns // This was initially read from the action bar style 13859ff0428452802ab5565633e637baa12f29834e8Trevor Johns final int current = mActionView.getDisplayOptions(); 13959ff0428452802ab5565633e637baa12f29834e8Trevor Johns final boolean homeAsUp = (current & DISPLAY_HOME_AS_UP) != 0; 14059ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (homeAsUp) { 14159ff0428452802ab5565633e637baa12f29834e8Trevor Johns mDisplayHomeAsUpSet = true; 14259ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 14359ff0428452802ab5565633e637baa12f29834e8Trevor Johns 14459ff0428452802ab5565633e637baa12f29834e8Trevor Johns ActionBarPolicy abp = ActionBarPolicy.get(mContext); 14559ff0428452802ab5565633e637baa12f29834e8Trevor Johns setHomeButtonEnabled(abp.enableHomeButtonByDefault() || homeAsUp); 14659ff0428452802ab5565633e637baa12f29834e8Trevor Johns setHasEmbeddedTabs(abp.hasEmbeddedTabs()); 147bca05b3d0edd41626606189678a578270c5e84a0Chris Banes setTitle(mActivity.getTitle()); 14859ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 14959ff0428452802ab5565633e637baa12f29834e8Trevor Johns 15059ff0428452802ab5565633e637baa12f29834e8Trevor Johns public void onConfigurationChanged(Configuration newConfig) { 15159ff0428452802ab5565633e637baa12f29834e8Trevor Johns setHasEmbeddedTabs(ActionBarPolicy.get(mContext).hasEmbeddedTabs()); 15259ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 15359ff0428452802ab5565633e637baa12f29834e8Trevor Johns 15459ff0428452802ab5565633e637baa12f29834e8Trevor Johns private void setHasEmbeddedTabs(boolean hasEmbeddedTabs) { 15559ff0428452802ab5565633e637baa12f29834e8Trevor Johns mHasEmbeddedTabs = hasEmbeddedTabs; 15659ff0428452802ab5565633e637baa12f29834e8Trevor Johns // Switch tab layout configuration if needed 15759ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (!mHasEmbeddedTabs) { 15859ff0428452802ab5565633e637baa12f29834e8Trevor Johns mActionView.setEmbeddedTabView(null); 15959ff0428452802ab5565633e637baa12f29834e8Trevor Johns mContainerView.setTabContainer(mTabScrollView); 16059ff0428452802ab5565633e637baa12f29834e8Trevor Johns } else { 16159ff0428452802ab5565633e637baa12f29834e8Trevor Johns mContainerView.setTabContainer(null); 16259ff0428452802ab5565633e637baa12f29834e8Trevor Johns mActionView.setEmbeddedTabView(mTabScrollView); 16359ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 16459ff0428452802ab5565633e637baa12f29834e8Trevor Johns final boolean isInTabMode = getNavigationMode() == NAVIGATION_MODE_TABS; 16559ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (mTabScrollView != null) { 16659ff0428452802ab5565633e637baa12f29834e8Trevor Johns if (isInTabMode) { 16759ff0428452802ab5565633e637baa12f29834e8Trevor Johns mTabScrollView.setVisibility(View.VISIBLE); 16859ff0428452802ab5565633e637baa12f29834e8Trevor Johns } else { 16959ff0428452802ab5565633e637baa12f29834e8Trevor Johns mTabScrollView.setVisibility(View.GONE); 17059ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 17159ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 17259ff0428452802ab5565633e637baa12f29834e8Trevor Johns mActionView.setCollapsable(!mHasEmbeddedTabs && isInTabMode); 17359ff0428452802ab5565633e637baa12f29834e8Trevor Johns } 17459ff0428452802ab5565633e637baa12f29834e8Trevor Johns 17559ff0428452802ab5565633e637baa12f29834e8Trevor Johns public boolean hasNonEmbeddedTabs() { 17659ff0428452802ab5565633e637baa12f29834e8Trevor Johns return !mHasEmbeddedTabs && getNavigationMode() == NAVIGATION_MODE_TABS; 177bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 178bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 179bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 180bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setCustomView(View view) { 181bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setCustomNavigationView(view); 182bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 183bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 184bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 185bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setCustomView(View view, LayoutParams layoutParams) { 186bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell view.setLayoutParams(layoutParams); 187bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setCustomNavigationView(view); 188bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 189bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 190bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 191bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 192bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setCustomView(int resId) { 193bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell setCustomView(LayoutInflater.from(getThemedContext()) 19420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns .inflate(resId, mActionView, false)); 195bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 196bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 197bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 198bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setIcon(int resId) { 199bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setIcon(resId); 200bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 201bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 202bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 203bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setIcon(Drawable icon) { 204bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setIcon(icon); 205bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 206bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 207bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 208bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setLogo(int resId) { 209bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setLogo(resId); 210bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 211bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 212bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 213bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setLogo(Drawable logo) { 214bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setLogo(logo); 215bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 216bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 217bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 218bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { 219bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setDropdownAdapter(adapter); 220bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setCallback(callback); 221bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 222bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 223bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 224bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setSelectedNavigationItem(int position) { 225bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell switch (mActionView.getNavigationMode()) { 226ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani case NAVIGATION_MODE_TABS: 227ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani selectTab(mTabs.get(position)); 228ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani break; 229ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani case NAVIGATION_MODE_LIST: 230ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mActionView.setDropdownSelectedPosition(position); 231ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani break; 232ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani default: 233ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani throw new IllegalStateException( 23420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns "setSelectedNavigationIndex not valid for current navigation mode"); 235bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 236bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 237bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 238bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 239bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public int getSelectedNavigationIndex() { 240bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell switch (mActionView.getNavigationMode()) { 241bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell case NAVIGATION_MODE_TABS: 242bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mSelectedTab != null ? mSelectedTab.getPosition() : -1; 243bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell case NAVIGATION_MODE_LIST: 244bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mActionView.getDropdownSelectedPosition(); 245bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell default: 246bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return -1; 247bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 248bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 249bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 250bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 251bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public int getNavigationItemCount() { 252bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell switch (mActionView.getNavigationMode()) { 253bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell case NAVIGATION_MODE_TABS: 254bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mTabs.size(); 255bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell case NAVIGATION_MODE_LIST: 256bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell SpinnerAdapter adapter = mActionView.getDropdownAdapter(); 257bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return adapter != null ? adapter.getCount() : 0; 258bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell default: 259bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return 0; 260bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 261bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 262bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 263bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 264bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setTitle(CharSequence title) { 265bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setTitle(title); 266bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 267bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 268bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 269bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setTitle(int resId) { 270bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell setTitle(mContext.getString(resId)); 271bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 272bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 273bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 274bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setSubtitle(CharSequence subtitle) { 275bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setSubtitle(subtitle); 276bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 277bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 278bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 279bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setSubtitle(int resId) { 280bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell setSubtitle(mContext.getString(resId)); 281bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 282bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 283bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 284bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setDisplayOptions(int options) { 285bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if ((options & DISPLAY_HOME_AS_UP) != 0) { 286bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mDisplayHomeAsUpSet = true; 287bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 288bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setDisplayOptions(options); 289bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 290bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 291bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 292bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setDisplayOptions(int options, int mask) { 293ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int current = mActionView.getDisplayOptions(); 294bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if ((mask & DISPLAY_HOME_AS_UP) != 0) { 295bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mDisplayHomeAsUpSet = true; 296bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 297bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setDisplayOptions((options & mask) | (current & ~mask)); 298bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 299bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 300bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 301bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setDisplayUseLogoEnabled(boolean useLogo) { 302bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell setDisplayOptions(useLogo ? DISPLAY_USE_LOGO : 0, DISPLAY_USE_LOGO); 303bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 304bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 305bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 306bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setDisplayShowHomeEnabled(boolean showHome) { 307bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME); 308bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 309bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 310bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 311bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) { 312bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP); 313bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 314bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 315bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 316bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setDisplayShowTitleEnabled(boolean showTitle) { 317bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE); 318bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 319bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 320bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 321bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setDisplayShowCustomEnabled(boolean showCustom) { 322bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM); 323bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 324bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 325bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 3265bf18cb82d15b240f8f6d45934fb963c3724b9bdChris Banes public void setHomeButtonEnabled(boolean enable) { 3275bf18cb82d15b240f8f6d45934fb963c3724b9bdChris Banes mActionView.setHomeButtonEnabled(enable); 3285bf18cb82d15b240f8f6d45934fb963c3724b9bdChris Banes } 3295bf18cb82d15b240f8f6d45934fb963c3724b9bdChris Banes 3305bf18cb82d15b240f8f6d45934fb963c3724b9bdChris Banes @Override 331bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setBackgroundDrawable(Drawable d) { 332bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mContainerView.setPrimaryBackground(d); 333bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 334bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 335bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 336bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public View getCustomView() { 337bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mActionView.getCustomNavigationView(); 338bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 339bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 340bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 341bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public CharSequence getTitle() { 342bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mActionView.getTitle(); 343bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 344bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 345bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 346bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public CharSequence getSubtitle() { 347bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mActionView.getSubtitle(); 348bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 349bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 350bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 351bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public int getNavigationMode() { 352bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mActionView.getNavigationMode(); 353bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 354bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 355bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 356bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void setNavigationMode(int mode) { 357bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell final int oldMode = mActionView.getNavigationMode(); 358bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell switch (oldMode) { 359bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell case NAVIGATION_MODE_TABS: 360bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSavedTabPosition = getSelectedNavigationIndex(); 361bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell selectTab(null); 362bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.setVisibility(View.GONE); 363bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell break; 364bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 365bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setNavigationMode(mode); 366bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell switch (mode) { 367bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell case NAVIGATION_MODE_TABS: 368bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell ensureTabsExist(); 369bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.setVisibility(View.VISIBLE); 370bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mSavedTabPosition != INVALID_POSITION) { 371bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell setSelectedNavigationItem(mSavedTabPosition); 372bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSavedTabPosition = INVALID_POSITION; 373bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 374bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell break; 375bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 376bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mActionView.setCollapsable(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs); 377bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 378bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 379bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 380bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public int getDisplayOptions() { 381bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mActionView.getDisplayOptions(); 382bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 383bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 384bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 385bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public Tab newTab() { 386bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return new TabImpl(); 387bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 388bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 389bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 390bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void addTab(Tab tab) { 391bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell addTab(tab, mTabs.isEmpty()); 392bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 393bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 394bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 395bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void addTab(Tab tab, boolean setSelected) { 396bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell ensureTabsExist(); 397bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.addTab(tab, setSelected); 398bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell configureTab(tab, mTabs.size()); 399bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (setSelected) { 400bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell selectTab(tab); 401bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 402bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 403bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 404bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 405bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void addTab(Tab tab, int position) { 406bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell addTab(tab, position, mTabs.isEmpty()); 407bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 408bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 409bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 410bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void addTab(Tab tab, int position, boolean setSelected) { 411bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell ensureTabsExist(); 412bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.addTab(tab, position, setSelected); 413bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell configureTab(tab, position); 414bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (setSelected) { 415bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell selectTab(tab); 416bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 417bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 418bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 419bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 420bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void removeTab(Tab tab) { 421bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell removeTabAt(tab.getPosition()); 422bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 423bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 424bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 425bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void removeTabAt(int position) { 426bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mTabScrollView == null) { 427bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell // No tabs around to remove 428bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return; 429bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 430bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 431bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell int selectedTabPosition = mSelectedTab != null 43220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ? mSelectedTab.getPosition() : mSavedTabPosition; 433bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.removeTabAt(position); 434bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell TabImpl removedTab = mTabs.remove(position); 435bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (removedTab != null) { 436bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell removedTab.setPosition(-1); 437bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 438bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 439bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell final int newTabCount = mTabs.size(); 440bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell for (int i = position; i < newTabCount; i++) { 441bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabs.get(i).setPosition(i); 442bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 443bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 444bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (selectedTabPosition == position) { 445bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell selectTab(mTabs.isEmpty() ? null : mTabs.get(Math.max(0, position - 1))); 446bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 447bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 448bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 449bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 450bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void removeAllTabs() { 451bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell cleanupTabs(); 452bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 453bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 454bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 455bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void selectTab(Tab tab) { 456bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (getNavigationMode() != NAVIGATION_MODE_TABS) { 457bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSavedTabPosition = tab != null ? tab.getPosition() : INVALID_POSITION; 458bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return; 459bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 460bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 461bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell final FragmentTransaction trans = mActivity.getSupportFragmentManager().beginTransaction() 46220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns .disallowAddToBackStack(); 463bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 464bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mSelectedTab == tab) { 465bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mSelectedTab != null) { 466bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSelectedTab.getCallback().onTabReselected(mSelectedTab, trans); 467bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.animateToTab(tab.getPosition()); 468bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 469bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } else { 470bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mTabScrollView.setTabSelected(tab != null ? tab.getPosition() : Tab.INVALID_POSITION); 471bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mSelectedTab != null) { 472bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSelectedTab.getCallback().onTabUnselected(mSelectedTab, trans); 473bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 474bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSelectedTab = (TabImpl) tab; 475bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mSelectedTab != null) { 476bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mSelectedTab.getCallback().onTabSelected(mSelectedTab, trans); 477bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 478bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 479bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 480bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (!trans.isEmpty()) { 481bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell trans.commit(); 482bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 483bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 484bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 485bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 486bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public Tab getSelectedTab() { 487bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mSelectedTab; 488bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 489bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 490bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 491bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public Tab getTabAt(int index) { 492bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mTabs.get(index); 493bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 494bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 495bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 496bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public int getTabCount() { 497bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mTabs.size(); 498bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 499bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 500bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 5016b730d46a744ec1621bd294eb626b10b11090ffbChris Banes public Context getThemedContext() { 5026b730d46a744ec1621bd294eb626b10b11090ffbChris Banes if (mThemedContext == null) { 5036b730d46a744ec1621bd294eb626b10b11090ffbChris Banes TypedValue outValue = new TypedValue(); 5046b730d46a744ec1621bd294eb626b10b11090ffbChris Banes Resources.Theme currentTheme = mContext.getTheme(); 5056b730d46a744ec1621bd294eb626b10b11090ffbChris Banes currentTheme.resolveAttribute(R.attr.actionBarWidgetTheme, outValue, true); 5066b730d46a744ec1621bd294eb626b10b11090ffbChris Banes final int targetThemeRes = outValue.resourceId; 5076b730d46a744ec1621bd294eb626b10b11090ffbChris Banes 5086b730d46a744ec1621bd294eb626b10b11090ffbChris Banes if (targetThemeRes != 0) { 5096b730d46a744ec1621bd294eb626b10b11090ffbChris Banes mThemedContext = new ContextThemeWrapper(mContext, targetThemeRes); 5106b730d46a744ec1621bd294eb626b10b11090ffbChris Banes } else { 5116b730d46a744ec1621bd294eb626b10b11090ffbChris Banes mThemedContext = mContext; 5126b730d46a744ec1621bd294eb626b10b11090ffbChris Banes } 5136b730d46a744ec1621bd294eb626b10b11090ffbChris Banes } 5146b730d46a744ec1621bd294eb626b10b11090ffbChris Banes return mThemedContext; 5156b730d46a744ec1621bd294eb626b10b11090ffbChris Banes } 5166b730d46a744ec1621bd294eb626b10b11090ffbChris Banes 5176b730d46a744ec1621bd294eb626b10b11090ffbChris Banes @Override 518bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public int getHeight() { 519bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mContainerView.getHeight(); 520bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 521bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 522bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 523bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void show() { 524bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (mHiddenByApp) { 525bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mHiddenByApp = false; 526bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell updateVisibility(false); 527bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 528bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 529bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 5308123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes void showForActionMode() { 531d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (!mShowingForMode) { 532d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mShowingForMode = true; 533d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes updateVisibility(false); 534d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 535d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 536d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 537bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 538bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void hide() { 539bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell if (!mHiddenByApp) { 540bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mHiddenByApp = true; 541bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell updateVisibility(false); 542bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 543bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 544bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 5458123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes void hideForActionMode() { 546d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mShowingForMode) { 547d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mShowingForMode = false; 548d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes updateVisibility(false); 549d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 550d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 551d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 552bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 553bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public boolean isShowing() { 554bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell return mNowShowing; 555bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 556bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 557bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 558bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) { 559bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mMenuVisibilityListeners.add(listener); 560bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 561bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 562bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell @Override 563bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) { 564bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell mMenuVisibilityListeners.remove(listener); 565bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 566bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 567d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public ActionMode startActionMode(ActionMode.Callback callback) { 568d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 569d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode.finish(); 570d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 571d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 572d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mContextView.killMode(); 573d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes ActionModeImpl mode = new ActionModeImpl(callback); 574d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mode.dispatchOnCreate()) { 575d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mode.invalidate(); 576d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mContextView.initForMode(mode); 577d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes animateToMode(true); 578d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { 579d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mSplitView.getVisibility() != View.VISIBLE) { 580d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mSplitView.setVisibility(View.VISIBLE); 581d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 582d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 583d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 584d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode = mode; 585d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mode; 586d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 587d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return null; 588d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 589d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 590d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes void animateToMode(boolean toActionMode) { 591d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (toActionMode) { 592d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes showForActionMode(); 593d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } else { 594d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes hideForActionMode(); 595d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 596d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 597d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionView.animateToVisibility(toActionMode ? View.INVISIBLE : View.VISIBLE); 598d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mContextView.animateToVisibility(toActionMode ? View.VISIBLE : View.GONE); 599d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mTabScrollView != null && !mActionView.hasEmbeddedTabs() && mActionView.isCollapsed()) { 600d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mTabScrollView.setVisibility(toActionMode ? View.GONE : View.VISIBLE); 601d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 602d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 603d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 604ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani /** 605ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani * @hide 606ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani */ 607ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public class TabImpl extends ActionBar.Tab { 60820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 609ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private ActionBar.TabListener mCallback; 610ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private Object mTag; 611ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private Drawable mIcon; 612ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private CharSequence mText; 613ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private CharSequence mContentDesc; 614ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private int mPosition = -1; 615ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private View mCustomView; 616ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 617ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 618ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Object getTag() { 619ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mTag; 620ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 621bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 622ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 623ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Tab setTag(Object tag) { 624ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTag = tag; 625ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return this; 626ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 627bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 628ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public ActionBar.TabListener getCallback() { 629ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mCallback; 630ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 631bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 632ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 633ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Tab setTabListener(ActionBar.TabListener callback) { 634ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCallback = callback; 635ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return this; 636ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 637bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 638ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 639ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public View getCustomView() { 640ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mCustomView; 641ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 642bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 643ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 644ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Tab setCustomView(View view) { 645ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCustomView = view; 646ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mPosition >= 0) { 647ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTabScrollView.updateTab(mPosition); 648ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 649ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return this; 650ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 651bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 652ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 653ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Tab setCustomView(int layoutResId) { 654ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return setCustomView(LayoutInflater.from(getThemedContext()) 65520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns .inflate(layoutResId, null)); 656ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 657bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 658ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 659ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Drawable getIcon() { 660ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mIcon; 661ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 662bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 663ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 664ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public int getPosition() { 665ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mPosition; 666ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 667bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 668ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setPosition(int position) { 669ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mPosition = position; 670ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 671bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 672ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 673ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public CharSequence getText() { 674ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mText; 675ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 676bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 677ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 678ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Tab setIcon(Drawable icon) { 679ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mIcon = icon; 680ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mPosition >= 0) { 681ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTabScrollView.updateTab(mPosition); 682ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 683ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return this; 684ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 685bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 686ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 687ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Tab setIcon(int resId) { 688ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return setIcon(mContext.getResources().getDrawable(resId)); 689ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 690bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 691ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 692ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Tab setText(CharSequence text) { 693ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mText = text; 694ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mPosition >= 0) { 695ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTabScrollView.updateTab(mPosition); 696ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 697ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return this; 698ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 699bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 700ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 701ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Tab setText(int resId) { 702ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return setText(mContext.getResources().getText(resId)); 703ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 704bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 705ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 706ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void select() { 707ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani selectTab(this); 708ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 709bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 710ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 711ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Tab setContentDescription(int resId) { 712ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return setContentDescription(mContext.getResources().getText(resId)); 713ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 714bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 715ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 716ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Tab setContentDescription(CharSequence contentDesc) { 717ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContentDesc = contentDesc; 718ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mPosition >= 0) { 719ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTabScrollView.updateTab(mPosition); 720ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 721ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return this; 722ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 723bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 724ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 725ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public CharSequence getContentDescription() { 726ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mContentDesc; 727ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 728bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 729bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 730d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes class ActionModeImpl extends ActionMode implements MenuBuilder.Callback { 73120ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 732ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private ActionMode.Callback mCallback; 733ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private MenuBuilder mMenu; 734ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private WeakReference<View> mCustomView; 735ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 736ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public ActionModeImpl(ActionMode.Callback callback) { 737ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCallback = callback; 738ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mMenu = new MenuBuilder(getThemedContext()) 73930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell .setDefaultShowAsAction(SupportMenuItem.SHOW_AS_ACTION_IF_ROOM); 740ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mMenu.setCallback(this); 741ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 742bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 743ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 744ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public MenuInflater getMenuInflater() { 745d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return new SupportMenuInflater(getThemedContext()); 746ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 747bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 748ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 749ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public Menu getMenu() { 750ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mMenu; 751ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 752b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns 753ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 754ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void finish() { 755ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mActionMode != this) { 756ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // Not the active action mode - no-op 757ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return; 758ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 759bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 760ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // If this change in state is going to cause the action bar 761ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // to be hidden, defer the onDestroy callback until the animation 762ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // is finished and associated relayout is about to happen. This lets 763ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // apps better anticipate visibility and layout behavior. 764ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (!checkShowingFlags(mHiddenByApp, mHiddenBySystem, false)) { 765ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // With the current state but the action bar hidden, our 766ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // overall showing state is going to be false. 767ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mDeferredDestroyActionMode = this; 768ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mDeferredModeDestroyCallback = mCallback; 769ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } else { 770ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCallback.onDestroyActionMode(this); 771ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 772ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCallback = null; 773d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes animateToMode(false); 774bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 775ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // Clear out the context mode views after the animation finishes 776ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.closeMode(); 777ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mActionView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 778bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 779ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mActionMode = null; 780ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 781bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 782ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 783ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void invalidate() { 784d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mMenu.stopDispatchingItemsChanged(); 785ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani try { 786ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCallback.onPrepareActionMode(this, mMenu); 787ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } finally { 788ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mMenu.startDispatchingItemsChanged(); 789ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 790ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 791bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 792ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean dispatchOnCreate() { 793ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mMenu.stopDispatchingItemsChanged(); 794ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani try { 795ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mCallback.onCreateActionMode(this, mMenu); 796ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } finally { 797d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mMenu.startDispatchingItemsChanged(); 798ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 799ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 800bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 801ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 802ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setCustomView(View view) { 803ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.setCustomView(view); 804ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mCustomView = new WeakReference<View>(view); 805ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 806bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 807ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 808ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setSubtitle(CharSequence subtitle) { 809ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.setSubtitle(subtitle); 810ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 811bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 812ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 813ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setTitle(CharSequence title) { 814ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.setTitle(title); 815ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 816bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 817ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 818ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setTitle(int resId) { 819ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setTitle(mContext.getResources().getString(resId)); 820ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 821bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 822ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 823ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setSubtitle(int resId) { 824ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setSubtitle(mContext.getResources().getString(resId)); 825ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 826bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 827ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 828ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public CharSequence getTitle() { 829ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mContextView.getTitle(); 830ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 831bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 832ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 833ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public CharSequence getSubtitle() { 834ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mContextView.getSubtitle(); 835ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 836bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 837ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 838ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setTitleOptionalHint(boolean titleOptional) { 839ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani super.setTitleOptionalHint(titleOptional); 840ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.setTitleOptional(titleOptional); 841ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 842bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 843ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 844ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean isTitleOptional() { 845ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mContextView.isTitleOptional(); 846ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 847bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 848ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 849ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public View getCustomView() { 850ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mCustomView != null ? mCustomView.get() : null; 851ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 852bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 853ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { 854ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mCallback != null) { 855ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mCallback.onActionItemClicked(this, item); 856ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } else { 857ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return false; 858ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 859ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 860bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 861ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 862ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void onMenuModeChange(MenuBuilder menu) { 863ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mCallback == null) { 864ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return; 865ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 866ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani invalidate(); 867ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.showOverflowMenu(); 868ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 869bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 870ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 871ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 872bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 873ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean onSubMenuSelected(SubMenuBuilder subMenu) { 874ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mCallback == null) { 875ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return false; 876ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 877bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 878ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (!subMenu.hasVisibleItems()) { 879ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return true; 880ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 881ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 882ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani //new MenuPopupHelper(getThemedContext(), subMenu).show(); 883ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return true; 884ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 885ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 886ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void onCloseSubMenu(SubMenuBuilder menu) { 887ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 888ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 889ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void onMenuModeChange(Menu menu) { 890ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mCallback == null) { 891ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return; 892ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 893ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani invalidate(); 894ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContextView.showOverflowMenu(); 895ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 896b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns } 897b17b7b75ce2989f50a12ef00f198276e30b9c780Trevor Johns 898ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private void ensureTabsExist() { 899ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mTabScrollView != null) { 900ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return; 901ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 902ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 903ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani ScrollingTabContainerView tabScroller = new ScrollingTabContainerView(mContext); 904ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 905ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mHasEmbeddedTabs) { 906ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani tabScroller.setVisibility(View.VISIBLE); 907ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mActionView.setEmbeddedTabView(tabScroller); 908ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } else { 909ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (getNavigationMode() == NAVIGATION_MODE_TABS) { 910ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani tabScroller.setVisibility(View.VISIBLE); 911ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } else { 912ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani tabScroller.setVisibility(View.GONE); 913ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 914ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mContainerView.setTabContainer(tabScroller); 915ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 916ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTabScrollView = tabScroller; 917bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 918bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 919ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private void configureTab(Tab tab, int position) { 920ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final TabImpl tabi = (TabImpl) tab; 921ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final ActionBar.TabListener callback = tabi.getCallback(); 922ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 923ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (callback == null) { 924ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani throw new IllegalStateException("Action Bar Tab must have a Callback"); 925ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 926bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 927ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani tabi.setPosition(position); 928ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTabs.add(position, tabi); 929bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 930ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int count = mTabs.size(); 931ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani for (int i = position + 1; i < count; i++) { 932ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTabs.get(i).setPosition(i); 933ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 934bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 935bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 936ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private void cleanupTabs() { 937ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mSelectedTab != null) { 938ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani selectTab(null); 939ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 940ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTabs.clear(); 941ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mTabScrollView != null) { 942ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTabScrollView.removeAllTabs(); 943ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 944ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mSavedTabPosition = INVALID_POSITION; 945bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 946bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 947ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private static boolean checkShowingFlags(boolean hiddenByApp, boolean hiddenBySystem, 94820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns boolean showingForMode) { 949ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (showingForMode) { 950ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return true; 951ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } else if (hiddenByApp || hiddenBySystem) { 952ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return false; 953ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } else { 954ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return true; 955ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 956bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 957bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 958ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private void updateVisibility(boolean fromSystem) { 959ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // Based on the current state, should we be hidden or shown? 9608123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes final boolean shown = checkShowingFlags(mHiddenByApp, mHiddenBySystem, mShowingForMode); 961bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 962ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (shown) { 963ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (!mNowShowing) { 964ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mNowShowing = true; 965ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani doShow(fromSystem); 966ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 967ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } else { 968ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mNowShowing) { 969ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mNowShowing = false; 970ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani doHide(fromSystem); 971ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 972ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 973bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 974bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 975a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes public void setShowHideAnimationEnabled(boolean enabled) { 976a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes mShowHideAnimationEnabled = enabled; 977a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (!enabled) { 978a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes mTopVisibilityView.clearAnimation(); 979a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (mSplitView != null) { 980a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes mSplitView.clearAnimation(); 981a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 982a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 983a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 984a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 985ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void doShow(boolean fromSystem) { 986a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes mTopVisibilityView.clearAnimation(); 987a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (mTopVisibilityView.getVisibility() == View.VISIBLE) { 988a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes return; 989a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 990a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 9918123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes final boolean animate = isShowHideAnimationEnabled() || fromSystem; 9928123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes 9938123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes if (animate) { 994ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.abc_slide_in_top); 995a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes mTopVisibilityView.startAnimation(anim); 996a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 997ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTopVisibilityView.setVisibility(View.VISIBLE); 998a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 999a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (mSplitView != null && mSplitView.getVisibility() != View.VISIBLE) { 10008123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes if (animate) { 1001ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.abc_slide_in_bottom); 1002a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes mSplitView.startAnimation(anim); 1003a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 1004a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes mSplitView.setVisibility(View.VISIBLE); 1005a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 1006ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1007bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 1008ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void doHide(boolean fromSystem) { 1009a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes mTopVisibilityView.clearAnimation(); 1010a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (mTopVisibilityView.getVisibility() == View.GONE) { 1011a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes return; 1012a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 1013a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 10148123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes final boolean animate = isShowHideAnimationEnabled() || fromSystem; 10158123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes 10168123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes if (animate) { 1017ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.abc_slide_out_top); 1018a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes mTopVisibilityView.startAnimation(anim); 1019a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 1020176a17e30644b1d5a4206cc462268d151e43949bChris Banes mTopVisibilityView.setVisibility(View.GONE); 1021a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 1022a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (mSplitView != null && mSplitView.getVisibility() != View.GONE) { 10238123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes if (animate) { 1024ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes Animation anim = AnimationUtils 1025ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes .loadAnimation(mContext, R.anim.abc_slide_out_bottom); 1026a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes mSplitView.startAnimation(anim); 1027a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 1028a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes mSplitView.setVisibility(View.GONE); 1029a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 1030ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 1031bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 10328123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes boolean isShowHideAnimationEnabled() { 10338123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes return mShowHideAnimationEnabled; 10348123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes } 10358123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes 1036bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell} 1037