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