ActionBarActivityDelegateBase.java revision 0b216f2263135782c361e122892a12156d5d2ce1
1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Copyright (C) 2013 The Android Open Source Project 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * you may not use this file except in compliance with the License. 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * You may obtain a copy of the License at 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See the License for the specific language governing permissions and 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * limitations under the License. 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectpackage android.support.v7.app; 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.content.Context; 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.content.res.Configuration; 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.content.res.Resources; 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.content.res.TypedArray; 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.os.Bundle; 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v4.app.NavUtils; 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v4.view.ViewCompat; 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v4.view.ViewConfigurationCompat; 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v4.view.WindowCompat; 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.appcompat.R; 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.app.ToolbarActionBar; 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.app.WindowDecorActionBar; 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.view.StandaloneActionMode; 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.view.menu.ListMenuPresenter; 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.view.menu.MenuBuilder; 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.view.menu.MenuPresenter; 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.view.menu.MenuView; 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.widget.ActionBarContextView; 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.widget.DecorContentParent; 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.widget.ProgressBarCompat; 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.view.ActionMode; 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.widget.Toolbar; 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.util.DisplayMetrics; 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.util.TypedValue; 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.ContextThemeWrapper; 4494442ad4107000e6d49f9b85a46a591495a57632Selim Gurunimport android.view.LayoutInflater; 4594442ad4107000e6d49f9b85a46a591495a57632Selim Gurunimport android.view.Gravity; 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.Menu; 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.MenuItem; 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.View; 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.ViewConfiguration; 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.ViewGroup; 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.ViewStub; 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.Window; 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.accessibility.AccessibilityEvent; 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.widget.FrameLayout; 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.widget.PopupWindow; 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectclass ActionBarActivityDelegateBase extends ActionBarActivityDelegate 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project implements MenuBuilder.Callback { 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private static final String TAG = "ActionBarActivityDelegateBase"; 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private DecorContentParent mDecorContentParent; 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private ActionMenuPresenterCallback mActionMenuPresenterCallback; 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private PanelMenuPresenterCallback mPanelMenuPresenterCallback; 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun private ListMenuPresenter mListMenuPresenter; 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private MenuBuilder mMenu; 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionMode mActionMode; 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionBarContextView mActionModeView; 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PopupWindow mActionModePopup; 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Runnable mShowActionModePopup; 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // true if we have installed a window sub-decor layout. 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private boolean mSubDecorInstalled; 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private ViewGroup mWindowDecor; 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private CharSequence mTitleToSet; 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Used to keep track of Progress Bar Window features 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private boolean mFeatureProgress, mFeatureIndeterminateProgress; 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Used for emulating PanelFeatureState 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private boolean mClosingActionMenu; 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private boolean mPanelIsPrepared; 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private boolean mPanelRefreshMenuContent; 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private Bundle mPanelFrozenActionViewState; 8794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private boolean mInvalidatePanelMenuPosted; 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private final Runnable mInvalidatePanelMenuRunnable = new Runnable() { 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void run() { 9294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun supportInvalidateOptionsMenu(); 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project }; 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private boolean mEnableDefaultActionBarUp; 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionBarActivityDelegateBase(ActionBarActivity activity) { 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project super(activity); 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void onCreate(Bundle savedInstanceState) { 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project super.onCreate(savedInstanceState); 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mWindowDecor = (ViewGroup) mActivity.getWindow().getDecorView(); 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NavUtils.getParentActivityName(mActivity) != null) { 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionBar ab = getSupportActionBar(); 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ab == null) { 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mEnableDefaultActionBarUp = true; 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ab.setDefaultDisplayHomeAsUpEnabled(true); 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public ActionBar createSupportActionBar() { 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ensureSubDecor(); 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionBar ab = new WindowDecorActionBar(mActivity, mOverlayActionBar); 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ab.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp); 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ab; 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void setSupportActionBar(Toolbar toolbar) { 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (getSupportActionBar() instanceof WindowDecorActionBar) { 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project throw new IllegalStateException("This Activity already has an action bar supplied " + 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "by the window decor. Do not request Window.FEATURE_ACTION_BAR and set " + 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "windowActionBar to false in your theme to use a Toolbar instead."); 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ToolbarActionBar tbab = new ToolbarActionBar(toolbar, mActivity.getTitle(), 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mWindowMenuCallback); 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project setSupportActionBar(tbab); 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project setWindowCallback(tbab.getWrappedWindowCallback()); 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tbab.invalidateOptionsMenu(); 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void onConfigurationChanged(Configuration newConfig) { 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // If this is called before sub-decor is installed, ActionBar will not 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // be properly initialized. 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mHasActionBar && mSubDecorInstalled) { 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Note: The action bar will need to access 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // view changes from superclass. 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionBar ab = getSupportActionBar(); 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ab != null) { 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ab.onConfigurationChanged(newConfig); 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void onStop() { 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionBar ab = getSupportActionBar(); 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ab != null) { 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ab.setShowHideAnimationEnabled(false); 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void onPostResume() { 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionBar ab = getSupportActionBar(); 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ab != null) { 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ab.setShowHideAnimationEnabled(true); 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void setContentView(View v) { 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ensureSubDecor(); 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contentParent.removeAllViews(); 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contentParent.addView(v); 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.onSupportContentChanged(); 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void setContentView(int resId) { 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ensureSubDecor(); 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contentParent.removeAllViews(); 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.getLayoutInflater().inflate(resId, contentParent); 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.onSupportContentChanged(); 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void setContentView(View v, ViewGroup.LayoutParams lp) { 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ensureSubDecor(); 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contentParent.removeAllViews(); 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contentParent.addView(v, lp); 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.onSupportContentChanged(); 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void addContentView(View v, ViewGroup.LayoutParams lp) { 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ensureSubDecor(); 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contentParent.addView(v, lp); 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.onSupportContentChanged(); 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void onContentChanged() { 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Ignore all calls to this method as we call onSupportContentChanged manually above 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final void ensureSubDecor() { 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!mSubDecorInstalled) { 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mHasActionBar) { 21394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun mActivity.superSetContentView(R.layout.abc_screen_toolbar); 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ViewGroup root = (ViewGroup) mActivity.findViewById(R.id.action_bar_root); 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root != null && root.getChildCount() == 0) { 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /** 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This needs some explanation. As we can not use the android:theme attribute 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pre-L, we emulate it by manually creating a LayoutInflater using a 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ContextThemeWrapper pointing to actionBarTheme. 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TypedValue outValue = new TypedValue(); 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.getTheme().resolveAttribute(R.attr.actionBarTheme, outValue, true); 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Context themedContext; 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outValue.resourceId != 0) { 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project themedContext = new ContextThemeWrapper(mActivity, outValue.resourceId); 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project themedContext = mActivity; 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project LayoutInflater.from(themedContext) 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project .inflate(R.layout.abc_screen_toolbar_include, root, true); 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent = (DecorContentParent) mActivity 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project .findViewById(R.id.decor_content_parent); 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.setWindowCallback(mWindowMenuCallback); 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /** 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Propagate features to DecorContentParent 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mOverlayActionBar) { 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.initFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY); 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFeatureProgress) { 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.initFeature(Window.FEATURE_PROGRESS); 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFeatureIndeterminateProgress) { 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.initFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (mOverlayActionMode) { 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.superSetContentView(R.layout.abc_screen_simple_overlay_action_mode); 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.superSetContentView(R.layout.abc_screen_simple); 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Change our content FrameLayout to use the android.R.id.content id. 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Useful for fragments. 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project View content = mActivity.findViewById(android.R.id.content); 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content.setId(View.NO_ID); 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project View abcContent = mActivity.findViewById(R.id.action_bar_activity_content); 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project abcContent.setId(android.R.id.content); 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // A title was set before we've install the decor so set it now. 26694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (mTitleToSet != null && mDecorContentParent != null) { 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.setWindowTitle(mTitleToSet); 26894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun mTitleToSet = null; 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project applyFixedSizeWindow(); 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project onSubDecorInstalled(); 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mSubDecorInstalled = true; 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project invalidatePanelMenu(); 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void onSubDecorInstalled() {} 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private void applyFixedSizeWindow() { 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TypedArray a = mActivity.obtainStyledAttributes(R.styleable.Theme); 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TypedValue mFixedWidthMajor = null; 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TypedValue mFixedWidthMinor = null; 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TypedValue mFixedHeightMajor = null; 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TypedValue mFixedHeightMinor = null; 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (a.hasValue(R.styleable.Theme_windowFixedWidthMajor)) { 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFixedWidthMajor == null) mFixedWidthMajor = new TypedValue(); 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project a.getValue(R.styleable.Theme_windowFixedWidthMajor, mFixedWidthMajor); 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (a.hasValue(R.styleable.Theme_windowFixedWidthMinor)) { 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFixedWidthMinor == null) mFixedWidthMinor = new TypedValue(); 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project a.getValue(R.styleable.Theme_windowFixedWidthMinor, mFixedWidthMinor); 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (a.hasValue(R.styleable.Theme_windowFixedHeightMajor)) { 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFixedHeightMajor == null) mFixedHeightMajor = new TypedValue(); 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project a.getValue(R.styleable.Theme_windowFixedHeightMajor, mFixedHeightMajor); 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (a.hasValue(R.styleable.Theme_windowFixedHeightMinor)) { 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFixedHeightMinor == null) mFixedHeightMinor = new TypedValue(); 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project a.getValue(R.styleable.Theme_windowFixedHeightMinor, mFixedHeightMinor); 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics(); 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final boolean isPortrait = metrics.widthPixels < metrics.heightPixels; 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int w = ViewGroup.LayoutParams.MATCH_PARENT; 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int h = ViewGroup.LayoutParams.MATCH_PARENT; 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final TypedValue tvw = isPortrait ? mFixedWidthMinor : mFixedWidthMajor; 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tvw != null && tvw.type != TypedValue.TYPE_NULL) { 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tvw.type == TypedValue.TYPE_DIMENSION) { 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project w = (int) tvw.getDimension(metrics); 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (tvw.type == TypedValue.TYPE_FRACTION) { 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project w = (int) tvw.getFraction(metrics.widthPixels, metrics.widthPixels); 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final TypedValue tvh = isPortrait ? mFixedHeightMajor : mFixedHeightMinor; 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tvh != null && tvh.type != TypedValue.TYPE_NULL) { 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tvh.type == TypedValue.TYPE_DIMENSION) { 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project h = (int) tvh.getDimension(metrics); 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (tvh.type == TypedValue.TYPE_FRACTION) { 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project h = (int) tvh.getFraction(metrics.heightPixels, metrics.heightPixels); 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (w != ViewGroup.LayoutParams.MATCH_PARENT || h != ViewGroup.LayoutParams.MATCH_PARENT) { 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.getWindow().setLayout(w, h); 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project a.recycle(); 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public boolean supportRequestWindowFeature(int featureId) { 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (featureId) { 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case WindowCompat.FEATURE_ACTION_BAR: 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mHasActionBar = true; 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return true; 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case WindowCompat.FEATURE_ACTION_BAR_OVERLAY: 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mOverlayActionBar = true; 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return true; 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case WindowCompat.FEATURE_ACTION_MODE_OVERLAY: 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mOverlayActionMode = true; 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return true; 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case Window.FEATURE_PROGRESS: 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mFeatureProgress = true; 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return true; 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case Window.FEATURE_INDETERMINATE_PROGRESS: 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mFeatureIndeterminateProgress = true; 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return true; 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return mActivity.requestWindowFeature(featureId); 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void onTitleChanged(CharSequence title) { 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mDecorContentParent != null) { 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.setWindowTitle(title); 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (getSupportActionBar() != null) { 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project getSupportActionBar().setTitle(title); 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mTitleToSet = title; 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public View onCreatePanelView(int featureId) { 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project View createdPanelView = null; 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (featureId == Window.FEATURE_OPTIONS_PANEL && preparePanel()) { 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project createdPanelView = (View) getListMenuView(mActivity); 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return createdPanelView; 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public boolean onCreatePanelMenu(int featureId, Menu menu) { 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (featureId != Window.FEATURE_OPTIONS_PANEL) { 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return mWindowMenuCallback.onCreatePanelMenu(featureId, menu); 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return false; 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public boolean onPreparePanel(int featureId, View view, Menu menu) { 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (featureId != Window.FEATURE_OPTIONS_PANEL) { 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return mWindowMenuCallback.onPreparePanel(featureId, view, menu); 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return false; 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void onPanelClosed(int featureId, Menu menu) { 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (featureId == Window.FEATURE_OPTIONS_PANEL) { 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mPanelIsPrepared = false; 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 40694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun @Override 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void onMenuModeChange(MenuBuilder menu) { 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reopenMenu(menu, true); 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public ActionMode startSupportActionMode(ActionMode.Callback callback) { 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (callback == null) { 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project throw new IllegalArgumentException("ActionMode callback can not be null."); 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionMode != null) { 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionMode.finish(); 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionBar ab = getSupportActionBar(); 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ab != null) { 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionMode = ab.startActionMode(wrappedCallback); 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionMode != null) { 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.onSupportActionModeStarted(mActionMode); 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionMode == null) { 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // If the action bar didn't provide an action mode, start the emulated window one 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionMode = startSupportActionModeFromWindow(wrappedCallback); 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return mActionMode; 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void supportInvalidateOptionsMenu() { 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final ActionBar ab = getSupportActionBar(); 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ab != null && ab.invalidateOptionsMenu()) return; 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mMenu != null) { 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Bundle savedActionViewStates = new Bundle(); 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu.saveActionViewStates(savedActionViewStates); 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (savedActionViewStates.size() > 0) { 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mPanelFrozenActionViewState = savedActionViewStates; 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // This will be started again when the panel is prepared. 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu.stopDispatchingItemsChanged(); 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu.clear(); 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mPanelRefreshMenuContent = true; 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Prepare the options panel if we have an action bar 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mDecorContentParent != null) { 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mPanelIsPrepared = false; 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project preparePanel(); 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionMode startSupportActionModeFromWindow(ActionMode.Callback callback) { 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionMode != null) { 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionMode.finish(); 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionMode mode = null; 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionModeView == null) { 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mIsFloating) { 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModeView = new ActionBarContextView(mActivity); 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModePopup = new PopupWindow(mActivity, null, 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project R.attr.actionModePopupWindowStyle); 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModePopup.setContentView(mActionModeView); 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModePopup.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TypedValue heightValue = new TypedValue(); 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.getTheme().resolveAttribute(R.attr.actionBarSize, heightValue, true); 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final int height = TypedValue.complexToDimensionPixelSize(heightValue.data, 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.getResources().getDisplayMetrics()); 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModeView.setContentHeight(height); 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModePopup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mShowActionModePopup = new Runnable() { 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void run() { 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModePopup.showAtLocation( 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModeView, 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0); 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project }; 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ViewStub stub = (ViewStub) mActivity.findViewById(R.id.action_mode_bar_stub); 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stub != null) { 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModeView = (ActionBarContextView) stub.inflate(); 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionModeView != null) { 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModeView.killMode(); 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mode = new StandaloneActionMode(mActivity, mActionModeView, wrappedCallback, 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModePopup == null); 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (callback.onCreateActionMode(mode, mode.getMenu())) { 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mode.invalidate(); 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModeView.initForMode(mode); 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModeView.setVisibility(View.VISIBLE); 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionMode = mode; 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionModePopup != null) { 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.getWindow().getDecorView().post(mShowActionModePopup); 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModeView.sendAccessibilityEvent( 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionMode = null; 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionMode != null && mActivity != null) { 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.onSupportActionModeStarted(mActionMode); 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return mActionMode; 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) { 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mDecorContentParent != null && mDecorContentParent.canShowOverflowMenu() && 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mActivity)) || 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.isOverflowMenuShowPending())) { 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!mDecorContentParent.isOverflowMenuShowing() || !toggleMenuMode) { 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // If we have a menu invalidation pending, do it now. 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mInvalidatePanelMenuPosted) { 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mWindowDecor.removeCallbacks(mInvalidatePanelMenuRunnable); 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mInvalidatePanelMenuRunnable.run(); 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // If we don't have a menu or we're waiting for a full content refresh, 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // forget it. This is a lingering event that no longer matters. 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mMenu != null && !mPanelRefreshMenuContent && preparePanel()) { 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.showOverflowMenu(); 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.hideOverflowMenu(); 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private MenuView getListMenuView(Context context) { 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mMenu == null) { 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return null; 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mPanelMenuPresenterCallback == null) { 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mPanelMenuPresenterCallback = new PanelMenuPresenterCallback(); 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mListMenuPresenter == null) { 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TypedArray a = context.obtainStyledAttributes(R.styleable.Theme); 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final int listPresenterTheme = a.getResourceId( 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project R.styleable.Theme_panelMenuListTheme, 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project R.style.Theme_AppCompat_CompactMenu); 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project a.recycle(); 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mListMenuPresenter = new ListMenuPresenter( 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project R.layout.abc_list_menu_item_layout, listPresenterTheme); 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mListMenuPresenter.setCallback(mPanelMenuPresenterCallback); 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu.addMenuPresenter(mListMenuPresenter, mActivity); 57494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } else { 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Make sure we update the ListView 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mListMenuPresenter.updateMenuView(false); 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mListMenuPresenter.getAdapter().isEmpty()) { 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return null; 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return mListMenuPresenter.getMenuView(mWindowDecor); 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public boolean onBackPressed() { 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Back cancels action modes first. 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionMode != null) { 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionMode.finish(); 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return true; 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Next collapse any expanded action views. 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ActionBar ab = getSupportActionBar(); 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ab != null && ab.collapseActionView()) { 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return true; 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return false; 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void setSupportProgressBarVisibility(boolean visible) { 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON : 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Window.PROGRESS_VISIBILITY_OFF); 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void setSupportProgressBarIndeterminateVisibility(boolean visible) { 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON : 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Window.PROGRESS_VISIBILITY_OFF); 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void setSupportProgressBarIndeterminate(boolean indeterminate) { 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project updateProgressBars(indeterminate ? Window.PROGRESS_INDETERMINATE_ON 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project : Window.PROGRESS_INDETERMINATE_OFF); 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void setSupportProgress(int progress) { 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project updateProgressBars(Window.PROGRESS_START + progress); 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int getHomeAsUpIndicatorAttrId() { 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return R.attr.homeAsUpIndicator; 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /** 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Progress Bar function. Mostly extracted from PhoneWindow.java 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private void updateProgressBars(int value) { 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ProgressBarCompat circularProgressBar = getCircularProgressBar(); 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ProgressBarCompat horizontalProgressBar = getHorizontalProgressBar(); 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == Window.PROGRESS_VISIBILITY_ON) { 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFeatureProgress) { 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int level = horizontalProgressBar.getProgress(); 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ? 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project View.VISIBLE : View.INVISIBLE; 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project horizontalProgressBar.setVisibility(visibility); 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFeatureIndeterminateProgress) { 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project circularProgressBar.setVisibility(View.VISIBLE); 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (value == Window.PROGRESS_VISIBILITY_OFF) { 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFeatureProgress) { 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project horizontalProgressBar.setVisibility(View.GONE); 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFeatureIndeterminateProgress) { 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project circularProgressBar.setVisibility(View.GONE); 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (value == Window.PROGRESS_INDETERMINATE_ON) { 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project horizontalProgressBar.setIndeterminate(true); 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (value == Window.PROGRESS_INDETERMINATE_OFF) { 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project horizontalProgressBar.setIndeterminate(false); 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) { 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // We want to set the progress value before testing for visibility 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // so that when the progress bar becomes visible again, it has the 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // correct level. 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project horizontalProgressBar.setProgress(value - Window.PROGRESS_START); 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value < Window.PROGRESS_END) { 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project showProgressBars(horizontalProgressBar, circularProgressBar); 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hideProgressBars(horizontalProgressBar, circularProgressBar); 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private void showProgressBars(ProgressBarCompat horizontalProgressBar, 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ProgressBarCompat spinnyProgressBar) { 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.INVISIBLE) { 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project spinnyProgressBar.setVisibility(View.VISIBLE); 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Only show the progress bars if the primary progress is not complete 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFeatureProgress && horizontalProgressBar.getProgress() < 10000) { 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project horizontalProgressBar.setVisibility(View.VISIBLE); 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private void hideProgressBars(ProgressBarCompat horizontalProgressBar, 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ProgressBarCompat spinnyProgressBar) { 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.VISIBLE) { 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project spinnyProgressBar.setVisibility(View.INVISIBLE); 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mFeatureProgress && horizontalProgressBar.getVisibility() == View.VISIBLE) { 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project horizontalProgressBar.setVisibility(View.INVISIBLE); 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 69294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private ProgressBarCompat getCircularProgressBar() { 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ProgressBarCompat pb = (ProgressBarCompat) mActivity.findViewById(R.id.progress_circular); 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pb != null) { 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pb.setVisibility(View.INVISIBLE); 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return pb; 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private ProgressBarCompat getHorizontalProgressBar() { 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ProgressBarCompat pb = (ProgressBarCompat) mActivity.findViewById(R.id.progress_horizontal); 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pb != null) { 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pb.setVisibility(View.INVISIBLE); 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return pb; 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private boolean initializePanelMenu() { 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Context context = mActivity; 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mDecorContentParent != null) { 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final TypedValue outValue = new TypedValue(); 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final Resources.Theme baseTheme = context.getTheme(); 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true); 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Resources.Theme widgetTheme = null; 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outValue.resourceId != 0) { 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project widgetTheme = context.getResources().newTheme(); 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project widgetTheme.setTo(baseTheme); 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project widgetTheme.applyStyle(outValue.resourceId, true); 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project widgetTheme.resolveAttribute( 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project R.attr.actionBarWidgetTheme, outValue, true); 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project baseTheme.resolveAttribute( 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project R.attr.actionBarWidgetTheme, outValue, true); 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outValue.resourceId != 0) { 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (widgetTheme == null) { 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project widgetTheme = context.getResources().newTheme(); 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project widgetTheme.setTo(baseTheme); 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project widgetTheme.applyStyle(outValue.resourceId, true); 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (widgetTheme != null) { 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project context = new ContextThemeWrapper(context, 0); 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project context.getTheme().setTo(widgetTheme); 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu = new MenuBuilder(context); 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu.setCallback(this); 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return true; 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private boolean preparePanel() { 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Already prepared (isPrepared will be reset to false later) 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mPanelIsPrepared) { 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return true; 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mDecorContentParent != null) { 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Enforce ordering guarantees around events so that the action bar never 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // dispatches menu-related events before the panel is prepared. 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.setMenuPrepared(); 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Init the panel state's menu--return false if init failed 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mMenu == null || mPanelRefreshMenuContent) { 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mMenu == null) { 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!initializePanelMenu() || (mMenu == null)) { 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return false; 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mDecorContentParent != null) { 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionMenuPresenterCallback == null) { 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionMenuPresenterCallback = new ActionMenuPresenterCallback(); 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.setMenu(mMenu, mActionMenuPresenterCallback); 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Creating the panel menu will involve a lot of manipulation; 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // don't dispatch change events to presenters until we're done. 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu.stopDispatchingItemsChanged(); 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Call callback, and return if it doesn't want to display menu. 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!mWindowMenuCallback.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, mMenu)) { 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Ditch the menu created above 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu = null; 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mDecorContentParent != null) { 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Don't show it in the action bar either 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.setMenu(null, mActionMenuPresenterCallback); 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return false; 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mPanelRefreshMenuContent = false; 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Preparing the panel menu can involve a lot of manipulation; 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // don't dispatch change events to presenters until we're done. 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu.stopDispatchingItemsChanged(); 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Restore action view state before we prepare. This gives apps 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // an opportunity to override frozen/restored state in onPrepare. 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mPanelFrozenActionViewState != null) { 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu.restoreActionViewStates(mPanelFrozenActionViewState); 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mPanelFrozenActionViewState = null; 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Callback and return if the callback does not want to show the menu 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!mWindowMenuCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, mMenu)) { 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mDecorContentParent != null) { 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // The app didn't want to show the menu for now but it still exists. 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Clear it out of the action bar. 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.setMenu(null, mActionMenuPresenterCallback); 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu.startDispatchingItemsChanged(); 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return false; 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mMenu.startDispatchingItemsChanged(); 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Set other state 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mPanelIsPrepared = true; 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return true; 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private void checkCloseActionMenu() { 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mClosingActionMenu) { 82994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return; 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mClosingActionMenu = true; 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.dismissPopups(); 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mClosingActionMenu = false; 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private void closePanel(int featureId) { 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (featureId == Window.FEATURE_OPTIONS_PANEL && mDecorContentParent != null && 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.canShowOverflowMenu() && 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mActivity))) { 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mDecorContentParent.hideOverflowMenu(); 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.closeOptionsMenu(); 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mPanelIsPrepared = false; 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private void invalidatePanelMenu() { 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!mInvalidatePanelMenuPosted && mWindowDecor != null) { 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ViewCompat.postOnAnimation(mWindowDecor, mInvalidatePanelMenuRunnable); 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mInvalidatePanelMenuPosted = true; 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /** 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clears out internal reference when the action mode is destroyed. 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private class ActionModeCallbackWrapper implements ActionMode.Callback { 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private ActionMode.Callback mWrapped; 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public ActionModeCallbackWrapper(ActionMode.Callback wrapped) { 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mWrapped = wrapped; 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public boolean onCreateActionMode(ActionMode mode, Menu menu) { 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return mWrapped.onCreateActionMode(mode, menu); 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return mWrapped.onPrepareActionMode(mode, menu); 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return mWrapped.onActionItemClicked(mode, item); 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void onDestroyActionMode(ActionMode mode) { 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mWrapped.onDestroyActionMode(mode); 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionModePopup != null) { 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.getWindow().getDecorView().removeCallbacks(mShowActionModePopup); 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModePopup.dismiss(); 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (mActionModeView != null) { 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModeView.setVisibility(View.GONE); 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActionModeView != null) { 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionModeView.removeAllViews(); 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mActivity != null) { 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project try { 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActivity.onSupportActionModeFinished(mActionMode); 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } catch (AbstractMethodError ame) { 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project // Older apps might not implement this callback method. 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mActionMode = null; 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private final class PanelMenuPresenterCallback implements MenuPresenter.Callback { 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public boolean onOpenSubMenu(MenuBuilder subMenu) { 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return false; 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project closePanel(Window.FEATURE_OPTIONS_PANEL); 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project private final class ActionMenuPresenterCallback implements MenuPresenter.Callback { 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public boolean onOpenSubMenu(MenuBuilder subMenu) { 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return false; 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @Override 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 91994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun checkCloseActionMenu(); 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project