AppCompatDelegateImplV7.java revision 61c0bbe56a13fe55ce91a5b1d64e751164ecb894
16386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes/* 26386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * Copyright (C) 2013 The Android Open Source Project 36386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * 46386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 56386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * you may not use this file except in compliance with the License. 66386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * You may obtain a copy of the License at 76386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * 86386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 96386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * 106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * Unless required by applicable law or agreed to in writing, software 116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * See the License for the specific language governing permissions and 146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * limitations under the License. 156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes */ 166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banespackage android.support.v7.app; 186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.content.Context; 206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.content.res.Configuration; 2161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banesimport android.content.res.Resources; 226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.content.res.TypedArray; 238902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banesimport android.os.Bundle; 2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.app.NavUtils; 2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewConfigurationCompat; 266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v4.view.WindowCompat; 276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.appcompat.R; 2849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.app.ToolbarActionBar; 2949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.app.WindowCallback; 3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.app.WindowDecorActionBar; 316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.ListMenuPresenter; 326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuBuilder; 336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuPresenter; 346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuView; 356e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brownimport android.support.v7.internal.view.menu.MenuWrapperFactory; 3649c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.widget.DecorContentParent; 3749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.widget.ProgressBarCompat; 38d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.view.ActionMode; 3949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.Toolbar; 4056fd50144df518461398a9b3397ee4842b346708Chris Banesimport android.util.AttributeSet; 4156fd50144df518461398a9b3397ee4842b346708Chris Banesimport android.util.DisplayMetrics; 4256fd50144df518461398a9b3397ee4842b346708Chris Banesimport android.util.TypedValue; 4361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banesimport android.view.ContextThemeWrapper; 4461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banesimport android.view.LayoutInflater; 4530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.Menu; 4630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem; 476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.View; 4849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.ViewConfiguration; 496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.ViewGroup; 506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.Window; 5130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.widget.FrameLayout; 526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 53f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powellclass ActionBarActivityDelegateBase extends ActionBarActivityDelegate implements 5430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell MenuPresenter.Callback, MenuBuilder.Callback { 5530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell private static final String TAG = "ActionBarActivityDelegateBase"; 566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 5745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes private static final int[] ACTION_BAR_DRAWABLE_TOGGLE_ATTRS = new int[] { 5845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes R.attr.homeAsUpIndicator 5945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes }; 6045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private DecorContentParent mDecorContentParent; 625a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private ListMenuPresenter mListMenuPresenter; 635a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private MenuBuilder mMenu; 646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 655a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private ActionMode mActionMode; 665a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes 675a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes // true if we have installed a window sub-decor layout. 685a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private boolean mSubDecorInstalled; 69d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 70f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes private CharSequence mTitleToSet; 71f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes 72ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // Used to keep track of Progress Bar Window features 73ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private boolean mFeatureProgress, mFeatureIndeterminateProgress; 74ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 758902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Used for emulating PanelFeatureState 768902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes private boolean mClosingActionMenu; 778902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes private boolean mPanelIsPrepared; 788902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes private boolean mPanelRefreshContent; 798902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes private Bundle mPanelFrozenActionViewState; 80556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 8149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mEnableDefaultActionBarUp; 8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 83f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarActivityDelegateBase(ActionBarActivity activity) { 843954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes super(activity); 856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 8849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void onCreate(Bundle savedInstanceState) { 8949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes super.onCreate(savedInstanceState); 9049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 9149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (NavUtils.getParentActivityName(mActivity) != null) { 9249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ActionBar ab = getSupportActionBar(); 9349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (ab == null) { 9449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mEnableDefaultActionBarUp = true; 9549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 9649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ab.setDefaultDisplayHomeAsUpEnabled(true); 9749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 9949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 10049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 10149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 1026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public ActionBar createSupportActionBar() { 10330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell ensureSubDecor(); 10449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ActionBar ab = new WindowDecorActionBar(mActivity, mOverlayActionBar); 10549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ab.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp); 10649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return ab; 10749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 10849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 10949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 11049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void setSupportActionBar(Toolbar toolbar) { 11149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (getSupportActionBar() instanceof WindowDecorActionBar) { 11249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new IllegalStateException("This Activity already has an action bar supplied " + 11349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes "by the window decor. Do not request Window.FEATURE_ACTION_BAR and set " + 11449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes "windowActionBar to false in your theme to use a Toolbar instead."); 11549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 11649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ActionBar ab = new ToolbarActionBar(toolbar, mActivity.getTitle(), mWindowMenuCallback); 11749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ab.invalidateOptionsMenu(); 11849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setSupportActionBar(ab); 1196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onConfigurationChanged(Configuration newConfig) { 1236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // If this is called before sub-decor is installed, ActionBar will not 1246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // be properly initialized. 1255a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar && mSubDecorInstalled) { 1266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Note: The action bar will need to access 1276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // view changes from superclass. 12849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ActionBar ab = getSupportActionBar(); 12949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (ab != null) { 13049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ab.onConfigurationChanged(newConfig); 13149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 1326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 136a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes public void onStop() { 13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ActionBar ab = getSupportActionBar(); 138a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (ab != null) { 139a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes ab.setShowHideAnimationEnabled(false); 140a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 141a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 142a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 143a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes @Override 144a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes public void onPostResume() { 14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ActionBar ab = getSupportActionBar(); 146a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (ab != null) { 147a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes ab.setShowHideAnimationEnabled(true); 148a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 149a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 150a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 151a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes @Override 1526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(View v) { 1536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 15456fd50144df518461398a9b3397ee4842b346708Chris Banes ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 15556fd50144df518461398a9b3397ee4842b346708Chris Banes contentParent.removeAllViews(); 15656fd50144df518461398a9b3397ee4842b346708Chris Banes contentParent.addView(v); 157d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes mActivity.onSupportContentChanged(); 1586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(int resId) { 1626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 16356fd50144df518461398a9b3397ee4842b346708Chris Banes ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 16456fd50144df518461398a9b3397ee4842b346708Chris Banes contentParent.removeAllViews(); 16556fd50144df518461398a9b3397ee4842b346708Chris Banes mActivity.getLayoutInflater().inflate(resId, contentParent); 166d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes mActivity.onSupportContentChanged(); 1676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1686386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(View v, ViewGroup.LayoutParams lp) { 1716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 17256fd50144df518461398a9b3397ee4842b346708Chris Banes ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 17356fd50144df518461398a9b3397ee4842b346708Chris Banes contentParent.removeAllViews(); 17456fd50144df518461398a9b3397ee4842b346708Chris Banes contentParent.addView(v, lp); 175d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes mActivity.onSupportContentChanged(); 1766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void addContentView(View v, ViewGroup.LayoutParams lp) { 1806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 18156fd50144df518461398a9b3397ee4842b346708Chris Banes ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 18256fd50144df518461398a9b3397ee4842b346708Chris Banes contentParent.addView(v, lp); 183d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes mActivity.onSupportContentChanged(); 184d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes } 185d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes 186d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes @Override 187d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes public void onContentChanged() { 188d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes // Ignore all calls to this method as we call onSupportContentChanged manually above 1896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1918123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes final void ensureSubDecor() { 19256fd50144df518461398a9b3397ee4842b346708Chris Banes if (!mSubDecorInstalled) { 19356fd50144df518461398a9b3397ee4842b346708Chris Banes if (mHasActionBar) { 19449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActivity.superSetContentView(R.layout.abc_screen_toolbar); 19549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 19661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes ViewGroup root = (ViewGroup) mActivity.findViewById(R.id.action_bar_root); 19761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes if (root != null && root.getChildCount() == 0) { 19861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes /** 19961c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes * This needs some explanation. As we can not use the android:theme attribute 20061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes * pre-L, we emulate it by manually creating a LayoutInflater using a 20161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes * ContextThemeWrapper pointing to actionBarTheme. 20261c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes */ 20361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes TypedValue outValue = new TypedValue(); 20461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes mActivity.getTheme().resolveAttribute(R.attr.actionBarTheme, outValue, true); 20561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes 20661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes Context themedContext; 20761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes if (outValue.resourceId != 0) { 20861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes themedContext = new ContextThemeWrapper(mActivity, outValue.resourceId); 20961c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes } else { 21061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes themedContext = mActivity; 21161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes } 21261c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes 21361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes LayoutInflater.from(themedContext) 21461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes .inflate(R.layout.abc_screen_toolbar_include, root, true); 21561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes } 21661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes 21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent = (DecorContentParent) mActivity.findViewById(R.id.decor_content_parent); 21849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.setWindowCallback(mWindowMenuCallback); 219ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 22056fd50144df518461398a9b3397ee4842b346708Chris Banes /** 22149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Propagate features to DecorContentParent 22256fd50144df518461398a9b3397ee4842b346708Chris Banes */ 22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mOverlayActionBar) { 22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.initFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY); 22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22656fd50144df518461398a9b3397ee4842b346708Chris Banes if (mFeatureProgress) { 22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.initFeature(Window.FEATURE_PROGRESS); 22856fd50144df518461398a9b3397ee4842b346708Chris Banes } 22956fd50144df518461398a9b3397ee4842b346708Chris Banes if (mFeatureIndeterminateProgress) { 23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.initFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 23156fd50144df518461398a9b3397ee4842b346708Chris Banes } 23256fd50144df518461398a9b3397ee4842b346708Chris Banes } else { 23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActivity.superSetContentView(R.layout.abc_screen_simple); 2343954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes } 2353954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 23692b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes // Change our content FrameLayout to use the android.R.id.content id. 23792b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes // Useful for fragments. 23892b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes View content = mActivity.findViewById(android.R.id.content); 23992b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes content.setId(View.NO_ID); 24092b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes View abcContent = mActivity.findViewById(R.id.action_bar_activity_content); 24192b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes abcContent.setId(android.R.id.content); 24292b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes 243f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes // A title was set before we've install the decor so set it now. 24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mTitleToSet != null && mDecorContentParent != null) { 24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.setWindowTitle(mTitleToSet); 24656fd50144df518461398a9b3397ee4842b346708Chris Banes mTitleToSet = null; 247f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes } 248556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 24956fd50144df518461398a9b3397ee4842b346708Chris Banes applyFixedSizeWindow(); 25056fd50144df518461398a9b3397ee4842b346708Chris Banes 25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes onSubDecorInstalled(); 25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 253f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes mSubDecorInstalled = true; 2548902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 2558902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Post supportInvalidateOptionsMenu() so that the menu is invalidated post-onCreate() 25656fd50144df518461398a9b3397ee4842b346708Chris Banes mActivity.getWindow().getDecorView().post(new Runnable() { 2578902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes @Override 2588902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes public void run() { 2598902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes supportInvalidateOptionsMenu(); 2608902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 2618902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes }); 2626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 26549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes void onSubDecorInstalled() {} 26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 26756fd50144df518461398a9b3397ee4842b346708Chris Banes private void applyFixedSizeWindow() { 26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes TypedArray a = mActivity.obtainStyledAttributes(R.styleable.Theme); 26956fd50144df518461398a9b3397ee4842b346708Chris Banes 27056fd50144df518461398a9b3397ee4842b346708Chris Banes TypedValue mFixedWidthMajor = null; 27156fd50144df518461398a9b3397ee4842b346708Chris Banes TypedValue mFixedWidthMinor = null; 27256fd50144df518461398a9b3397ee4842b346708Chris Banes TypedValue mFixedHeightMajor = null; 27356fd50144df518461398a9b3397ee4842b346708Chris Banes TypedValue mFixedHeightMinor = null; 27456fd50144df518461398a9b3397ee4842b346708Chris Banes 27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (a.hasValue(R.styleable.Theme_windowFixedWidthMajor)) { 27656fd50144df518461398a9b3397ee4842b346708Chris Banes if (mFixedWidthMajor == null) mFixedWidthMajor = new TypedValue(); 27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes a.getValue(R.styleable.Theme_windowFixedWidthMajor, mFixedWidthMajor); 27856fd50144df518461398a9b3397ee4842b346708Chris Banes } 27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (a.hasValue(R.styleable.Theme_windowFixedWidthMinor)) { 28056fd50144df518461398a9b3397ee4842b346708Chris Banes if (mFixedWidthMinor == null) mFixedWidthMinor = new TypedValue(); 28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes a.getValue(R.styleable.Theme_windowFixedWidthMinor, mFixedWidthMinor); 28256fd50144df518461398a9b3397ee4842b346708Chris Banes } 28349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (a.hasValue(R.styleable.Theme_windowFixedHeightMajor)) { 28456fd50144df518461398a9b3397ee4842b346708Chris Banes if (mFixedHeightMajor == null) mFixedHeightMajor = new TypedValue(); 28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes a.getValue(R.styleable.Theme_windowFixedHeightMajor, mFixedHeightMajor); 28656fd50144df518461398a9b3397ee4842b346708Chris Banes } 28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (a.hasValue(R.styleable.Theme_windowFixedHeightMinor)) { 28856fd50144df518461398a9b3397ee4842b346708Chris Banes if (mFixedHeightMinor == null) mFixedHeightMinor = new TypedValue(); 28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes a.getValue(R.styleable.Theme_windowFixedHeightMinor, mFixedHeightMinor); 29056fd50144df518461398a9b3397ee4842b346708Chris Banes } 29156fd50144df518461398a9b3397ee4842b346708Chris Banes 29256fd50144df518461398a9b3397ee4842b346708Chris Banes final DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics(); 29356fd50144df518461398a9b3397ee4842b346708Chris Banes final boolean isPortrait = metrics.widthPixels < metrics.heightPixels; 29456fd50144df518461398a9b3397ee4842b346708Chris Banes int w = ViewGroup.LayoutParams.MATCH_PARENT; 29556fd50144df518461398a9b3397ee4842b346708Chris Banes int h = ViewGroup.LayoutParams.MATCH_PARENT; 29656fd50144df518461398a9b3397ee4842b346708Chris Banes 29756fd50144df518461398a9b3397ee4842b346708Chris Banes final TypedValue tvw = isPortrait ? mFixedWidthMinor : mFixedWidthMajor; 29856fd50144df518461398a9b3397ee4842b346708Chris Banes if (tvw != null && tvw.type != TypedValue.TYPE_NULL) { 29956fd50144df518461398a9b3397ee4842b346708Chris Banes if (tvw.type == TypedValue.TYPE_DIMENSION) { 30056fd50144df518461398a9b3397ee4842b346708Chris Banes w = (int) tvw.getDimension(metrics); 30156fd50144df518461398a9b3397ee4842b346708Chris Banes } else if (tvw.type == TypedValue.TYPE_FRACTION) { 30256fd50144df518461398a9b3397ee4842b346708Chris Banes w = (int) tvw.getFraction(metrics.widthPixels, metrics.widthPixels); 30356fd50144df518461398a9b3397ee4842b346708Chris Banes } 30456fd50144df518461398a9b3397ee4842b346708Chris Banes } 30556fd50144df518461398a9b3397ee4842b346708Chris Banes 30656fd50144df518461398a9b3397ee4842b346708Chris Banes final TypedValue tvh = isPortrait ? mFixedHeightMajor : mFixedHeightMinor; 30756fd50144df518461398a9b3397ee4842b346708Chris Banes if (tvh != null && tvh.type != TypedValue.TYPE_NULL) { 30856fd50144df518461398a9b3397ee4842b346708Chris Banes if (tvh.type == TypedValue.TYPE_DIMENSION) { 30956fd50144df518461398a9b3397ee4842b346708Chris Banes h = (int) tvh.getDimension(metrics); 31056fd50144df518461398a9b3397ee4842b346708Chris Banes } else if (tvh.type == TypedValue.TYPE_FRACTION) { 31156fd50144df518461398a9b3397ee4842b346708Chris Banes h = (int) tvh.getFraction(metrics.heightPixels, metrics.heightPixels); 31256fd50144df518461398a9b3397ee4842b346708Chris Banes } 31356fd50144df518461398a9b3397ee4842b346708Chris Banes } 31456fd50144df518461398a9b3397ee4842b346708Chris Banes 31556fd50144df518461398a9b3397ee4842b346708Chris Banes if (w != ViewGroup.LayoutParams.MATCH_PARENT || h != ViewGroup.LayoutParams.MATCH_PARENT) { 31656fd50144df518461398a9b3397ee4842b346708Chris Banes mActivity.getWindow().setLayout(w, h); 31756fd50144df518461398a9b3397ee4842b346708Chris Banes } 31856fd50144df518461398a9b3397ee4842b346708Chris Banes 31956fd50144df518461398a9b3397ee4842b346708Chris Banes a.recycle(); 32056fd50144df518461398a9b3397ee4842b346708Chris Banes } 32156fd50144df518461398a9b3397ee4842b346708Chris Banes 3226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 323ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes public boolean supportRequestWindowFeature(int featureId) { 3246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes switch (featureId) { 3256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR: 3265a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mHasActionBar = true; 3276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 3286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR_OVERLAY: 3295a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mOverlayActionBar = true; 3306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 331ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes case Window.FEATURE_PROGRESS: 332ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mFeatureProgress = true; 333ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return true; 334ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes case Window.FEATURE_INDETERMINATE_PROGRESS: 335ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mFeatureIndeterminateProgress = true; 336ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return true; 3376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes default: 3386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mActivity.requestWindowFeature(featureId); 3396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 343904507029cd8ea2d070b6df0911b2dd36b7075a6Chris Banes public void onTitleChanged(CharSequence title) { 34449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mDecorContentParent != null) { 34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.setWindowTitle(title); 34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else if (getSupportActionBar() != null) { 34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes getSupportActionBar().setTitle(title); 348f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes } else { 349f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes mTitleToSet = title; 3506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public View onCreatePanelView(int featureId) { 3556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes View createdPanelView = null; 3566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3578902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes if (featureId == Window.FEATURE_OPTIONS_PANEL && preparePanel()) { 3588902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes createdPanelView = (View) getListMenuView(mActivity, this); 3596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return createdPanelView; 3626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 36530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onCreatePanelMenu(int featureId, Menu menu) { 36630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId != Window.FEATURE_OPTIONS_PANEL) { 36730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnCreatePanelMenu(featureId, menu); 3686386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 37330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onPreparePanel(int featureId, View view, Menu menu) { 37430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId != Window.FEATURE_OPTIONS_PANEL) { 37530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnPreparePanel(featureId, view, menu); 3766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 38130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onMenuItemSelected(int featureId, MenuItem item) { 38230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId == Window.FEATURE_OPTIONS_PANEL) { 3836e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brown item = MenuWrapperFactory.createMenuItemWrapper(item); 38430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell } 38530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnMenuItemSelected(featureId, item); 3866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { 39030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); 3916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onMenuModeChange(MenuBuilder menu) { 3956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes reopenMenu(menu, true); 3966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 4008902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes if (mClosingActionMenu) { 4018902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes return; 4028902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 4038902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mClosingActionMenu = true; 4046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.closeOptionsMenu(); 40549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.dismissPopups(); 4068902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mClosingActionMenu = false; 4076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 4106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onOpenSubMenu(MenuBuilder subMenu) { 4116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 4126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 415d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public ActionMode startSupportActionMode(ActionMode.Callback callback) { 416d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (callback == null) { 417d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes throw new IllegalArgumentException("ActionMode callback can not be null."); 418d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 419d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 420d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 421d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode.finish(); 422d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 423d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 424d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); 425d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ActionBar ab = getSupportActionBar(); 427d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (ab != null) { 4285a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mActionMode = ab.startActionMode(wrappedCallback); 429d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 430d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 431d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 432d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActivity.onSupportActionModeStarted(mActionMode); 433d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 434d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mActionMode; 435d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 436d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 437d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 4386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void supportInvalidateOptionsMenu() { 43949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final ActionBar ab = getSupportActionBar(); 44049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (ab != null && ab.invalidateOptionsMenu()) return; 44149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 4428902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes if (mMenu != null) { 4438902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes Bundle savedActionViewStates = new Bundle(); 4448902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mMenu.saveActionViewStates(savedActionViewStates); 4458902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes if (savedActionViewStates.size() > 0) { 4468902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mPanelFrozenActionViewState = savedActionViewStates; 4478902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 4488902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // This will be started again when the panel is prepared. 4498902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mMenu.stopDispatchingItemsChanged(); 4508902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mMenu.clear(); 4516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4528902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mPanelRefreshContent = true; 4536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4548902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Prepare the options panel if we have an action bar 45549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mDecorContentParent != null) { 4568902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mPanelIsPrepared = false; 4578902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes preparePanel(); 4588902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 4596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) { 46249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mDecorContentParent != null && mDecorContentParent.canShowOverflowMenu() && 46349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes (!ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mActivity)) || 46449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.isOverflowMenuShowPending())) { 46549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mDecorContentParent.isOverflowMenuShowing() || !toggleMenuMode) { 46649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.showOverflowMenu(); 4676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 46849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.hideOverflowMenu(); 4696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return; 4716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.close(); 4746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private MenuView getListMenuView(Context context, MenuPresenter.Callback cb) { 4776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mMenu == null) { 4786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return null; 4796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mListMenuPresenter == null) { 4826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes TypedArray a = context.obtainStyledAttributes(R.styleable.Theme); 4836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final int listPresenterTheme = a.getResourceId( 4846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.styleable.Theme_panelMenuListTheme, 4856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.style.Theme_AppCompat_CompactMenu); 4866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes a.recycle(); 4876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter = new ListMenuPresenter( 489ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes R.layout.abc_list_menu_item_layout, listPresenterTheme); 4906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.setCallback(cb); 4919addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes mMenu.addMenuPresenter(mListMenuPresenter); 4926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 4936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Make sure we update the ListView 4946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.updateMenuView(false); 4956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 49730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mListMenuPresenter.getMenuView(new FrameLayout(context)); 4986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 500d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 501d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onBackPressed() { 502d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Back cancels action modes first. 503d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 504d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode.finish(); 505d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return true; 506d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 507d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 508d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Next collapse any expanded action views. 50949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ActionBar ab = getSupportActionBar(); 51049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (ab != null && ab.collapseActionView()) { 511d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return true; 512d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 513d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 514d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return false; 515d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 516d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 517d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 518ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarVisibility(boolean visible) { 519ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON : 520ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes Window.PROGRESS_VISIBILITY_OFF); 521ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 522ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 523ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 524ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarIndeterminateVisibility(boolean visible) { 525ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON : 526ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes Window.PROGRESS_VISIBILITY_OFF); 527ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 528ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 529ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 530ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarIndeterminate(boolean indeterminate) { 531ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(indeterminate ? Window.PROGRESS_INDETERMINATE_ON 532ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes : Window.PROGRESS_INDETERMINATE_OFF); 533ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 534ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 535ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 536ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgress(int progress) { 537ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(Window.PROGRESS_START + progress); 538ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 539ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 54045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 541f4a93d160fc696de65e103e7e078106ea8f818faChris Banes int getHomeAsUpIndicatorAttrId() { 542f4a93d160fc696de65e103e7e078106ea8f818faChris Banes return R.attr.homeAsUpIndicator; 54345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 54445d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 545d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes /** 546ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes * Progress Bar function. Mostly extracted from PhoneWindow.java 547ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes */ 548ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void updateProgressBars(int value) { 54949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ProgressBarCompat circularProgressBar = getCircularProgressBar(); 55049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ProgressBarCompat horizontalProgressBar = getHorizontalProgressBar(); 551ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 552ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (value == Window.PROGRESS_VISIBILITY_ON) { 553ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 554ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes int level = horizontalProgressBar.getProgress(); 555ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ? 556ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes View.VISIBLE : View.INVISIBLE; 557ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(visibility); 558ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 559ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 560ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes circularProgressBar.setVisibility(View.VISIBLE); 561ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 562ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_VISIBILITY_OFF) { 563ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 564ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.GONE); 565ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 566ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 567ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes circularProgressBar.setVisibility(View.GONE); 568ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 569ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_INDETERMINATE_ON) { 570ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setIndeterminate(true); 571ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_INDETERMINATE_OFF) { 572ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setIndeterminate(false); 573ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) { 574ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // We want to set the progress value before testing for visibility 575ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // so that when the progress bar becomes visible again, it has the 576ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // correct level. 577ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setProgress(value - Window.PROGRESS_START); 578ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 579ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (value < Window.PROGRESS_END) { 580ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes showProgressBars(horizontalProgressBar, circularProgressBar); 581ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else { 582ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes hideProgressBars(horizontalProgressBar, circularProgressBar); 583ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 584ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 585ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 586ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 58749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void showProgressBars(ProgressBarCompat horizontalProgressBar, 58849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ProgressBarCompat spinnyProgressBar) { 589ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.INVISIBLE) { 590ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes spinnyProgressBar.setVisibility(View.VISIBLE); 591ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 592ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // Only show the progress bars if the primary progress is not complete 593ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress && horizontalProgressBar.getProgress() < 10000) { 594ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.VISIBLE); 595ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 596ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 597ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 59849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void hideProgressBars(ProgressBarCompat horizontalProgressBar, 59949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ProgressBarCompat spinnyProgressBar) { 600ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.VISIBLE) { 601ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes spinnyProgressBar.setVisibility(View.INVISIBLE); 602ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 603ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress && horizontalProgressBar.getVisibility() == View.VISIBLE) { 604ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.INVISIBLE); 605ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 606ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 607ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 60849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ProgressBarCompat getCircularProgressBar() { 60949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ProgressBarCompat pb = (ProgressBarCompat) mActivity.findViewById(R.id.progress_circular); 610ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (pb != null) { 611ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes pb.setVisibility(View.INVISIBLE); 612ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 613ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return pb; 614ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 615ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 61649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ProgressBarCompat getHorizontalProgressBar() { 61749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ProgressBarCompat pb = (ProgressBarCompat) mActivity.findViewById(R.id.progress_horizontal); 618ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (pb != null) { 619ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes pb.setVisibility(View.INVISIBLE); 620ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 621ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return pb; 622ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 623ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 6248902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes private boolean initializePanelMenu() { 62561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes Context context = mActivity; 62661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes 62761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes if (mDecorContentParent != null) { 62861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes final TypedValue outValue = new TypedValue(); 62961c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes final Resources.Theme baseTheme = context.getTheme(); 63061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true); 63161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes 63261c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes Resources.Theme widgetTheme = null; 63361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes if (outValue.resourceId != 0) { 63461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes widgetTheme = context.getResources().newTheme(); 63561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes widgetTheme.setTo(baseTheme); 63661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes widgetTheme.applyStyle(outValue.resourceId, true); 63761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes widgetTheme.resolveAttribute( 63861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes R.attr.actionBarWidgetTheme, outValue, true); 63961c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes } else { 64061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes baseTheme.resolveAttribute( 64161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes R.attr.actionBarWidgetTheme, outValue, true); 64261c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes } 64361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes 64461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes if (outValue.resourceId != 0) { 64561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes if (widgetTheme == null) { 64661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes widgetTheme = context.getResources().newTheme(); 64761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes widgetTheme.setTo(baseTheme); 64861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes } 64961c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes widgetTheme.applyStyle(outValue.resourceId, true); 65061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes } 65161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes 65261c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes if (widgetTheme != null) { 65361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes context = new ContextThemeWrapper(context, 0); 65461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes context.getTheme().setTo(widgetTheme); 65561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes } 65661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes } 65761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes 65861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes mMenu = new MenuBuilder(context); 6598902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mMenu.setCallback(this); 66061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes 6618902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes return true; 6628902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 6638902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 6648902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes private boolean preparePanel() { 6658902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Already prepared (isPrepared will be reset to false later) 6668902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes if (mPanelIsPrepared) { 6678902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes return true; 6688902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 6698902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 6708902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Init the panel state's menu--return false if init failed 6718902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes if (mMenu == null || mPanelRefreshContent) { 6728902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes if (mMenu == null) { 6738902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes if (!initializePanelMenu() || (mMenu == null)) { 6748902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes return false; 6758902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 6768902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 6778902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 67849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mDecorContentParent != null) { 67949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.setMenu(mMenu, this); 6808902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 6818902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 6828902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Creating the panel menu will involve a lot of manipulation; 6838902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // don't dispatch change events to presenters until we're done. 6848902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mMenu.stopDispatchingItemsChanged(); 6858902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 6868902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Call callback, and return if it doesn't want to display menu. 6878902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes if (!mActivity.superOnCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, mMenu)) { 6888902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Ditch the menu created above 6898902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mMenu = null; 6908902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 69149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mDecorContentParent != null) { 6928902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Don't show it in the action bar either 69349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.setMenu(null, this); 6948902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 6958902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 6968902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes return false; 6978902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 6988902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 6998902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mPanelRefreshContent = false; 7008902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 7018902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 7028902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Preparing the panel menu can involve a lot of manipulation; 7038902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // don't dispatch change events to presenters until we're done. 7048902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mMenu.stopDispatchingItemsChanged(); 7058902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 7068902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Restore action view state before we prepare. This gives apps 7078902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // an opportunity to override frozen/restored state in onPrepare. 7088902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes if (mPanelFrozenActionViewState != null) { 7098902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mMenu.restoreActionViewStates(mPanelFrozenActionViewState); 7108902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mPanelFrozenActionViewState = null; 7118902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 7128902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 7138902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Callback and return if the callback does not want to show the menu 7148902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes if (!mActivity.superOnPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, mMenu)) { 71549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mDecorContentParent != null) { 7168902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // The app didn't want to show the menu for now but it still exists. 7178902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Clear it out of the action bar. 71849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDecorContentParent.setMenu(null, this); 7198902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 7208902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mMenu.startDispatchingItemsChanged(); 7218902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes return false; 7228902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 7238902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 7248902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mMenu.startDispatchingItemsChanged(); 7258902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 7268902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes // Set other state 7278902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes mPanelIsPrepared = true; 7288902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 7298902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes return true; 7308902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes } 7318902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes 732ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes /** 733d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes * Clears out internal reference when the action mode is destroyed. 734d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes */ 735d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes private class ActionModeCallbackWrapper implements ActionMode.Callback { 736d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes private ActionMode.Callback mWrapped; 737d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 738d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public ActionModeCallbackWrapper(ActionMode.Callback wrapped) { 739d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mWrapped = wrapped; 740d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 741d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 742d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onCreateActionMode(ActionMode mode, Menu menu) { 743d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mWrapped.onCreateActionMode(mode, menu); 744d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 745d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 746d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 7479addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes return mWrapped.onPrepareActionMode(mode, menu); 748d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 749d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 750d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 751d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mWrapped.onActionItemClicked(mode, item); 752d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 753d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 754d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public void onDestroyActionMode(ActionMode mode) { 755d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mWrapped.onDestroyActionMode(mode); 756d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActivity.onSupportActionModeFinished(mode); 757d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode = null; 758d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 759d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 760d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 7616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes} 762