189e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell/*
289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * Copyright (C) 2010 The Android Open Source Project
389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell *
489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * Licensed under the Apache License, Version 2.0 (the "License");
589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * you may not use this file except in compliance with the License.
689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * You may obtain a copy of the License at
789e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell *
889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell *      http://www.apache.org/licenses/LICENSE-2.0
989e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell *
1089e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * Unless required by applicable law or agreed to in writing, software
1189e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * distributed under the License is distributed on an "AS IS" BASIS,
1289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * See the License for the specific language governing permissions and
1489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * limitations under the License.
1589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell */
1689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
1789e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellpackage com.android.internal.app;
1889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
199b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powellimport android.animation.ValueAnimator;
209b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powellimport android.view.ViewParent;
21b8139af3dcae80c0030afd0354dc424a7c72c3d9Adam Powellimport com.android.internal.view.ActionBarPolicy;
222c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powellimport com.android.internal.view.menu.MenuBuilder;
232c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powellimport com.android.internal.view.menu.MenuPopupHelper;
242c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powellimport com.android.internal.view.menu.SubMenuBuilder;
2501feaee3d9767ef1185783877e92244f14d7d4baAdam Powellimport com.android.internal.widget.ActionBarContainer;
2689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellimport com.android.internal.widget.ActionBarContextView;
273a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackbornimport com.android.internal.widget.ActionBarOverlayLayout;
2889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellimport com.android.internal.widget.ActionBarView;
29f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powellimport com.android.internal.widget.ScrollingTabContainerView;
3089e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
31d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powellimport android.animation.Animator;
32d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powellimport android.animation.Animator.AnimatorListener;
3307e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powellimport android.animation.AnimatorListenerAdapter;
34d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powellimport android.animation.AnimatorSet;
35e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powellimport android.animation.ObjectAnimator;
3689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellimport android.app.ActionBar;
37661c908e4e26c99adc2cab7558a02129eaee059dAdam Powellimport android.app.Activity;
38dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powellimport android.app.Dialog;
39661c908e4e26c99adc2cab7558a02129eaee059dAdam Powellimport android.app.FragmentTransaction;
40dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powellimport android.content.Context;
41f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powellimport android.content.res.Configuration;
4288ab69780f58e4b32d497266b2ad646a4d74827bAdam Powellimport android.content.res.Resources;
4389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellimport android.graphics.drawable.Drawable;
440e94b5151d817e600a888448a662208b29b5ef46Adam Powellimport android.os.Handler;
45139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackbornimport android.util.Log;
4688ab69780f58e4b32d497266b2ad646a4d74827bAdam Powellimport android.util.TypedValue;
476e34636749217654f43221885afb7a29bb5ca96aAdam Powellimport android.view.ActionMode;
4888ab69780f58e4b32d497266b2ad646a4d74827bAdam Powellimport android.view.ContextThemeWrapper;
4932555f347974711aac1f0c9acc0f06e8676d9362Adam Powellimport android.view.LayoutInflater;
5089e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellimport android.view.Menu;
519168f0b170c6a99371ae46e7d3f5d66c8c4c930dAdam Powellimport android.view.MenuInflater;
5289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellimport android.view.MenuItem;
5389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellimport android.view.View;
543a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackbornimport android.view.ViewGroup;
55e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powellimport android.view.Window;
5686ed436b83d6b71ff00d1c3db910f2952018489eAdam Powellimport android.view.accessibility.AccessibilityEvent;
578eedb8bf603ed313e3c3b39292dfae908ff60af5Dianne Hackbornimport android.view.animation.AnimationUtils;
5889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellimport android.widget.SpinnerAdapter;
5989e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
6029ed7575c2129974a57ad77b3531bc5995940c6cAdam Powellimport java.lang.ref.WeakReference;
61661c908e4e26c99adc2cab7558a02129eaee059dAdam Powellimport java.util.ArrayList;
62661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
6389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell/**
6489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * ActionBarImpl is the ActionBar implementation used
6589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * by devices of all screen sizes. If it detects a compatible decor,
6689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * it will split contextual modes across both the ActionBarView at
6789e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * the top of the screen and a horizontal LinearLayout at the bottom
6889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell * which is normally hidden.
6989e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell */
7089e0645b4157961e8c465eb9c819f965fdb453d8Adam Powellpublic class ActionBarImpl extends ActionBar {
71d814504979c989915888a777606c3c68c0bab316Adam Powell    private static final String TAG = "ActionBarImpl";
72661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
73dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powell    private Context mContext;
7488ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell    private Context mThemedContext;
75661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    private Activity mActivity;
76dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powell    private Dialog mDialog;
77661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
783a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    private ActionBarOverlayLayout mOverlayLayout;
7901feaee3d9767ef1185783877e92244f14d7d4baAdam Powell    private ActionBarContainer mContainerView;
8089e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    private ActionBarView mActionView;
81640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    private ActionBarContextView mContextView;
82640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    private ActionBarContainer mSplitView;
83e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell    private View mContentView;
84f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell    private ScrollingTabContainerView mTabScrollView;
85661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
86661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    private ArrayList<TabImpl> mTabs = new ArrayList<TabImpl>();
87661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
88661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    private TabImpl mSelectedTab;
890c24a5514c1ff143a223720a090b19a86a75945fAdam Powell    private int mSavedTabPosition = INVALID_POSITION;
9089e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
91dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    private boolean mDisplayHomeAsUpSet;
92dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell
93060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell    ActionModeImpl mActionMode;
94060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell    ActionMode mDeferredDestroyActionMode;
95060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell    ActionMode.Callback mDeferredModeDestroyCallback;
9689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
978515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    private boolean mLastMenuVisibility;
988515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    private ArrayList<OnMenuVisibilityListener> mMenuVisibilityListeners =
998515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell            new ArrayList<OnMenuVisibilityListener>();
1008515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell
10189e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    private static final int CONTEXT_DISPLAY_NORMAL = 0;
10289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    private static final int CONTEXT_DISPLAY_SPLIT = 1;
10389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
1040c24a5514c1ff143a223720a090b19a86a75945fAdam Powell    private static final int INVALID_POSITION = -1;
1050c24a5514c1ff143a223720a090b19a86a75945fAdam Powell
10689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    private int mContextDisplayMode;
107f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell    private boolean mHasEmbeddedTabs;
1080e94b5151d817e600a888448a662208b29b5ef46Adam Powell
1090e94b5151d817e600a888448a662208b29b5ef46Adam Powell    final Handler mHandler = new Handler();
110f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell    Runnable mTabSelector;
111d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell
1123a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    private int mCurWindowVisibility = View.VISIBLE;
1133a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
114df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn    private boolean mContentAnimations = true;
115139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    private boolean mHiddenByApp;
116139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    private boolean mHiddenBySystem;
117139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    private boolean mShowingForMode;
118139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
119139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    private boolean mNowShowing = true;
120139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
12107e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell    private Animator mCurrentShowAnim;
12250efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell    private boolean mShowHideAnimationEnabled;
123d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell
12407e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell    final AnimatorListener mHideListener = new AnimatorListenerAdapter() {
125e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell        @Override
126e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell        public void onAnimationEnd(Animator animation) {
127df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn            if (mContentAnimations && mContentView != null) {
128e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell                mContentView.setTranslationY(0);
1299b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell                mContainerView.setTranslationY(0);
130e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell            }
131993a63abb9ffa95de16f2788fccb440805d1ecb7Adam Powell            if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) {
132993a63abb9ffa95de16f2788fccb440805d1ecb7Adam Powell                mSplitView.setVisibility(View.GONE);
133993a63abb9ffa95de16f2788fccb440805d1ecb7Adam Powell            }
1349b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mContainerView.setVisibility(View.GONE);
13501feaee3d9767ef1185783877e92244f14d7d4baAdam Powell            mContainerView.setTransitioning(false);
13607e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell            mCurrentShowAnim = null;
137060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell            completeDeferredDestroyActionMode();
138139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            if (mOverlayLayout != null) {
139139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                mOverlayLayout.requestFitSystemWindows();
140139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            }
141e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell        }
142e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell    };
143e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell
14407e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell    final AnimatorListener mShowListener = new AnimatorListenerAdapter() {
145e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell        @Override
146e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell        public void onAnimationEnd(Animator animation) {
14707e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell            mCurrentShowAnim = null;
1489b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mContainerView.requestLayout();
1499b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        }
1509b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    };
1519b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell
1529b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    final ValueAnimator.AnimatorUpdateListener mUpdateListener =
1539b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            new ValueAnimator.AnimatorUpdateListener() {
1549b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        @Override
1559b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        public void onAnimationUpdate(ValueAnimator animation) {
1569b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            final ViewParent parent = mContainerView.getParent();
1579b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            ((View) parent).invalidate();
158e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell        }
159e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell    };
160e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell
161661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    public ActionBarImpl(Activity activity) {
162661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        mActivity = activity;
163e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell        Window window = activity.getWindow();
164e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell        View decor = window.getDecorView();
165df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn        boolean overlayMode = mActivity.getWindow().hasFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
1669b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        init(decor);
167df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn        if (!overlayMode) {
168e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell            mContentView = decor.findViewById(android.R.id.content);
169e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell        }
170dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powell    }
171dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powell
172dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powell    public ActionBarImpl(Dialog dialog) {
173dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powell        mDialog = dialog;
1749b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        init(dialog.getWindow().getDecorView());
175dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powell    }
176dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powell
1779b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    private void init(View decor) {
178dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powell        mContext = decor.getContext();
1793a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        mOverlayLayout = (ActionBarOverlayLayout) decor.findViewById(
1803a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                com.android.internal.R.id.action_bar_overlay_layout);
1813a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (mOverlayLayout != null) {
1829b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mOverlayLayout.setActionBar(this);
1833a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
18489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        mActionView = (ActionBarView) decor.findViewById(com.android.internal.R.id.action_bar);
185640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        mContextView = (ActionBarContextView) decor.findViewById(
18689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell                com.android.internal.R.id.action_context_bar);
18701feaee3d9767ef1185783877e92244f14d7d4baAdam Powell        mContainerView = (ActionBarContainer) decor.findViewById(
188d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell                com.android.internal.R.id.action_bar_container);
189640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        mSplitView = (ActionBarContainer) decor.findViewById(
190640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell                com.android.internal.R.id.split_action_bar);
19108f194bc011bc3d88934088a7ac67f52559a77a2Steve Block
192640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        if (mActionView == null || mContextView == null || mContainerView == null) {
19389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell            throw new IllegalStateException(getClass().getSimpleName() + " can only be used " +
19489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell                    "with a compatible window decor layout");
19589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        }
1960e94b5151d817e600a888448a662208b29b5ef46Adam Powell
197640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        mActionView.setContextView(mContextView);
1989b4bee0f14bbd137b0797127aff2df46a6321ec5Adam Powell        mContextDisplayMode = mActionView.isSplitActionBar() ?
1999b4bee0f14bbd137b0797127aff2df46a6321ec5Adam Powell                CONTEXT_DISPLAY_SPLIT : CONTEXT_DISPLAY_NORMAL;
200dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell
201d40423a7adff41463fb4a563becc0bd77fe9919cAdam Powell        // This was initially read from the action bar style
202d40423a7adff41463fb4a563becc0bd77fe9919cAdam Powell        final int current = mActionView.getDisplayOptions();
203d40423a7adff41463fb4a563becc0bd77fe9919cAdam Powell        final boolean homeAsUp = (current & DISPLAY_HOME_AS_UP) != 0;
204d40423a7adff41463fb4a563becc0bd77fe9919cAdam Powell        if (homeAsUp) {
205d40423a7adff41463fb4a563becc0bd77fe9919cAdam Powell            mDisplayHomeAsUpSet = true;
206d40423a7adff41463fb4a563becc0bd77fe9919cAdam Powell        }
207d40423a7adff41463fb4a563becc0bd77fe9919cAdam Powell
208b8139af3dcae80c0030afd0354dc424a7c72c3d9Adam Powell        ActionBarPolicy abp = ActionBarPolicy.get(mContext);
209d40423a7adff41463fb4a563becc0bd77fe9919cAdam Powell        setHomeButtonEnabled(abp.enableHomeButtonByDefault() || homeAsUp);
210b8139af3dcae80c0030afd0354dc424a7c72c3d9Adam Powell        setHasEmbeddedTabs(abp.hasEmbeddedTabs());
211f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell    }
212f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell
213f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell    public void onConfigurationChanged(Configuration newConfig) {
214b8139af3dcae80c0030afd0354dc424a7c72c3d9Adam Powell        setHasEmbeddedTabs(ActionBarPolicy.get(mContext).hasEmbeddedTabs());
215f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell    }
216f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell
217f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell    private void setHasEmbeddedTabs(boolean hasEmbeddedTabs) {
218f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell        mHasEmbeddedTabs = hasEmbeddedTabs;
219f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        // Switch tab layout configuration if needed
220f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        if (!mHasEmbeddedTabs) {
221f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            mActionView.setEmbeddedTabView(null);
222f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            mContainerView.setTabContainer(mTabScrollView);
223f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        } else {
224f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            mContainerView.setTabContainer(null);
225f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            mActionView.setEmbeddedTabView(mTabScrollView);
226f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        }
227f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell        final boolean isInTabMode = getNavigationMode() == NAVIGATION_MODE_TABS;
228f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell        if (mTabScrollView != null) {
2293a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            if (isInTabMode) {
2303a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                mTabScrollView.setVisibility(View.VISIBLE);
2313a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                if (mOverlayLayout != null) {
2323a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    mOverlayLayout.requestFitSystemWindows();
2333a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                }
2343a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            } else {
2353a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                mTabScrollView.setVisibility(View.GONE);
2363a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
237f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell        }
238f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell        mActionView.setCollapsable(!mHasEmbeddedTabs && isInTabMode);
239f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell    }
240f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell
2413a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    public boolean hasNonEmbeddedTabs() {
2423a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        return !mHasEmbeddedTabs && getNavigationMode() == NAVIGATION_MODE_TABS;
2433a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
2443a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
245f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell    private void ensureTabsExist() {
246f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        if (mTabScrollView != null) {
247f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            return;
248f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        }
249f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell
250f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell        ScrollingTabContainerView tabScroller = new ScrollingTabContainerView(mContext);
251f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell
252f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        if (mHasEmbeddedTabs) {
253f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            tabScroller.setVisibility(View.VISIBLE);
254f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            mActionView.setEmbeddedTabView(tabScroller);
255f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        } else {
2563a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            if (getNavigationMode() == NAVIGATION_MODE_TABS) {
2573a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                tabScroller.setVisibility(View.VISIBLE);
2583a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                if (mOverlayLayout != null) {
2593a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    mOverlayLayout.requestFitSystemWindows();
2603a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                }
2613a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            } else {
2623a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                tabScroller.setVisibility(View.GONE);
2633a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
264dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell            mContainerView.setTabContainer(tabScroller);
265dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell        }
266f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        mTabScrollView = tabScroller;
26789e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    }
26889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
269060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell    void completeDeferredDestroyActionMode() {
270060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell        if (mDeferredModeDestroyCallback != null) {
271060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell            mDeferredModeDestroyCallback.onDestroyActionMode(mDeferredDestroyActionMode);
272060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell            mDeferredDestroyActionMode = null;
273060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell            mDeferredModeDestroyCallback = null;
274060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell        }
275060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell    }
276060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell
2773a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    public void setWindowVisibility(int visibility) {
2783a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        mCurWindowVisibility = visibility;
2793a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
2803a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
28150efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell    /**
28250efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell     * Enables or disables animation between show/hide states.
28350efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell     * If animation is disabled using this method, animations in progress
28450efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell     * will be finished.
28550efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell     *
28650efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell     * @param enabled true to animate, false to not animate.
28750efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell     */
28850efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell    public void setShowHideAnimationEnabled(boolean enabled) {
28950efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell        mShowHideAnimationEnabled = enabled;
29007e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell        if (!enabled && mCurrentShowAnim != null) {
29107e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell            mCurrentShowAnim.end();
29250efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell        }
29350efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell    }
29450efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell
2958515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
2968515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        mMenuVisibilityListeners.add(listener);
2978515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    }
2988515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell
2998515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
3008515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        mMenuVisibilityListeners.remove(listener);
3018515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    }
3028515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell
3038515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    public void dispatchMenuVisibilityChanged(boolean isVisible) {
3048515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        if (isVisible == mLastMenuVisibility) {
3058515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell            return;
3068515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        }
3078515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        mLastMenuVisibility = isVisible;
3088515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell
3098515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        final int count = mMenuVisibilityListeners.size();
3108515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        for (int i = 0; i < count; i++) {
3118515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell            mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible);
3128515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        }
3138515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    }
3148515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell
315a66c7b04567a584d73bc4dba2711f5d815e4932dAdam Powell    @Override
3163f476b34049d062942eafcf48396f593e00bd324Adam Powell    public void setCustomView(int resId) {
317f242368f38b21479763d6e07174547c610a51c5cAdam Powell        setCustomView(LayoutInflater.from(getThemedContext()).inflate(resId, mActionView, false));
3183f476b34049d062942eafcf48396f593e00bd324Adam Powell    }
3193f476b34049d062942eafcf48396f593e00bd324Adam Powell
3203f476b34049d062942eafcf48396f593e00bd324Adam Powell    @Override
3213f476b34049d062942eafcf48396f593e00bd324Adam Powell    public void setDisplayUseLogoEnabled(boolean useLogo) {
3223f476b34049d062942eafcf48396f593e00bd324Adam Powell        setDisplayOptions(useLogo ? DISPLAY_USE_LOGO : 0, DISPLAY_USE_LOGO);
3233f476b34049d062942eafcf48396f593e00bd324Adam Powell    }
3243f476b34049d062942eafcf48396f593e00bd324Adam Powell
3253f476b34049d062942eafcf48396f593e00bd324Adam Powell    @Override
3263f476b34049d062942eafcf48396f593e00bd324Adam Powell    public void setDisplayShowHomeEnabled(boolean showHome) {
3273f476b34049d062942eafcf48396f593e00bd324Adam Powell        setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME);
3283f476b34049d062942eafcf48396f593e00bd324Adam Powell    }
3293f476b34049d062942eafcf48396f593e00bd324Adam Powell
3303f476b34049d062942eafcf48396f593e00bd324Adam Powell    @Override
3313f476b34049d062942eafcf48396f593e00bd324Adam Powell    public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) {
3323f476b34049d062942eafcf48396f593e00bd324Adam Powell        setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP);
3333f476b34049d062942eafcf48396f593e00bd324Adam Powell    }
3343f476b34049d062942eafcf48396f593e00bd324Adam Powell
3353f476b34049d062942eafcf48396f593e00bd324Adam Powell    @Override
3363f476b34049d062942eafcf48396f593e00bd324Adam Powell    public void setDisplayShowTitleEnabled(boolean showTitle) {
3373f476b34049d062942eafcf48396f593e00bd324Adam Powell        setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE);
3383f476b34049d062942eafcf48396f593e00bd324Adam Powell    }
3393f476b34049d062942eafcf48396f593e00bd324Adam Powell
3403f476b34049d062942eafcf48396f593e00bd324Adam Powell    @Override
3413f476b34049d062942eafcf48396f593e00bd324Adam Powell    public void setDisplayShowCustomEnabled(boolean showCustom) {
3423f476b34049d062942eafcf48396f593e00bd324Adam Powell        setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM);
3433f476b34049d062942eafcf48396f593e00bd324Adam Powell    }
3443f476b34049d062942eafcf48396f593e00bd324Adam Powell
3453f476b34049d062942eafcf48396f593e00bd324Adam Powell    @Override
346c29f4e52c3377924df26910cce3ff26278d1f484Adam Powell    public void setHomeButtonEnabled(boolean enable) {
347c29f4e52c3377924df26910cce3ff26278d1f484Adam Powell        mActionView.setHomeButtonEnabled(enable);
348dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    }
349dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell
350dae7824c4b78d02159c6ad0896f246942d7b3d8cAdam Powell    @Override
351a66c7b04567a584d73bc4dba2711f5d815e4932dAdam Powell    public void setTitle(int resId) {
352dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powell        setTitle(mContext.getString(resId));
353a66c7b04567a584d73bc4dba2711f5d815e4932dAdam Powell    }
354a66c7b04567a584d73bc4dba2711f5d815e4932dAdam Powell
355a66c7b04567a584d73bc4dba2711f5d815e4932dAdam Powell    @Override
356a66c7b04567a584d73bc4dba2711f5d815e4932dAdam Powell    public void setSubtitle(int resId) {
357dec9dfd0f9f9ae23e4f126d765178fbd26a9eadbAdam Powell        setSubtitle(mContext.getString(resId));
358a66c7b04567a584d73bc4dba2711f5d815e4932dAdam Powell    }
359a66c7b04567a584d73bc4dba2711f5d815e4932dAdam Powell
360178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell    public void setSelectedNavigationItem(int position) {
361178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell        switch (mActionView.getNavigationMode()) {
362178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell        case NAVIGATION_MODE_TABS:
363178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell            selectTab(mTabs.get(position));
364178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell            break;
3659ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        case NAVIGATION_MODE_LIST:
366178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell            mActionView.setDropdownSelectedPosition(position);
367178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell            break;
368178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell        default:
369178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell            throw new IllegalStateException(
3709ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell                    "setSelectedNavigationIndex not valid for current navigation mode");
371178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell        }
372178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell    }
373178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell
3749ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    public void removeAllTabs() {
3759ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        cleanupTabs();
376178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell    }
377178097727fab0f41810b1ffd4baf84ff8ed32c42Adam Powell
378661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    private void cleanupTabs() {
379661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        if (mSelectedTab != null) {
380661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell            selectTab(null);
381661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        }
3822b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        mTabs.clear();
383d21aa12e8eb9d46ee92bf408b4b48386c6bf062dAdam Powell        if (mTabScrollView != null) {
384d21aa12e8eb9d46ee92bf408b4b48386c6bf062dAdam Powell            mTabScrollView.removeAllTabs();
385d21aa12e8eb9d46ee92bf408b4b48386c6bf062dAdam Powell        }
3860c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        mSavedTabPosition = INVALID_POSITION;
387661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    }
388661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
3890e94b5151d817e600a888448a662208b29b5ef46Adam Powell    public void setTitle(CharSequence title) {
3900e94b5151d817e600a888448a662208b29b5ef46Adam Powell        mActionView.setTitle(title);
3910e94b5151d817e600a888448a662208b29b5ef46Adam Powell    }
3920e94b5151d817e600a888448a662208b29b5ef46Adam Powell
3930e94b5151d817e600a888448a662208b29b5ef46Adam Powell    public void setSubtitle(CharSequence subtitle) {
3940e94b5151d817e600a888448a662208b29b5ef46Adam Powell        mActionView.setSubtitle(subtitle);
3950e94b5151d817e600a888448a662208b29b5ef46Adam Powell    }
3960e94b5151d817e600a888448a662208b29b5ef46Adam Powell
39789e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    public void setDisplayOptions(int options) {
398dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        if ((options & DISPLAY_HOME_AS_UP) != 0) {
399dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            mDisplayHomeAsUpSet = true;
400dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        }
40189e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        mActionView.setDisplayOptions(options);
40289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    }
4030e94b5151d817e600a888448a662208b29b5ef46Adam Powell
40489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    public void setDisplayOptions(int options, int mask) {
40589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        final int current = mActionView.getDisplayOptions();
406dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        if ((mask & DISPLAY_HOME_AS_UP) != 0) {
407dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            mDisplayHomeAsUpSet = true;
408dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        }
40989e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        mActionView.setDisplayOptions((options & mask) | (current & ~mask));
41089e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    }
41189e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
41289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    public void setBackgroundDrawable(Drawable d) {
413f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell        mContainerView.setPrimaryBackground(d);
414f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell    }
415f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell
416f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell    public void setStackedBackgroundDrawable(Drawable d) {
417f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell        mContainerView.setStackedBackground(d);
418f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell    }
419f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell
420f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell    public void setSplitBackgroundDrawable(Drawable d) {
421f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell        if (mSplitView != null) {
422f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell            mSplitView.setSplitBackground(d);
423f88b915567a37c481c4c50a6cc57e1ec0e7cf50dAdam Powell        }
42489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    }
42589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
426ef704447689cb991049d31e67be41e66e8a44b6dAdam Powell    public View getCustomView() {
42789e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        return mActionView.getCustomNavigationView();
42889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    }
42989e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
43089e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    public CharSequence getTitle() {
43189e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        return mActionView.getTitle();
43289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    }
43389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
43489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    public CharSequence getSubtitle() {
43589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        return mActionView.getSubtitle();
43689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    }
43789e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
43889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    public int getNavigationMode() {
43989e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        return mActionView.getNavigationMode();
44089e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    }
44189e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
44289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    public int getDisplayOptions() {
44389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        return mActionView.getDisplayOptions();
44489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    }
44589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
4465d27977f9da482627ceb19317a2cd70467aff046Adam Powell    public ActionMode startActionMode(ActionMode.Callback callback) {
4475d27977f9da482627ceb19317a2cd70467aff046Adam Powell        if (mActionMode != null) {
4485d27977f9da482627ceb19317a2cd70467aff046Adam Powell            mActionMode.finish();
4496e34636749217654f43221885afb7a29bb5ca96aAdam Powell        }
4503461b32a1c1fc844cdf5c9586dbadb354f449980Adam Powell
451640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        mContextView.killMode();
4525ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell        ActionModeImpl mode = new ActionModeImpl(callback);
4535ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell        if (mode.dispatchOnCreate()) {
4542c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell            mode.invalidate();
455640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            mContextView.initForMode(mode);
456640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            animateToMode(true);
4571ab418a222e1834c4b1312fde355e41a1947af0dAdam Powell            if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) {
45889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell                // TODO animate this
4593a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                if (mSplitView.getVisibility() != View.VISIBLE) {
4603a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    mSplitView.setVisibility(View.VISIBLE);
4613a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    if (mOverlayLayout != null) {
4623a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                        mOverlayLayout.requestFitSystemWindows();
4633a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    }
4643a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                }
46589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell            }
46686ed436b83d6b71ff00d1c3db910f2952018489eAdam Powell            mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
4675d27977f9da482627ceb19317a2cd70467aff046Adam Powell            mActionMode = mode;
468ac695c608ba620e2362f57126d7be453cf5b7e1bAdam Powell            return mode;
46989e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        }
470ac695c608ba620e2362f57126d7be453cf5b7e1bAdam Powell        return null;
47189e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    }
47289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
473661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    private void configureTab(Tab tab, int position) {
474661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        final TabImpl tabi = (TabImpl) tab;
4752b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        final ActionBar.TabListener callback = tabi.getCallback();
4762b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell
4772b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        if (callback == null) {
4782b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell            throw new IllegalStateException("Action Bar Tab must have a Callback");
4792b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        }
480661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
481661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        tabi.setPosition(position);
482661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        mTabs.add(position, tabi);
483661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
48481b8944131946e451b31665652de8cc71d81ea07Adam Powell        final int count = mTabs.size();
48581b8944131946e451b31665652de8cc71d81ea07Adam Powell        for (int i = position + 1; i < count; i++) {
48681b8944131946e451b31665652de8cc71d81ea07Adam Powell            mTabs.get(i).setPosition(i);
487661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        }
488661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    }
489661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
490661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    @Override
491661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    public void addTab(Tab tab) {
49281b8944131946e451b31665652de8cc71d81ea07Adam Powell        addTab(tab, mTabs.isEmpty());
493661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    }
494661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
495661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    @Override
4962b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell    public void addTab(Tab tab, int position) {
49781b8944131946e451b31665652de8cc71d81ea07Adam Powell        addTab(tab, position, mTabs.isEmpty());
49881b8944131946e451b31665652de8cc71d81ea07Adam Powell    }
49981b8944131946e451b31665652de8cc71d81ea07Adam Powell
50081b8944131946e451b31665652de8cc71d81ea07Adam Powell    @Override
50181b8944131946e451b31665652de8cc71d81ea07Adam Powell    public void addTab(Tab tab, boolean setSelected) {
502f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        ensureTabsExist();
503f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        mTabScrollView.addTab(tab, setSelected);
50481b8944131946e451b31665652de8cc71d81ea07Adam Powell        configureTab(tab, mTabs.size());
50581b8944131946e451b31665652de8cc71d81ea07Adam Powell        if (setSelected) {
50681b8944131946e451b31665652de8cc71d81ea07Adam Powell            selectTab(tab);
50781b8944131946e451b31665652de8cc71d81ea07Adam Powell        }
50881b8944131946e451b31665652de8cc71d81ea07Adam Powell    }
50981b8944131946e451b31665652de8cc71d81ea07Adam Powell
51081b8944131946e451b31665652de8cc71d81ea07Adam Powell    @Override
51181b8944131946e451b31665652de8cc71d81ea07Adam Powell    public void addTab(Tab tab, int position, boolean setSelected) {
512f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        ensureTabsExist();
513f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        mTabScrollView.addTab(tab, position, setSelected);
514661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        configureTab(tab, position);
51581b8944131946e451b31665652de8cc71d81ea07Adam Powell        if (setSelected) {
51681b8944131946e451b31665652de8cc71d81ea07Adam Powell            selectTab(tab);
51781b8944131946e451b31665652de8cc71d81ea07Adam Powell        }
518661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    }
519661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
520661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    @Override
521661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    public Tab newTab() {
522661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        return new TabImpl();
523661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    }
524661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
525661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    @Override
526661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    public void removeTab(Tab tab) {
527661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        removeTabAt(tab.getPosition());
528661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    }
529661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
530661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    @Override
531661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    public void removeTabAt(int position) {
532f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        if (mTabScrollView == null) {
533f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            // No tabs around to remove
534f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            return;
535f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        }
536f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell
5370c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        int selectedTabPosition = mSelectedTab != null
5380c24a5514c1ff143a223720a090b19a86a75945fAdam Powell                ? mSelectedTab.getPosition() : mSavedTabPosition;
539f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell        mTabScrollView.removeTabAt(position);
5400d8ec1d739e15c232c58a5a5de605685830c287eAdam Powell        TabImpl removedTab = mTabs.remove(position);
5410d8ec1d739e15c232c58a5a5de605685830c287eAdam Powell        if (removedTab != null) {
5420d8ec1d739e15c232c58a5a5de605685830c287eAdam Powell            removedTab.setPosition(-1);
5430d8ec1d739e15c232c58a5a5de605685830c287eAdam Powell        }
544661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
545661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        final int newTabCount = mTabs.size();
546661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        for (int i = position; i < newTabCount; i++) {
547661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell            mTabs.get(i).setPosition(i);
548661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        }
549661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
5500c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        if (selectedTabPosition == position) {
5510c24a5514c1ff143a223720a090b19a86a75945fAdam Powell            selectTab(mTabs.isEmpty() ? null : mTabs.get(Math.max(0, position - 1)));
5520c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        }
553661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    }
554661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
555661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    @Override
556661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    public void selectTab(Tab tab) {
5570c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        if (getNavigationMode() != NAVIGATION_MODE_TABS) {
5580c24a5514c1ff143a223720a090b19a86a75945fAdam Powell            mSavedTabPosition = tab != null ? tab.getPosition() : INVALID_POSITION;
5590c24a5514c1ff143a223720a090b19a86a75945fAdam Powell            return;
5600c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        }
5610c24a5514c1ff143a223720a090b19a86a75945fAdam Powell
56248e7b458694acdf3a4fc58e62437f1dbc4f29d83Dianne Hackborn        final FragmentTransaction trans = mActivity.getFragmentManager().beginTransaction()
5630c24a5514c1ff143a223720a090b19a86a75945fAdam Powell                .disallowAddToBackStack();
5647f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell
5657f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell        if (mSelectedTab == tab) {
5667f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell            if (mSelectedTab != null) {
5677f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell                mSelectedTab.getCallback().onTabReselected(mSelectedTab, trans);
568f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell                mTabScrollView.animateToTab(tab.getPosition());
5697f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell            }
5707f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell        } else {
571f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            mTabScrollView.setTabSelected(tab != null ? tab.getPosition() : Tab.INVALID_POSITION);
5727f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell            if (mSelectedTab != null) {
5737f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell                mSelectedTab.getCallback().onTabUnselected(mSelectedTab, trans);
5747f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell            }
5757f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell            mSelectedTab = (TabImpl) tab;
5767f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell            if (mSelectedTab != null) {
5777f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell                mSelectedTab.getCallback().onTabSelected(mSelectedTab, trans);
5787f9b90542e05b350d14bd63c16446c8ce2baf407Adam Powell            }
5792b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        }
5802b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell
5812b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        if (!trans.isEmpty()) {
5822b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell            trans.commit();
5832b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        }
5842b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell    }
5852b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell
5862b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell    @Override
5872b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell    public Tab getSelectedTab() {
5882b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        return mSelectedTab;
589661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    }
590661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
5916b336f835d637853800b94689375a03f337139a4Adam Powell    @Override
5926b336f835d637853800b94689375a03f337139a4Adam Powell    public int getHeight() {
59358c5dc1bd6e0600fab0c4e80ae1f4c4f8426ad6dAdam Powell        return mContainerView.getHeight();
5946b336f835d637853800b94689375a03f337139a4Adam Powell    }
5956b336f835d637853800b94689375a03f337139a4Adam Powell
596df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn    public void enableContentAnimations(boolean enabled) {
597df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn        mContentAnimations = enabled;
598df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn    }
599df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn
6006b336f835d637853800b94689375a03f337139a4Adam Powell    @Override
6016b336f835d637853800b94689375a03f337139a4Adam Powell    public void show() {
602139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if (mHiddenByApp) {
603139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            mHiddenByApp = false;
604139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            updateVisibility(false);
605139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        }
606139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    }
607139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
608139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    private void showForActionMode() {
609139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if (!mShowingForMode) {
610139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            mShowingForMode = true;
611139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            if (mOverlayLayout != null) {
612139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                mOverlayLayout.setShowingForActionMode(true);
613139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            }
614139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            updateVisibility(false);
615139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        }
616139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    }
617139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
618139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    public void showForSystem() {
619139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if (mHiddenBySystem) {
620139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            mHiddenBySystem = false;
621139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            updateVisibility(true);
622139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        }
623139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    }
624139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
625139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    @Override
626139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    public void hide() {
627139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if (!mHiddenByApp) {
628139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            mHiddenByApp = true;
629139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            updateVisibility(false);
630139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        }
631139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    }
632139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
633139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    private void hideForActionMode() {
634139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if (mShowingForMode) {
635139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            mShowingForMode = false;
636139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            if (mOverlayLayout != null) {
637139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                mOverlayLayout.setShowingForActionMode(false);
638139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            }
639139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            updateVisibility(false);
640139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        }
64107e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell    }
64207e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell
643139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    public void hideForSystem() {
644139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if (!mHiddenBySystem) {
645139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            mHiddenBySystem = true;
646139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            updateVisibility(true);
647139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        }
648139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    }
649139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
650139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    private static boolean checkShowingFlags(boolean hiddenByApp, boolean hiddenBySystem,
651139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            boolean showingForMode) {
652139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if (showingForMode) {
653139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            return true;
654139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        } else if (hiddenByApp || hiddenBySystem) {
655139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            return false;
656139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        } else {
657139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            return true;
658139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        }
659139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    }
660139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
661139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    private void updateVisibility(boolean fromSystem) {
662139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        // Based on the current state, should we be hidden or shown?
663139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        final boolean shown = checkShowingFlags(mHiddenByApp, mHiddenBySystem,
664139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                mShowingForMode);
665139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
666139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if (shown) {
667139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            if (!mNowShowing) {
668139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                mNowShowing = true;
669139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                doShow(fromSystem);
670139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            }
671139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        } else {
672139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            if (mNowShowing) {
673139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                mNowShowing = false;
674139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                doHide(fromSystem);
675139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            }
676139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        }
677139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    }
678139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
679139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    public void doShow(boolean fromSystem) {
68007e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell        if (mCurrentShowAnim != null) {
68107e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell            mCurrentShowAnim.end();
68245f1e08c348ccb129bcc25e438c05421f7123f41Adam Powell        }
6839b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        mContainerView.setVisibility(View.VISIBLE);
68450efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell
6853a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (mCurWindowVisibility == View.VISIBLE && (mShowHideAnimationEnabled
686139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                || fromSystem)) {
6879b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mContainerView.setTranslationY(0); // because we're about to ask its window loc
6889b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            float startingY = -mContainerView.getHeight();
689e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase            if (fromSystem) {
690e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase                int topLeft[] = {0, 0};
6919b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell                mContainerView.getLocationInWindow(topLeft);
692e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase                startingY -= topLeft[1];
693e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase            }
6949b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mContainerView.setTranslationY(startingY);
69550efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell            AnimatorSet anim = new AnimatorSet();
6969b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            ObjectAnimator a = ObjectAnimator.ofFloat(mContainerView, View.TRANSLATION_Y, 0);
6979b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            a.addUpdateListener(mUpdateListener);
6989b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            AnimatorSet.Builder b = anim.play(a);
699df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn            if (mContentAnimations && mContentView != null) {
7009b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell                b.with(ObjectAnimator.ofFloat(mContentView, View.TRANSLATION_Y,
701e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase                        startingY, 0));
70250efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell            }
7031ab418a222e1834c4b1312fde355e41a1947af0dAdam Powell            if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) {
7048eedb8bf603ed313e3c3b39292dfae908ff60af5Dianne Hackborn                mSplitView.setTranslationY(mSplitView.getHeight());
705993a63abb9ffa95de16f2788fccb440805d1ecb7Adam Powell                mSplitView.setVisibility(View.VISIBLE);
7069b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell                b.with(ObjectAnimator.ofFloat(mSplitView, View.TRANSLATION_Y, 0));
707640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            }
7088eedb8bf603ed313e3c3b39292dfae908ff60af5Dianne Hackborn            anim.setInterpolator(AnimationUtils.loadInterpolator(mContext,
709e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase                    com.android.internal.R.interpolator.decelerate_cubic));
710e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase            anim.setDuration(250);
711139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // If this is being shown from the system, add a small delay.
712139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // This is because we will also be animating in the status bar,
713139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // and these two elements can't be done in lock-step.  So we give
714139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // a little time for the status bar to start its animation before
715139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // the action bar animates.  (This corresponds to the corresponding
716139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // case when hiding, where the status bar has a small delay before
717139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // starting.)
71850efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell            anim.addListener(mShowListener);
71907e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell            mCurrentShowAnim = anim;
72050efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell            anim.start();
72150efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell        } else {
7229b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mContainerView.setAlpha(1);
7239b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mContainerView.setTranslationY(0);
724df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn            if (mContentAnimations && mContentView != null) {
72580d55065b1577db732c259e0e4d745617b6f1bffDianne Hackborn                mContentView.setTranslationY(0);
72680d55065b1577db732c259e0e4d745617b6f1bffDianne Hackborn            }
72780d55065b1577db732c259e0e4d745617b6f1bffDianne Hackborn            if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) {
72880d55065b1577db732c259e0e4d745617b6f1bffDianne Hackborn                mSplitView.setAlpha(1);
72980d55065b1577db732c259e0e4d745617b6f1bffDianne Hackborn                mSplitView.setTranslationY(0);
73080d55065b1577db732c259e0e4d745617b6f1bffDianne Hackborn                mSplitView.setVisibility(View.VISIBLE);
73180d55065b1577db732c259e0e4d745617b6f1bffDianne Hackborn            }
73250efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell            mShowListener.onAnimationEnd(null);
733e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell        }
734139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if (mOverlayLayout != null) {
735139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            mOverlayLayout.requestFitSystemWindows();
736139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        }
7376b336f835d637853800b94689375a03f337139a4Adam Powell    }
7386b336f835d637853800b94689375a03f337139a4Adam Powell
739139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    public void doHide(boolean fromSystem) {
74007e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell        if (mCurrentShowAnim != null) {
74107e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell            mCurrentShowAnim.end();
742e6ec7329b9ee23eaa1183071c9660d66651f2404Adam Powell        }
74350efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell
7443a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (mCurWindowVisibility == View.VISIBLE && (mShowHideAnimationEnabled
745139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                || fromSystem)) {
7469b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mContainerView.setAlpha(1);
74701feaee3d9767ef1185783877e92244f14d7d4baAdam Powell            mContainerView.setTransitioning(true);
74850efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell            AnimatorSet anim = new AnimatorSet();
7499b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            float endingY = -mContainerView.getHeight();
750e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase            if (fromSystem) {
751e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase                int topLeft[] = {0, 0};
7529b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell                mContainerView.getLocationInWindow(topLeft);
753e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase                endingY -= topLeft[1];
754e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase            }
7559b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            ObjectAnimator a = ObjectAnimator.ofFloat(mContainerView, View.TRANSLATION_Y, endingY);
7569b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            a.addUpdateListener(mUpdateListener);
7579b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            AnimatorSet.Builder b = anim.play(a);
758df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn            if (mContentAnimations && mContentView != null) {
7599b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell                b.with(ObjectAnimator.ofFloat(mContentView, View.TRANSLATION_Y,
760e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase                        0, endingY));
76150efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell            }
7621ab418a222e1834c4b1312fde355e41a1947af0dAdam Powell            if (mSplitView != null && mSplitView.getVisibility() == View.VISIBLE) {
763640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell                mSplitView.setAlpha(1);
7649b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell                b.with(ObjectAnimator.ofFloat(mSplitView, View.TRANSLATION_Y,
7658eedb8bf603ed313e3c3b39292dfae908ff60af5Dianne Hackborn                        mSplitView.getHeight()));
766640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            }
7678eedb8bf603ed313e3c3b39292dfae908ff60af5Dianne Hackborn            anim.setInterpolator(AnimationUtils.loadInterpolator(mContext,
768e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase                    com.android.internal.R.interpolator.accelerate_cubic));
769e8118e17b2f088f2ebecfbe050c4ffa80f686abfChet Haase            anim.setDuration(250);
77050efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell            anim.addListener(mHideListener);
77107e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell            mCurrentShowAnim = anim;
77250efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell            anim.start();
77350efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell        } else {
77450efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell            mHideListener.onAnimationEnd(null);
77550efbed668a9410cdec51f7c8604fa44ed267fedAdam Powell        }
7766b336f835d637853800b94689375a03f337139a4Adam Powell    }
7776b336f835d637853800b94689375a03f337139a4Adam Powell
7786b336f835d637853800b94689375a03f337139a4Adam Powell    public boolean isShowing() {
779139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        return mNowShowing;
780139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    }
781139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
782139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    public boolean isSystemShowing() {
783139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        return !mHiddenBySystem;
784d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell    }
785d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell
786640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    void animateToMode(boolean toActionMode) {
787060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell        if (toActionMode) {
788139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            showForActionMode();
789139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        } else {
790139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            hideForActionMode();
79107e1f988c053e37dcde2479052d8bedb9db5bec2Adam Powell        }
792d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell
793640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        mActionView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE);
794640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        mContextView.animateToVisibility(toActionMode ? View.VISIBLE : View.GONE);
795f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell        if (mTabScrollView != null && !mActionView.hasEmbeddedTabs() && mActionView.isCollapsed()) {
796f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell            mTabScrollView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE);
797f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell        }
7986b336f835d637853800b94689375a03f337139a4Adam Powell    }
7996b336f835d637853800b94689375a03f337139a4Adam Powell
80088ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell    public Context getThemedContext() {
80188ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell        if (mThemedContext == null) {
80288ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            TypedValue outValue = new TypedValue();
80388ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            Resources.Theme currentTheme = mContext.getTheme();
80488ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            currentTheme.resolveAttribute(com.android.internal.R.attr.actionBarWidgetTheme,
80588ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell                    outValue, true);
80688ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            final int targetThemeRes = outValue.resourceId;
80788ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell
80888ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            if (targetThemeRes != 0 && mContext.getThemeResId() != targetThemeRes) {
80988ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell                mThemedContext = new ContextThemeWrapper(mContext, targetThemeRes);
81088ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            } else {
81188ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell                mThemedContext = mContext;
81288ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell            }
81388ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell        }
81488ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell        return mThemedContext;
81588ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell    }
81688ab69780f58e4b32d497266b2ad646a4d74827bAdam Powell
81727cba3895282ac1da1f1d43d37d53f8113527569Adam Powell    @Override
81827cba3895282ac1da1f1d43d37d53f8113527569Adam Powell    public boolean isTitleTruncated() {
81927cba3895282ac1da1f1d43d37d53f8113527569Adam Powell        return mActionView != null && mActionView.isTitleTruncated();
82027cba3895282ac1da1f1d43d37d53f8113527569Adam Powell    }
82127cba3895282ac1da1f1d43d37d53f8113527569Adam Powell
822e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    @Override
823e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    public void setHomeAsUpIndicator(Drawable indicator) {
824e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell        mActionView.setHomeAsUpIndicator(indicator);
825e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    }
826e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell
827e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    @Override
828e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    public void setHomeAsUpIndicator(int resId) {
829e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell        mActionView.setHomeAsUpIndicator(resId);
830e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    }
831e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell
832e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    @Override
833e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    public void setHomeActionContentDescription(CharSequence description) {
834e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell        mActionView.setHomeActionContentDescription(description);
835e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    }
836e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell
837e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    @Override
838e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    public void setHomeActionContentDescription(int resId) {
839e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell        mActionView.setHomeActionContentDescription(resId);
840e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell    }
841e0e2f4fd3ac8e70e341ae52d6376d8d67bd9edceAdam Powell
84289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    /**
84389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell     * @hide
84489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell     */
8455d27977f9da482627ceb19317a2cd70467aff046Adam Powell    public class ActionModeImpl extends ActionMode implements MenuBuilder.Callback {
8466e34636749217654f43221885afb7a29bb5ca96aAdam Powell        private ActionMode.Callback mCallback;
8472c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell        private MenuBuilder mMenu;
84829ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell        private WeakReference<View> mCustomView;
84989e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
8505d27977f9da482627ceb19317a2cd70467aff046Adam Powell        public ActionModeImpl(ActionMode.Callback callback) {
85189e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell            mCallback = callback;
852f242368f38b21479763d6e07174547c610a51c5cAdam Powell            mMenu = new MenuBuilder(getThemedContext())
8534d9861e7ec8488634d316b20981464de2ab7b6feAdam Powell                    .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
8542c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell            mMenu.setCallback(this);
85589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        }
8569168f0b170c6a99371ae46e7d3f5d66c8c4c930dAdam Powell
8579168f0b170c6a99371ae46e7d3f5d66c8c4c930dAdam Powell        @Override
8589168f0b170c6a99371ae46e7d3f5d66c8c4c930dAdam Powell        public MenuInflater getMenuInflater() {
859f242368f38b21479763d6e07174547c610a51c5cAdam Powell            return new MenuInflater(getThemedContext());
8609168f0b170c6a99371ae46e7d3f5d66c8c4c930dAdam Powell        }
8619168f0b170c6a99371ae46e7d3f5d66c8c4c930dAdam Powell
86289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        @Override
86389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        public Menu getMenu() {
86489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell            return mMenu;
86589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        }
86689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
86789e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        @Override
86889e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        public void finish() {
8695d27977f9da482627ceb19317a2cd70467aff046Adam Powell            if (mActionMode != this) {
8705d27977f9da482627ceb19317a2cd70467aff046Adam Powell                // Not the active action mode - no-op
87193b6bc3d15180d3ff88fe769375717043b283e64Adam Powell                return;
87293b6bc3d15180d3ff88fe769375717043b283e64Adam Powell            }
87393b6bc3d15180d3ff88fe769375717043b283e64Adam Powell
874139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // If this change in state is going to cause the action bar
875139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // to be hidden, defer the onDestroy callback until the animation
876139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // is finished and associated relayout is about to happen. This lets
877139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // apps better anticipate visibility and layout behavior.
878139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            if (!checkShowingFlags(mHiddenByApp, mHiddenBySystem, false)) {
879139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                // With the current state but the action bar hidden, our
880139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                // overall showing state is going to be false.
881060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell                mDeferredDestroyActionMode = this;
882060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell                mDeferredModeDestroyCallback = mCallback;
883060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell            } else {
884060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell                mCallback.onDestroyActionMode(this);
885060e3cad11541bc534ead73dae5c23ef242060cdAdam Powell            }
886d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell            mCallback = null;
887640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            animateToMode(false);
8880e94b5151d817e600a888448a662208b29b5ef46Adam Powell
8890e94b5151d817e600a888448a662208b29b5ef46Adam Powell            // Clear out the context mode views after the animation finishes
890640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            mContextView.closeMode();
89186ed436b83d6b71ff00d1c3db910f2952018489eAdam Powell            mActionView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
892f6ce6a9bacbb220c6ea7b552c481237f23e64ae7Adam Powell
8935d27977f9da482627ceb19317a2cd70467aff046Adam Powell            mActionMode = null;
89489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        }
89589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
89689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        @Override
89789e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        public void invalidate() {
8985ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell            mMenu.stopDispatchingItemsChanged();
8995ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell            try {
9005ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell                mCallback.onPrepareActionMode(this, mMenu);
9015ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell            } finally {
9025ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell                mMenu.startDispatchingItemsChanged();
9035ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell            }
9045ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell        }
9055ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell
9065ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell        public boolean dispatchOnCreate() {
9075ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell            mMenu.stopDispatchingItemsChanged();
9085ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell            try {
9095ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell                return mCallback.onCreateActionMode(this, mMenu);
9105ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell            } finally {
9115ee36c48be8d36c5f4025202e8ede561c9ad3abaAdam Powell                mMenu.startDispatchingItemsChanged();
91289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell            }
91389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        }
91489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
91589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        @Override
91689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        public void setCustomView(View view) {
917640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            mContextView.setCustomView(view);
91829ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell            mCustomView = new WeakReference<View>(view);
91989e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        }
92089e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
92189e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        @Override
92289e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        public void setSubtitle(CharSequence subtitle) {
923640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            mContextView.setSubtitle(subtitle);
92489e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        }
92589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
92689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        @Override
92789e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        public void setTitle(CharSequence title) {
928640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            mContextView.setTitle(title);
92989e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        }
93029ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell
93129ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell        @Override
932c9ae2a24dc1fa274ca0916c91a2e9a2764ba4bb3Adam Powell        public void setTitle(int resId) {
93348e8ac311bdb50a62717b95b40e556b3506068a3Adam Powell            setTitle(mContext.getResources().getString(resId));
934c9ae2a24dc1fa274ca0916c91a2e9a2764ba4bb3Adam Powell        }
935c9ae2a24dc1fa274ca0916c91a2e9a2764ba4bb3Adam Powell
936c9ae2a24dc1fa274ca0916c91a2e9a2764ba4bb3Adam Powell        @Override
937c9ae2a24dc1fa274ca0916c91a2e9a2764ba4bb3Adam Powell        public void setSubtitle(int resId) {
93848e8ac311bdb50a62717b95b40e556b3506068a3Adam Powell            setSubtitle(mContext.getResources().getString(resId));
939c9ae2a24dc1fa274ca0916c91a2e9a2764ba4bb3Adam Powell        }
940c9ae2a24dc1fa274ca0916c91a2e9a2764ba4bb3Adam Powell
941c9ae2a24dc1fa274ca0916c91a2e9a2764ba4bb3Adam Powell        @Override
94229ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell        public CharSequence getTitle() {
943640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            return mContextView.getTitle();
94429ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell        }
94529ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell
94629ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell        @Override
94729ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell        public CharSequence getSubtitle() {
948640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            return mContextView.getSubtitle();
94929ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell        }
95089e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell
95129ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell        @Override
952b98a81f86ab87f1d718f329f03256111fdabd8d1Adam Powell        public void setTitleOptionalHint(boolean titleOptional) {
953785c447b2bc625209706fd128ce61781c3a4183bAdam Powell            super.setTitleOptionalHint(titleOptional);
954b98a81f86ab87f1d718f329f03256111fdabd8d1Adam Powell            mContextView.setTitleOptional(titleOptional);
955b98a81f86ab87f1d718f329f03256111fdabd8d1Adam Powell        }
956b98a81f86ab87f1d718f329f03256111fdabd8d1Adam Powell
957b98a81f86ab87f1d718f329f03256111fdabd8d1Adam Powell        @Override
958b98a81f86ab87f1d718f329f03256111fdabd8d1Adam Powell        public boolean isTitleOptional() {
959b98a81f86ab87f1d718f329f03256111fdabd8d1Adam Powell            return mContextView.isTitleOptional();
960b98a81f86ab87f1d718f329f03256111fdabd8d1Adam Powell        }
961b98a81f86ab87f1d718f329f03256111fdabd8d1Adam Powell
962b98a81f86ab87f1d718f329f03256111fdabd8d1Adam Powell        @Override
96329ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell        public View getCustomView() {
96429ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell            return mCustomView != null ? mCustomView.get() : null;
96529ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell        }
96629ed7575c2129974a57ad77b3531bc5995940c6cAdam Powell
9672c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell        public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
968d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell            if (mCallback != null) {
969d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell                return mCallback.onActionItemClicked(this, item);
970d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell            } else {
971d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell                return false;
972d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell            }
9732c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell        }
9742c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell
9752c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
9762c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell        }
9772c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell
9782c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell        public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
979d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell            if (mCallback == null) {
980d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell                return false;
981d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell            }
982d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell
9832c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell            if (!subMenu.hasVisibleItems()) {
9842c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell                return true;
98589e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell            }
9862c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell
987f242368f38b21479763d6e07174547c610a51c5cAdam Powell            new MenuPopupHelper(getThemedContext(), subMenu).show();
9882c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell            return true;
9892c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell        }
9902c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell
9912c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell        public void onCloseSubMenu(SubMenuBuilder menu) {
9922c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell        }
9932c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell
9942c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell        public void onMenuModeChange(MenuBuilder menu) {
995d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell            if (mCallback == null) {
996d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell                return;
997d8b3f2e8eee5f24de6653a918613674e9495f751Adam Powell            }
998f6148c53f93978af678cc0559a4417b608a33ae1Adam Powell            invalidate();
999640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell            mContextView.showOverflowMenu();
10002c9c9fe806e51f29276e66b8ba40cb4b7a80c3f4Adam Powell        }
1001661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    }
1002661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
1003661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    /**
1004661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell     * @hide
1005661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell     */
1006661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell    public class TabImpl extends ActionBar.Tab {
10072b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        private ActionBar.TabListener mCallback;
10082b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        private Object mTag;
1009661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        private Drawable mIcon;
1010661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        private CharSequence mText;
101194e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell        private CharSequence mContentDesc;
10120d8ec1d739e15c232c58a5a5de605685830c287eAdam Powell        private int mPosition = -1;
10132b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        private View mCustomView;
1014661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
1015661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        @Override
10162b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        public Object getTag() {
10172b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell            return mTag;
10182b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        }
10192b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell
10202b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        @Override
10219ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        public Tab setTag(Object tag) {
10222b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell            mTag = tag;
10239ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell            return this;
10242b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        }
10252b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell
10262b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        public ActionBar.TabListener getCallback() {
10272b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell            return mCallback;
10282b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        }
10292b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell
10302b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        @Override
10319ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        public Tab setTabListener(ActionBar.TabListener callback) {
10322b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell            mCallback = callback;
10339ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell            return this;
10342b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        }
10352b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell
10362b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        @Override
10372b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        public View getCustomView() {
10382b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell            return mCustomView;
10392b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        }
10402b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell
10412b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell        @Override
10429ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        public Tab setCustomView(View view) {
10432b6230e0de4bac2829ac27b19e95ba75c3da82b4Adam Powell            mCustomView = view;
1044f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            if (mPosition >= 0) {
1045f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell                mTabScrollView.updateTab(mPosition);
1046f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            }
10479ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell            return this;
1048661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        }
1049661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
1050661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        @Override
105132555f347974711aac1f0c9acc0f06e8676d9362Adam Powell        public Tab setCustomView(int layoutResId) {
1052f242368f38b21479763d6e07174547c610a51c5cAdam Powell            return setCustomView(LayoutInflater.from(getThemedContext())
1053f242368f38b21479763d6e07174547c610a51c5cAdam Powell                    .inflate(layoutResId, null));
105432555f347974711aac1f0c9acc0f06e8676d9362Adam Powell        }
105532555f347974711aac1f0c9acc0f06e8676d9362Adam Powell
105632555f347974711aac1f0c9acc0f06e8676d9362Adam Powell        @Override
1057661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        public Drawable getIcon() {
1058661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell            return mIcon;
1059661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        }
1060661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
1061661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        @Override
1062661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        public int getPosition() {
1063661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell            return mPosition;
1064661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        }
1065661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
1066661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        public void setPosition(int position) {
1067661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell            mPosition = position;
1068661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        }
1069661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
1070661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        @Override
1071661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        public CharSequence getText() {
1072661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell            return mText;
1073661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        }
1074661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
1075661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        @Override
10769ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        public Tab setIcon(Drawable icon) {
1077661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell            mIcon = icon;
1078f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            if (mPosition >= 0) {
1079f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell                mTabScrollView.updateTab(mPosition);
1080f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            }
10819ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell            return this;
1082661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        }
1083661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
1084661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        @Override
108532555f347974711aac1f0c9acc0f06e8676d9362Adam Powell        public Tab setIcon(int resId) {
108632555f347974711aac1f0c9acc0f06e8676d9362Adam Powell            return setIcon(mContext.getResources().getDrawable(resId));
108732555f347974711aac1f0c9acc0f06e8676d9362Adam Powell        }
108832555f347974711aac1f0c9acc0f06e8676d9362Adam Powell
108932555f347974711aac1f0c9acc0f06e8676d9362Adam Powell        @Override
10909ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        public Tab setText(CharSequence text) {
1091661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell            mText = text;
1092f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            if (mPosition >= 0) {
1093f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell                mTabScrollView.updateTab(mPosition);
1094f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell            }
10959ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell            return this;
1096661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        }
1097661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell
1098661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        @Override
109932555f347974711aac1f0c9acc0f06e8676d9362Adam Powell        public Tab setText(int resId) {
110032555f347974711aac1f0c9acc0f06e8676d9362Adam Powell            return setText(mContext.getResources().getText(resId));
110132555f347974711aac1f0c9acc0f06e8676d9362Adam Powell        }
110232555f347974711aac1f0c9acc0f06e8676d9362Adam Powell
110332555f347974711aac1f0c9acc0f06e8676d9362Adam Powell        @Override
1104661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell        public void select() {
1105661c908e4e26c99adc2cab7558a02129eaee059dAdam Powell            selectTab(this);
110689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell        }
110794e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell
110894e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell        @Override
110994e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell        public Tab setContentDescription(int resId) {
111094e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell            return setContentDescription(mContext.getResources().getText(resId));
111194e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell        }
111294e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell
111394e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell        @Override
111494e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell        public Tab setContentDescription(CharSequence contentDesc) {
111594e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell            mContentDesc = contentDesc;
111694e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell            if (mPosition >= 0) {
111794e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell                mTabScrollView.updateTab(mPosition);
111894e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell            }
111994e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell            return this;
112094e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell        }
112194e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell
112294e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell        @Override
112394e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell        public CharSequence getContentDescription() {
112494e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell            return mContentDesc;
112594e56ef3b8de6ed485546b462559ac862c10eabfAdam Powell        }
112689e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell    }
11279ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell
11289ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    @Override
11299ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    public void setCustomView(View view) {
11309ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        mActionView.setCustomNavigationView(view);
11319ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    }
11329ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell
11339ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    @Override
11349ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    public void setCustomView(View view, LayoutParams layoutParams) {
11359ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        view.setLayoutParams(layoutParams);
11369ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        mActionView.setCustomNavigationView(view);
11379ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    }
11389ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell
11399ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    @Override
11408515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) {
11419ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        mActionView.setDropdownAdapter(adapter);
11429ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        mActionView.setCallback(callback);
11439ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    }
11449ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell
11459ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    @Override
11469ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    public int getSelectedNavigationIndex() {
11479ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        switch (mActionView.getNavigationMode()) {
11489ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell            case NAVIGATION_MODE_TABS:
11490458796f1401732b38660794148f4c5e5602f432Adam Powell                return mSelectedTab != null ? mSelectedTab.getPosition() : -1;
11509ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell            case NAVIGATION_MODE_LIST:
11519ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell                return mActionView.getDropdownSelectedPosition();
11529ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell            default:
11539ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell                return -1;
11549ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        }
11559ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    }
11569ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell
11579ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    @Override
11589ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    public int getNavigationItemCount() {
11599ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        switch (mActionView.getNavigationMode()) {
11609ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell            case NAVIGATION_MODE_TABS:
11619ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell                return mTabs.size();
11629ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell            case NAVIGATION_MODE_LIST:
11639ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell                SpinnerAdapter adapter = mActionView.getDropdownAdapter();
11649ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell                return adapter != null ? adapter.getCount() : 0;
11659ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell            default:
11669ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell                return 0;
11679ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        }
11689ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    }
11699ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell
11709ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    @Override
11710c24a5514c1ff143a223720a090b19a86a75945fAdam Powell    public int getTabCount() {
11720c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        return mTabs.size();
11730c24a5514c1ff143a223720a090b19a86a75945fAdam Powell    }
11740c24a5514c1ff143a223720a090b19a86a75945fAdam Powell
11750c24a5514c1ff143a223720a090b19a86a75945fAdam Powell    @Override
11769ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    public void setNavigationMode(int mode) {
11770c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        final int oldMode = mActionView.getNavigationMode();
11780c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        switch (oldMode) {
11790c24a5514c1ff143a223720a090b19a86a75945fAdam Powell            case NAVIGATION_MODE_TABS:
11800c24a5514c1ff143a223720a090b19a86a75945fAdam Powell                mSavedTabPosition = getSelectedNavigationIndex();
11810c24a5514c1ff143a223720a090b19a86a75945fAdam Powell                selectTab(null);
1182f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell                mTabScrollView.setVisibility(View.GONE);
11830c24a5514c1ff143a223720a090b19a86a75945fAdam Powell                break;
11840c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        }
11853a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (oldMode != mode && !mHasEmbeddedTabs) {
11863a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            if (mOverlayLayout != null) {
11873a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                mOverlayLayout.requestFitSystemWindows();
11883a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
11893a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
11909ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        mActionView.setNavigationMode(mode);
11910c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        switch (mode) {
11920c24a5514c1ff143a223720a090b19a86a75945fAdam Powell            case NAVIGATION_MODE_TABS:
1193f8ac6b7394cfd37f01471bb35475ff2930eee140Adam Powell                ensureTabsExist();
1194f5645cbafe7eed33452d888f16726bee8a0cd9feAdam Powell                mTabScrollView.setVisibility(View.VISIBLE);
11950c24a5514c1ff143a223720a090b19a86a75945fAdam Powell                if (mSavedTabPosition != INVALID_POSITION) {
11960c24a5514c1ff143a223720a090b19a86a75945fAdam Powell                    setSelectedNavigationItem(mSavedTabPosition);
11970c24a5514c1ff143a223720a090b19a86a75945fAdam Powell                    mSavedTabPosition = INVALID_POSITION;
11980c24a5514c1ff143a223720a090b19a86a75945fAdam Powell                }
11990c24a5514c1ff143a223720a090b19a86a75945fAdam Powell                break;
12000c24a5514c1ff143a223720a090b19a86a75945fAdam Powell        }
1201d21aa12e8eb9d46ee92bf408b4b48386c6bf062dAdam Powell        mActionView.setCollapsable(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs);
12029ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    }
12039ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell
12049ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    @Override
12059ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    public Tab getTabAt(int index) {
12069ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell        return mTabs.get(index);
12079ab978713ce86fdaefed2407f4f3c998ab0e3178Adam Powell    }
12080c24a5514c1ff143a223720a090b19a86a75945fAdam Powell
12090c24a5514c1ff143a223720a090b19a86a75945fAdam Powell
12101969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell    @Override
12111969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell    public void setIcon(int resId) {
121245c515b0e962ee8ffc901872bcc9f25599ea0e78Adam Powell        mActionView.setIcon(resId);
12131969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell    }
12140c24a5514c1ff143a223720a090b19a86a75945fAdam Powell
12151969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell    @Override
12161969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell    public void setIcon(Drawable icon) {
12171969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell        mActionView.setIcon(icon);
12181969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell    }
12191969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell
122004fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell    public boolean hasIcon() {
122104fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell        return mActionView.hasIcon();
122204fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell    }
122304fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell
12241969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell    @Override
12251969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell    public void setLogo(int resId) {
122645c515b0e962ee8ffc901872bcc9f25599ea0e78Adam Powell        mActionView.setLogo(resId);
12271969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell    }
12281969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell
12291969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell    @Override
12301969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell    public void setLogo(Drawable logo) {
12311969b8799085322f9ef6e75b78c2c9a5d5944801Adam Powell        mActionView.setLogo(logo);
12320c24a5514c1ff143a223720a090b19a86a75945fAdam Powell    }
1233dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell
123404fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell    public boolean hasLogo() {
123504fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell        return mActionView.hasLogo();
123604fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell    }
123704fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell
1238dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    public void setDefaultDisplayHomeAsUpEnabled(boolean enable) {
1239dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        if (!mDisplayHomeAsUpSet) {
1240dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell            setDisplayHomeAsUpEnabled(enable);
1241dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell        }
1242dd8fab2629131b09367df747afd9a61e42dd1992Adam Powell    }
124389e0645b4157961e8c465eb9c819f965fdb453d8Adam Powell}
1244