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