ActionBarActivityDelegateBase.java revision f2b7cd67036d78fd5b487b0a2dab28aee11d9c88
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; 226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v4.view.WindowCompat; 236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.appcompat.R; 246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.ListMenuPresenter; 256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuBuilder; 266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuPresenter; 276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuView; 283954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banesimport android.support.v7.internal.widget.ActionBarContainer; 293954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banesimport android.support.v7.internal.widget.ActionBarContextView; 306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.widget.ActionBarView; 31ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banesimport android.support.v7.internal.widget.ProgressBarICS; 32d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.view.ActionMode; 33d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.view.Menu; 346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.view.MenuItem; 356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.LayoutInflater; 366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.View; 376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.ViewGroup; 386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.Window; 396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 40f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powellclass ActionBarActivityDelegateBase extends ActionBarActivityDelegate implements 4197b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes MenuPresenter.Callback, MenuBuilder.Callback, ActionBarView.Callback { 426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 435a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private ActionBarView mActionBarView; 445a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private ListMenuPresenter mListMenuPresenter; 455a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private MenuBuilder mMenu; 466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 475a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private ActionMode mActionMode; 485a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes 495a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes // true if we have installed a window sub-decor layout. 505a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private boolean mSubDecorInstalled; 51d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 52ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // Used to keep track of Progress Bar Window features 53ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private boolean mFeatureProgress, mFeatureIndeterminateProgress; 54ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 55556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes private boolean mInvalidateMenuPosted; 56556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes private final Runnable mInvalidateMenuRunnable = new Runnable() { 57556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes @Override 58556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes public void run() { 59556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes final MenuBuilder menu = createMenu(); 60556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes if (dispatchCreateSupportOptionsMenu(menu) && 61556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes dispatchPrepareSupportOptionsMenu(menu)) { 62556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes setMenu(menu); 63556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes } else { 64556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes setMenu(null); 65556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes } 66556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 67556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes mInvalidateMenuPosted = false; 68556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes } 69556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes }; 70556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 71f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarActivityDelegateBase(ActionBarActivity activity) { 723954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes super(activity); 736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public ActionBar createSupportActionBar() { 77f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell return new ActionBarImplBase(mActivity, mActivity); 786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onConfigurationChanged(Configuration newConfig) { 826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // If this is called before sub-decor is installed, ActionBar will not 836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // be properly initialized. 845a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar && mSubDecorInstalled) { 856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Note: The action bar will need to access 866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // view changes from superclass. 87f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase actionBar = (ActionBarImplBase) getSupportActionBar(); 886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes actionBar.onConfigurationChanged(newConfig); 896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 93a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes public void onStop() { 94f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar(); 95a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (ab != null) { 96a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes ab.setShowHideAnimationEnabled(false); 97a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 98a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 99a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 100a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes @Override 101a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes public void onPostResume() { 102f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar(); 103a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (ab != null) { 104a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes ab.setShowHideAnimationEnabled(true); 105a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 106a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 107a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 108a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes @Override 1096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(View v) { 1106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1115a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 1136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 1146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 1156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v); 1166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v); 1186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(int resId) { 1236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1245a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 1266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 1276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 1286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final LayoutInflater inflater = mActivity.getLayoutInflater(); 1296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes inflater.inflate(resId, contentParent); 1306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(resId); 1326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(View v, ViewGroup.LayoutParams lp) { 1376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1385a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 1406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 1416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 1426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v, lp); 1436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v, lp); 1456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void addContentView(View v, ViewGroup.LayoutParams lp) { 1506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1515a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 1536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 1546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v, lp); 1556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v, lp); 1576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void ensureSubDecor() { 1615a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar && !mSubDecorInstalled) { 1625a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mOverlayActionBar) { 163ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes mActivity.superSetContentView(R.layout.abc_action_bar_decor_overlay); 1646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 165ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes mActivity.superSetContentView(R.layout.abc_action_bar_decor); 1666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView = (ActionBarView) mActivity.findViewById(R.id.action_bar); 16897b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes mActionBarView.setViewCallback(this); 1693954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 1703954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes /** 171ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes * Progress Bars 172ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes */ 173ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 174ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mActionBarView.initProgress(); 175ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 176ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 177ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mActionBarView.initIndeterminateProgress(); 178ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 179ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 180ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes /** 1813954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes * Split Action Bar 1823954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes */ 1833954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes boolean splitWhenNarrow = UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW 1843954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes .equals(getUiOptionsFromMetadata()); 1853954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes boolean splitActionBar; 1863954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 1873954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes if (splitWhenNarrow) { 1883954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes splitActionBar = mActivity.getResources() 1893954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes .getBoolean(R.bool.split_action_bar_is_narrow); 1903954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes } else { 1913954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes TypedArray a = mActivity.obtainStyledAttributes(R.styleable.ActionBarWindow); 1923954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes splitActionBar = a 1933954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes .getBoolean(R.styleable.ActionBarWindow_windowSplitActionBar, false); 1943954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes a.recycle(); 1953954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes } 1963954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 1973954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes final ActionBarContainer splitView = (ActionBarContainer) mActivity.findViewById( 1983954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes R.id.split_action_bar); 1993954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes if (splitView != null) { 2003954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes mActionBarView.setSplitView(splitView); 2013954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes mActionBarView.setSplitActionBar(splitActionBar); 2023954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes mActionBarView.setSplitWhenNarrow(splitWhenNarrow); 2033954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 2043954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes final ActionBarContextView cab = (ActionBarContextView) mActivity.findViewById( 2053954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes R.id.action_context_bar); 2063954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes cab.setSplitView(splitView); 2073954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes cab.setSplitActionBar(splitActionBar); 2083954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes cab.setSplitWhenNarrow(splitWhenNarrow); 2093954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes } 2103954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 2115a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mSubDecorInstalled = true; 212556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 213556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes supportInvalidateOptionsMenu(); 2146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 218ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes public boolean supportRequestWindowFeature(int featureId) { 2196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes switch (featureId) { 2206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR: 2215a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mHasActionBar = true; 2226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 2236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR_OVERLAY: 2245a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mOverlayActionBar = true; 2256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 226ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes case Window.FEATURE_PROGRESS: 227ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mFeatureProgress = true; 228ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return true; 229ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes case Window.FEATURE_INDETERMINATE_PROGRESS: 230ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mFeatureIndeterminateProgress = true; 231ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return true; 2326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes default: 2336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mActivity.requestWindowFeature(featureId); 2346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setTitle(CharSequence title) { 2395a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes ActionBar ab = getSupportActionBar(); 2406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (ab != null) { 2416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ab.setTitle(title); 2426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public View onCreatePanelView(int featureId) { 2476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes View createdPanelView = null; 2486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (featureId == Window.FEATURE_OPTIONS_PANEL) { 2506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes boolean show = true; 2516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes MenuBuilder menu = mMenu; 2526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 253d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode == null) { 254d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // We only want to dispatch Activity/Fragment menu calls if there isn't 255d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // currently an action mode 2566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 257d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (menu == null) { 258d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // We don't have a menu created, so create one 259d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu = createMenu(); 260d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes setMenu(menu); 2616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 262d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Make sure we're not dispatching item changes to presenters 263d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu.stopDispatchingItemsChanged(); 264d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Dispatch onCreateSupportOptionsMenu 265d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes show = dispatchCreateSupportOptionsMenu(menu); 266d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 267d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 268d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (show) { 269d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Make sure we're not dispatching item changes to presenters 270d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu.stopDispatchingItemsChanged(); 271d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Dispatch onPrepareSupportOptionsMenu 272d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes show = dispatchPrepareSupportOptionsMenu(menu); 273d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 2746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (show) { 2776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes createdPanelView = (View) getListMenuView(mActivity, this); 2786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Allow menu to start dispatching changes to presenters 2806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.startDispatchingItemsChanged(); 2816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 2826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // If the menu isn't being shown, we no longer need it 2836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes setMenu(null); 2846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return createdPanelView; 2886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onCreatePanelMenu(int featureId, android.view.Menu frameworkMenu) { 2926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (Window.FEATURE_OPTIONS_PANEL != featureId) { 2936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mActivity.superOnCreatePanelMenu(featureId, frameworkMenu); 2946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Should never get here as FEATURE_OPTIONS_PANEL is handled by onCreatePanelView 2976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 2986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onPreparePanel(int featureId, View view, android.view.Menu menu) { 3026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (Window.FEATURE_OPTIONS_PANEL != featureId) { 3036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mActivity.superOnPreparePanelMenu(featureId, view, menu); 3046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Should never get here as FEATURE_OPTIONS_PANEL is handled by onCreatePanelView 3076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onMenuItemSelected(int featureId, android.view.MenuItem frameworkItem) { 3126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // We don't want to handle framework items here 3136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { 31851e35e07a00e4b56a1ca330323e69ef9258c4e57Chris Banes return mActivity.onSupportMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); 3196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onMenuModeChange(MenuBuilder menu) { 3236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes reopenMenu(menu, true); 3246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 3286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.closeOptionsMenu(); 3296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onOpenSubMenu(MenuBuilder subMenu) { 3336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 337d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public ActionMode startSupportActionMode(ActionMode.Callback callback) { 338d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (callback == null) { 339d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes throw new IllegalArgumentException("ActionMode callback can not be null."); 340d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 341d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 342d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 343d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode.finish(); 344d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 345d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 346d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); 347d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 348f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar(); 349d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (ab != null) { 3505a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mActionMode = ab.startActionMode(wrappedCallback); 351d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 352d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 353d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 354d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActivity.onSupportActionModeStarted(mActionMode); 355d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 356d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mActionMode; 357d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 358d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 359d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 3606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void supportInvalidateOptionsMenu() { 361556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes if (!mInvalidateMenuPosted) { 362556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes mInvalidateMenuPosted = true; 363556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes mActivity.getWindow().getDecorView().post(mInvalidateMenuRunnable); 3646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3656386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private MenuBuilder createMenu() { 368d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes MenuBuilder menu = new MenuBuilder(getActionBarThemedContext()); 3696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.setCallback(this); 3706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return menu; 3716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) { 3746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView != null && mActionBarView.isOverflowReserved()) { 3756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (!mActionBarView.isOverflowMenuShowing() || !toggleMenuMode) { 3766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView.getVisibility() == View.VISIBLE) { 3776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.showOverflowMenu(); 3786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 3806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.hideOverflowMenu(); 3816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return; 3836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.close(); 3866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private MenuView getListMenuView(Context context, MenuPresenter.Callback cb) { 3896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mMenu == null) { 3906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return null; 3916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mListMenuPresenter == null) { 3946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes TypedArray a = context.obtainStyledAttributes(R.styleable.Theme); 3956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final int listPresenterTheme = a.getResourceId( 3966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.styleable.Theme_panelMenuListTheme, 3976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.style.Theme_AppCompat_CompactMenu); 3986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes a.recycle(); 3996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter = new ListMenuPresenter( 401ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes R.layout.abc_list_menu_item_layout, listPresenterTheme); 4026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.setCallback(cb); 4039addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes mMenu.addMenuPresenter(mListMenuPresenter); 4046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 4056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Make sure we update the ListView 4066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.updateMenuView(false); 4076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mListMenuPresenter.getMenuView(null); 4106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void setMenu(MenuBuilder menu) { 4136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (menu == mMenu) { 4146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return; 4156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mMenu != null) { 4186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mMenu.removeMenuPresenter(mListMenuPresenter); 4196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mMenu = menu; 4216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4229addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes if (menu != null && mListMenuPresenter != null) { 423d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Only update list menu if there isn't an action mode menu 4246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.addMenuPresenter(mListMenuPresenter); 4256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView != null) { 4276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.setMenu(menu, this); 4286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 431d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 432d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onBackPressed() { 433d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Back cancels action modes first. 434d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 435d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode.finish(); 436d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return true; 437d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 438d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 439d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Next collapse any expanded action views. 440d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionBarView != null && mActionBarView.hasExpandedActionView()) { 441d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionBarView.collapseActionView(); 442d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return true; 443d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 444d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 445d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return false; 446d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 447d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 448d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 449d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public void onActionModeStarted(android.view.ActionMode mode) { 450d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Will never be called 451d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 452d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 453d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 454ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarVisibility(boolean visible) { 455ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON : 456ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes Window.PROGRESS_VISIBILITY_OFF); 457ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 458ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 459ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 460ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarIndeterminateVisibility(boolean visible) { 461ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON : 462ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes Window.PROGRESS_VISIBILITY_OFF); 463ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 464ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 465ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 466ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarIndeterminate(boolean indeterminate) { 467ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(indeterminate ? Window.PROGRESS_INDETERMINATE_ON 468ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes : Window.PROGRESS_INDETERMINATE_OFF); 469ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 470ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 471ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 472ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgress(int progress) { 473ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(Window.PROGRESS_START + progress); 474ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 475ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 476ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 477d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public void onActionModeFinished(android.view.ActionMode mode) { 478d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Will never be called 479d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 480d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 4816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private boolean dispatchCreateSupportOptionsMenu(MenuBuilder menu) { 4823a1a7fff9873abbf8097c96f7654a459bf34f223Jeff Brown return mActivity.dispatchCreateSupportOptionsMenu(menu); 4836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private boolean dispatchPrepareSupportOptionsMenu(MenuBuilder menu) { 4863a1a7fff9873abbf8097c96f7654a459bf34f223Jeff Brown return mActivity.dispatchPrepareSupportOptionsMenu(menu); 4876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 489d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes /** 490ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes * Progress Bar function. Mostly extracted from PhoneWindow.java 491ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes */ 492ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void updateProgressBars(int value) { 493ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS circularProgressBar = getCircularProgressBar(); 494ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS horizontalProgressBar = getHorizontalProgressBar(); 495ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 496ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (value == Window.PROGRESS_VISIBILITY_ON) { 497ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 498ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes int level = horizontalProgressBar.getProgress(); 499ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ? 500ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes View.VISIBLE : View.INVISIBLE; 501ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(visibility); 502ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 503ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 504ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes circularProgressBar.setVisibility(View.VISIBLE); 505ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 506ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_VISIBILITY_OFF) { 507ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 508ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.GONE); 509ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 510ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 511ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes circularProgressBar.setVisibility(View.GONE); 512ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 513ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_INDETERMINATE_ON) { 514ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setIndeterminate(true); 515ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_INDETERMINATE_OFF) { 516ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setIndeterminate(false); 517ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) { 518ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // We want to set the progress value before testing for visibility 519ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // so that when the progress bar becomes visible again, it has the 520ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // correct level. 521ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setProgress(value - Window.PROGRESS_START); 522ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 523ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (value < Window.PROGRESS_END) { 524ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes showProgressBars(horizontalProgressBar, circularProgressBar); 525ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else { 526ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes hideProgressBars(horizontalProgressBar, circularProgressBar); 527ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 528ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 529ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 530ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 531ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void showProgressBars(ProgressBarICS horizontalProgressBar, 532ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS spinnyProgressBar) { 533ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.INVISIBLE) { 534ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes spinnyProgressBar.setVisibility(View.VISIBLE); 535ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 536ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // Only show the progress bars if the primary progress is not complete 537ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress && horizontalProgressBar.getProgress() < 10000) { 538ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.VISIBLE); 539ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 540ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 541ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 542ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void hideProgressBars(ProgressBarICS horizontalProgressBar, 543ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS spinnyProgressBar) { 544ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.VISIBLE) { 545ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes spinnyProgressBar.setVisibility(View.INVISIBLE); 546ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 547ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress && horizontalProgressBar.getVisibility() == View.VISIBLE) { 548ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.INVISIBLE); 549ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 550ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 551ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 552ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private ProgressBarICS getCircularProgressBar() { 553ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_circular); 554ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (pb != null) { 555ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes pb.setVisibility(View.INVISIBLE); 556ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 557ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return pb; 558ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 559ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 560ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private ProgressBarICS getHorizontalProgressBar() { 561ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_horizontal); 562ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (pb != null) { 563ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes pb.setVisibility(View.INVISIBLE); 564ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 565ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return pb; 566ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 567ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 568ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes /** 56997b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes * From ActionBarView.Callback 57097b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes */ 57197b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes @Override 57251e35e07a00e4b56a1ca330323e69ef9258c4e57Chris Banes public boolean onMenuItemSelected(int featureId, android.support.v7.view.MenuItem item) { 57351e35e07a00e4b56a1ca330323e69ef9258c4e57Chris Banes return mActivity.onSupportMenuItemSelected(featureId, item); 57497b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes } 57597b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes 57697b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes /** 577d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes * Clears out internal reference when the action mode is destroyed. 578d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes */ 579d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes private class ActionModeCallbackWrapper implements ActionMode.Callback { 580d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes private ActionMode.Callback mWrapped; 581d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 582d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public ActionModeCallbackWrapper(ActionMode.Callback wrapped) { 583d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mWrapped = wrapped; 584d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 585d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 586d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onCreateActionMode(ActionMode mode, Menu menu) { 587d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mWrapped.onCreateActionMode(mode, menu); 588d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 589d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 590d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 5919addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes return mWrapped.onPrepareActionMode(mode, menu); 592d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 593d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 594d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 595d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mWrapped.onActionItemClicked(mode, item); 596d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 597d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 598d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public void onDestroyActionMode(ActionMode mode) { 599d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mWrapped.onDestroyActionMode(mode); 600d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActivity.onSupportActionModeFinished(mode); 601d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode = null; 602d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 603d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 604d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 6056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes} 606