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; 216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.content.res.TypedArray; 2245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banesimport android.graphics.drawable.Drawable; 2345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banesimport android.support.v4.app.ActionBarDrawerToggle; 246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v4.view.WindowCompat; 256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.appcompat.R; 266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.ListMenuPresenter; 276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuBuilder; 286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuPresenter; 296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuView; 306e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brownimport android.support.v7.internal.view.menu.MenuWrapperFactory; 313954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banesimport android.support.v7.internal.widget.ActionBarContainer; 323954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banesimport android.support.v7.internal.widget.ActionBarContextView; 336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.widget.ActionBarView; 34ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banesimport android.support.v7.internal.widget.ProgressBarICS; 35d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.view.ActionMode; 3630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.Menu; 3730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem; 386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.View; 396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.ViewGroup; 406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.Window; 4130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.widget.FrameLayout; 426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 43f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powellclass ActionBarActivityDelegateBase extends ActionBarActivityDelegate implements 4430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell MenuPresenter.Callback, MenuBuilder.Callback { 4530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell private static final String TAG = "ActionBarActivityDelegateBase"; 466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes private static final int[] ACTION_BAR_DRAWABLE_TOGGLE_ATTRS = new int[] { 4845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes R.attr.homeAsUpIndicator 4945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes }; 5045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 515a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private ActionBarView mActionBarView; 525a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private ListMenuPresenter mListMenuPresenter; 535a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private MenuBuilder mMenu; 546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 555a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private ActionMode mActionMode; 565a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes 575a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes // true if we have installed a window sub-decor layout. 585a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private boolean mSubDecorInstalled; 59d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 60f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes private CharSequence mTitleToSet; 61f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes 62ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // Used to keep track of Progress Bar Window features 63ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private boolean mFeatureProgress, mFeatureIndeterminateProgress; 64ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 65556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes private boolean mInvalidateMenuPosted; 66556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes private final Runnable mInvalidateMenuRunnable = new Runnable() { 67556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes @Override 68556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes public void run() { 69556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes final MenuBuilder menu = createMenu(); 7030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (mActivity.superOnCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu) && 7130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell mActivity.superOnPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu)) { 72556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes setMenu(menu); 73556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes } else { 74556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes setMenu(null); 75556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes } 76556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 77556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes mInvalidateMenuPosted = false; 78556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes } 79556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes }; 80556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 81f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarActivityDelegateBase(ActionBarActivity activity) { 823954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes super(activity); 836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public ActionBar createSupportActionBar() { 8730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell ensureSubDecor(); 88f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell return new ActionBarImplBase(mActivity, mActivity); 896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onConfigurationChanged(Configuration newConfig) { 936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // If this is called before sub-decor is installed, ActionBar will not 946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // be properly initialized. 955a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar && mSubDecorInstalled) { 966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Note: The action bar will need to access 976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // view changes from superclass. 98f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase actionBar = (ActionBarImplBase) getSupportActionBar(); 996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes actionBar.onConfigurationChanged(newConfig); 1006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 104a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes public void onStop() { 105f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar(); 106a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (ab != null) { 107a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes ab.setShowHideAnimationEnabled(false); 108a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 109a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 110a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 111a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes @Override 112a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes public void onPostResume() { 113f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar(); 114a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (ab != null) { 115a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes ab.setShowHideAnimationEnabled(true); 116a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 117a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 118a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 119a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes @Override 1206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(View v) { 1216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1225a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1238befe35284f720362ec0a862ec840bd9fb598fe4Chris Banes ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 1246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 1256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v); 1266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v); 1286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 129d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes mActivity.onSupportContentChanged(); 1306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(int resId) { 1346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1355a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1368befe35284f720362ec0a862ec840bd9fb598fe4Chris Banes ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 1376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 1388befe35284f720362ec0a862ec840bd9fb598fe4Chris Banes mActivity.getLayoutInflater().inflate(resId, contentParent); 1396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(resId); 1416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 142d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes mActivity.onSupportContentChanged(); 1436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(View v, ViewGroup.LayoutParams lp) { 1476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1485a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1498befe35284f720362ec0a862ec840bd9fb598fe4Chris Banes ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 1506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 1516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v, lp); 1526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v, lp); 1546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 155d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes mActivity.onSupportContentChanged(); 1566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void addContentView(View v, ViewGroup.LayoutParams lp) { 1606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1615a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1628befe35284f720362ec0a862ec840bd9fb598fe4Chris Banes ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content); 1636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v, lp); 1646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1656386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v, lp); 1666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 167d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes mActivity.onSupportContentChanged(); 168d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes } 169d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes 170d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes @Override 171d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes public void onContentChanged() { 172d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes // Ignore all calls to this method as we call onSupportContentChanged manually above 1736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1758123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes final void ensureSubDecor() { 1765a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar && !mSubDecorInstalled) { 1775a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mOverlayActionBar) { 178ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes mActivity.superSetContentView(R.layout.abc_action_bar_decor_overlay); 1796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 180ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes mActivity.superSetContentView(R.layout.abc_action_bar_decor); 1816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView = (ActionBarView) mActivity.findViewById(R.id.action_bar); 18330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell mActionBarView.setWindowCallback(mActivity); 1843954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 1853954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes /** 186ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes * Progress Bars 187ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes */ 188ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 189ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mActionBarView.initProgress(); 190ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 191ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 192ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mActionBarView.initIndeterminateProgress(); 193ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 194ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 195ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes /** 1963954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes * Split Action Bar 1973954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes */ 1983954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes boolean splitWhenNarrow = UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW 1993954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes .equals(getUiOptionsFromMetadata()); 2003954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes boolean splitActionBar; 2013954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 2023954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes if (splitWhenNarrow) { 2033954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes splitActionBar = mActivity.getResources() 20407a07ce59efb770e9fb9ca53a0133e5e64a63bbcChris Banes .getBoolean(R.bool.abc_split_action_bar_is_narrow); 2053954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes } else { 2063954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes TypedArray a = mActivity.obtainStyledAttributes(R.styleable.ActionBarWindow); 2073954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes splitActionBar = a 2083954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes .getBoolean(R.styleable.ActionBarWindow_windowSplitActionBar, false); 2093954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes a.recycle(); 2103954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes } 2113954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 2123954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes final ActionBarContainer splitView = (ActionBarContainer) mActivity.findViewById( 2133954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes R.id.split_action_bar); 2143954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes if (splitView != null) { 2153954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes mActionBarView.setSplitView(splitView); 2163954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes mActionBarView.setSplitActionBar(splitActionBar); 2173954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes mActionBarView.setSplitWhenNarrow(splitWhenNarrow); 2183954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 2193954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes final ActionBarContextView cab = (ActionBarContextView) mActivity.findViewById( 2203954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes R.id.action_context_bar); 2213954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes cab.setSplitView(splitView); 2223954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes cab.setSplitActionBar(splitActionBar); 2233954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes cab.setSplitWhenNarrow(splitWhenNarrow); 2243954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes } 2253954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 22692b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes // Change our content FrameLayout to use the android.R.id.content id. 22792b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes // Useful for fragments. 22892b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes View content = mActivity.findViewById(android.R.id.content); 22992b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes content.setId(View.NO_ID); 23092b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes View abcContent = mActivity.findViewById(R.id.action_bar_activity_content); 23192b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes abcContent.setId(android.R.id.content); 23292b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes 233f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes // A title was set before we've install the decor so set it now. 234f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes if (mTitleToSet != null) { 235f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes mActionBarView.setWindowTitle(mTitleToSet); 236f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes mTitleToSet = null; 237f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes } 238556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 239f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes mSubDecorInstalled = true; 240556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes supportInvalidateOptionsMenu(); 2416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 245ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes public boolean supportRequestWindowFeature(int featureId) { 2466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes switch (featureId) { 2476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR: 2485a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mHasActionBar = true; 2496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 2506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR_OVERLAY: 2515a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mOverlayActionBar = true; 2526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 253ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes case Window.FEATURE_PROGRESS: 254ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mFeatureProgress = true; 255ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return true; 256ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes case Window.FEATURE_INDETERMINATE_PROGRESS: 257ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mFeatureIndeterminateProgress = true; 258ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return true; 2596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes default: 2606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mActivity.requestWindowFeature(featureId); 2616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 265904507029cd8ea2d070b6df0911b2dd36b7075a6Chris Banes public void onTitleChanged(CharSequence title) { 266904507029cd8ea2d070b6df0911b2dd36b7075a6Chris Banes if (mActionBarView != null) { 267904507029cd8ea2d070b6df0911b2dd36b7075a6Chris Banes mActionBarView.setWindowTitle(title); 268f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes } else { 269f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes mTitleToSet = title; 2706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public View onCreatePanelView(int featureId) { 2756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes View createdPanelView = null; 2766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (featureId == Window.FEATURE_OPTIONS_PANEL) { 2786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes boolean show = true; 2796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes MenuBuilder menu = mMenu; 2806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 281d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode == null) { 282d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // We only want to dispatch Activity/Fragment menu calls if there isn't 283d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // currently an action mode 2846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 285d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (menu == null) { 286d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // We don't have a menu created, so create one 287d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu = createMenu(); 288d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes setMenu(menu); 2896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 290d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Make sure we're not dispatching item changes to presenters 291d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu.stopDispatchingItemsChanged(); 2922bc5191a8cc331b404724759a015949a4b5499fbChris Banes // Dispatch onCreateOptionsMenu 29330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell show = mActivity.superOnCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu); 294d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 295d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 296d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (show) { 297d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Make sure we're not dispatching item changes to presenters 298d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu.stopDispatchingItemsChanged(); 2992bc5191a8cc331b404724759a015949a4b5499fbChris Banes // Dispatch onPrepareOptionsMenu 30030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell show = mActivity.superOnPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu); 301d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 3026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (show) { 3056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes createdPanelView = (View) getListMenuView(mActivity, this); 3066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Allow menu to start dispatching changes to presenters 3086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.startDispatchingItemsChanged(); 3096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 3106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // If the menu isn't being shown, we no longer need it 3116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes setMenu(null); 3126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return createdPanelView; 3166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 31930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onCreatePanelMenu(int featureId, Menu menu) { 32030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId != Window.FEATURE_OPTIONS_PANEL) { 32130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnCreatePanelMenu(featureId, menu); 3226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 32730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onPreparePanel(int featureId, View view, Menu menu) { 32830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId != Window.FEATURE_OPTIONS_PANEL) { 32930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnPreparePanel(featureId, view, menu); 3306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 33530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onMenuItemSelected(int featureId, MenuItem item) { 33630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId == Window.FEATURE_OPTIONS_PANEL) { 3376e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brown item = MenuWrapperFactory.createMenuItemWrapper(item); 33830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell } 33930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnMenuItemSelected(featureId, item); 3406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { 34430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); 3456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onMenuModeChange(MenuBuilder menu) { 3496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes reopenMenu(menu, true); 3506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 3546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.closeOptionsMenu(); 3556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onOpenSubMenu(MenuBuilder subMenu) { 3596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 363d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public ActionMode startSupportActionMode(ActionMode.Callback callback) { 364d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (callback == null) { 365d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes throw new IllegalArgumentException("ActionMode callback can not be null."); 366d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 367d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 368d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 369d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode.finish(); 370d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 371d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 372d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); 373d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 374f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar(); 375d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (ab != null) { 3765a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mActionMode = ab.startActionMode(wrappedCallback); 377d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 378d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 379d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 380d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActivity.onSupportActionModeStarted(mActionMode); 381d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 382d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mActionMode; 383d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 384d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 385d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 3866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void supportInvalidateOptionsMenu() { 387556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes if (!mInvalidateMenuPosted) { 388556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes mInvalidateMenuPosted = true; 389556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes mActivity.getWindow().getDecorView().post(mInvalidateMenuRunnable); 3906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private MenuBuilder createMenu() { 394d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes MenuBuilder menu = new MenuBuilder(getActionBarThemedContext()); 3956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.setCallback(this); 3966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return menu; 3976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) { 4006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView != null && mActionBarView.isOverflowReserved()) { 4016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (!mActionBarView.isOverflowMenuShowing() || !toggleMenuMode) { 4026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView.getVisibility() == View.VISIBLE) { 4036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.showOverflowMenu(); 4046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 4066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.hideOverflowMenu(); 4076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return; 4096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.close(); 4126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private MenuView getListMenuView(Context context, MenuPresenter.Callback cb) { 4156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mMenu == null) { 4166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return null; 4176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mListMenuPresenter == null) { 4206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes TypedArray a = context.obtainStyledAttributes(R.styleable.Theme); 4216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final int listPresenterTheme = a.getResourceId( 4226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.styleable.Theme_panelMenuListTheme, 4236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.style.Theme_AppCompat_CompactMenu); 4246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes a.recycle(); 4256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter = new ListMenuPresenter( 427ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes R.layout.abc_list_menu_item_layout, listPresenterTheme); 4286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.setCallback(cb); 4299addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes mMenu.addMenuPresenter(mListMenuPresenter); 4306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 4316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Make sure we update the ListView 4326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.updateMenuView(false); 4336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 43530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mListMenuPresenter.getMenuView(new FrameLayout(context)); 4366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void setMenu(MenuBuilder menu) { 4396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (menu == mMenu) { 4406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return; 4416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mMenu != null) { 4446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mMenu.removeMenuPresenter(mListMenuPresenter); 4456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mMenu = menu; 4476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4489addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes if (menu != null && mListMenuPresenter != null) { 449d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Only update list menu if there isn't an action mode menu 4506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.addMenuPresenter(mListMenuPresenter); 4516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView != null) { 4536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.setMenu(menu, this); 4546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 457d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 458d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onBackPressed() { 459d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Back cancels action modes first. 460d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 461d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode.finish(); 462d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return true; 463d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 464d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 465d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Next collapse any expanded action views. 466d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionBarView != null && mActionBarView.hasExpandedActionView()) { 467d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionBarView.collapseActionView(); 468d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return true; 469d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 470d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 471d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return false; 472d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 473d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 474d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 475ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarVisibility(boolean visible) { 476ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON : 477ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes Window.PROGRESS_VISIBILITY_OFF); 478ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 479ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 480ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 481ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarIndeterminateVisibility(boolean visible) { 482ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON : 483ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes Window.PROGRESS_VISIBILITY_OFF); 484ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 485ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 486ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 487ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarIndeterminate(boolean indeterminate) { 488ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(indeterminate ? Window.PROGRESS_INDETERMINATE_ON 489ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes : Window.PROGRESS_INDETERMINATE_OFF); 490ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 491ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 492ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 493ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgress(int progress) { 494ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(Window.PROGRESS_START + progress); 495ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 496ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 49745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 49845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes ActionBarDrawerToggle.Delegate getDrawerToggleDelegate() { 49945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes return new ActionBarDrawableToggleImpl(); 50045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 50145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 502d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes /** 503ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes * Progress Bar function. Mostly extracted from PhoneWindow.java 504ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes */ 505ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void updateProgressBars(int value) { 506ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS circularProgressBar = getCircularProgressBar(); 507ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS horizontalProgressBar = getHorizontalProgressBar(); 508ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 509ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (value == Window.PROGRESS_VISIBILITY_ON) { 510ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 511ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes int level = horizontalProgressBar.getProgress(); 512ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ? 513ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes View.VISIBLE : View.INVISIBLE; 514ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(visibility); 515ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 516ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 517ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes circularProgressBar.setVisibility(View.VISIBLE); 518ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 519ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_VISIBILITY_OFF) { 520ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 521ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.GONE); 522ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 523ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 524ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes circularProgressBar.setVisibility(View.GONE); 525ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 526ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_INDETERMINATE_ON) { 527ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setIndeterminate(true); 528ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_INDETERMINATE_OFF) { 529ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setIndeterminate(false); 530ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) { 531ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // We want to set the progress value before testing for visibility 532ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // so that when the progress bar becomes visible again, it has the 533ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // correct level. 534ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setProgress(value - Window.PROGRESS_START); 535ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 536ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (value < Window.PROGRESS_END) { 537ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes showProgressBars(horizontalProgressBar, circularProgressBar); 538ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else { 539ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes hideProgressBars(horizontalProgressBar, circularProgressBar); 540ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 541ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 542ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 543ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 544ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void showProgressBars(ProgressBarICS horizontalProgressBar, 545ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS spinnyProgressBar) { 546ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.INVISIBLE) { 547ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes spinnyProgressBar.setVisibility(View.VISIBLE); 548ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 549ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // Only show the progress bars if the primary progress is not complete 550ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress && horizontalProgressBar.getProgress() < 10000) { 551ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.VISIBLE); 552ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 553ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 554ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 555ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void hideProgressBars(ProgressBarICS horizontalProgressBar, 556ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS spinnyProgressBar) { 557ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.VISIBLE) { 558ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes spinnyProgressBar.setVisibility(View.INVISIBLE); 559ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 560ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress && horizontalProgressBar.getVisibility() == View.VISIBLE) { 561ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.INVISIBLE); 562ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 563ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 564ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 565ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private ProgressBarICS getCircularProgressBar() { 566ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_circular); 567ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (pb != null) { 568ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes pb.setVisibility(View.INVISIBLE); 569ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 570ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return pb; 571ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 572ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 573ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private ProgressBarICS getHorizontalProgressBar() { 574ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_horizontal); 575ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (pb != null) { 576ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes pb.setVisibility(View.INVISIBLE); 577ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 578ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return pb; 579ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 580ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 581ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes /** 582d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes * Clears out internal reference when the action mode is destroyed. 583d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes */ 584d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes private class ActionModeCallbackWrapper implements ActionMode.Callback { 585d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes private ActionMode.Callback mWrapped; 586d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 587d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public ActionModeCallbackWrapper(ActionMode.Callback wrapped) { 588d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mWrapped = wrapped; 589d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 590d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 591d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onCreateActionMode(ActionMode mode, Menu menu) { 592d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mWrapped.onCreateActionMode(mode, menu); 593d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 594d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 595d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 5969addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes return mWrapped.onPrepareActionMode(mode, menu); 597d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 598d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 599d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 600d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mWrapped.onActionItemClicked(mode, item); 601d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 602d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 603d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public void onDestroyActionMode(ActionMode mode) { 604d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mWrapped.onDestroyActionMode(mode); 605d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActivity.onSupportActionModeFinished(mode); 606d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode = null; 607d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 608d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 609d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 61045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes private class ActionBarDrawableToggleImpl 61145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes implements ActionBarDrawerToggle.Delegate { 61245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 61345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 61445d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes public Drawable getThemeUpIndicator() { 61545d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes final TypedArray a = mActivity.obtainStyledAttributes(ACTION_BAR_DRAWABLE_TOGGLE_ATTRS); 61645d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes final Drawable result = a.getDrawable(0); 61745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes a.recycle(); 61845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes return result; 61945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 62045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 62145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 62245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes public void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) { 62345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes if (mActionBarView != null) { 62445d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes mActionBarView.setHomeAsUpIndicator(upDrawable); 62545d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 62645d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 62745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 62845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 62945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes public void setActionBarDescription(int contentDescRes) { 63045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes // No support for setting Action Bar content description 63145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 63245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 63345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 6346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes} 635