ActionBarActivityDelegateBase.java revision 92b18eb0263ef2421fda5bf977fea3bf044bf941
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; 366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.LayoutInflater; 3730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.Menu; 3830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem; 396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.View; 406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.ViewGroup; 416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.Window; 4230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.widget.FrameLayout; 436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 44f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powellclass ActionBarActivityDelegateBase extends ActionBarActivityDelegate implements 4530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell MenuPresenter.Callback, MenuBuilder.Callback { 4630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell private static final String TAG = "ActionBarActivityDelegateBase"; 476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes private static final int[] ACTION_BAR_DRAWABLE_TOGGLE_ATTRS = new int[] { 4945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes R.attr.homeAsUpIndicator 5045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes }; 5145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 525a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private ActionBarView mActionBarView; 535a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private ListMenuPresenter mListMenuPresenter; 545a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private MenuBuilder mMenu; 556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 565a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private ActionMode mActionMode; 575a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes 585a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes // true if we have installed a window sub-decor layout. 595a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes private boolean mSubDecorInstalled; 60d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 61ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // Used to keep track of Progress Bar Window features 62ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private boolean mFeatureProgress, mFeatureIndeterminateProgress; 63ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 64556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes private boolean mInvalidateMenuPosted; 65556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes private final Runnable mInvalidateMenuRunnable = new Runnable() { 66556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes @Override 67556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes public void run() { 68556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes final MenuBuilder menu = createMenu(); 6930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (mActivity.superOnCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu) && 7030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell mActivity.superOnPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu)) { 71556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes setMenu(menu); 72556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes } else { 73556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes setMenu(null); 74556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes } 75556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 76556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes mInvalidateMenuPosted = false; 77556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes } 78556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes }; 79556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 80f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarActivityDelegateBase(ActionBarActivity activity) { 813954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes super(activity); 826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public ActionBar createSupportActionBar() { 8630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell ensureSubDecor(); 87f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell return new ActionBarImplBase(mActivity, mActivity); 886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onConfigurationChanged(Configuration newConfig) { 926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // If this is called before sub-decor is installed, ActionBar will not 936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // be properly initialized. 945a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar && mSubDecorInstalled) { 956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Note: The action bar will need to access 966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // view changes from superclass. 97f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase actionBar = (ActionBarImplBase) getSupportActionBar(); 986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes actionBar.onConfigurationChanged(newConfig); 996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 103a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes public void onStop() { 104f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar(); 105a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (ab != null) { 106a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes ab.setShowHideAnimationEnabled(false); 107a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 108a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 109a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 110a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes @Override 111a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes public void onPostResume() { 112f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar(); 113a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes if (ab != null) { 114a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes ab.setShowHideAnimationEnabled(true); 115a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 116a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes } 117a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes 118a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes @Override 1196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(View v) { 1206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1215a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 1236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 1246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 1256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v); 1266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v); 1286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(int resId) { 1336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1345a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 1366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 1376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 1386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final LayoutInflater inflater = mActivity.getLayoutInflater(); 1396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes inflater.inflate(resId, contentParent); 1406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(resId); 1426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(View v, ViewGroup.LayoutParams lp) { 1476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1485a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 1506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 1516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 1526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v, lp); 1536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v, lp); 1556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void addContentView(View v, ViewGroup.LayoutParams lp) { 1606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1615a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar) { 1626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 1636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 1646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v, lp); 1656386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v, lp); 1676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1686386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1708123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes final void ensureSubDecor() { 1715a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mHasActionBar && !mSubDecorInstalled) { 1725a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes if (mOverlayActionBar) { 173ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes mActivity.superSetContentView(R.layout.abc_action_bar_decor_overlay); 1746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 175ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes mActivity.superSetContentView(R.layout.abc_action_bar_decor); 1766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView = (ActionBarView) mActivity.findViewById(R.id.action_bar); 17830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell mActionBarView.setWindowCallback(mActivity); 1793954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 1803954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes /** 181ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes * Progress Bars 182ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes */ 183ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 184ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mActionBarView.initProgress(); 185ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 186ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 187ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mActionBarView.initIndeterminateProgress(); 188ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 189ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 190ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes /** 1913954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes * Split Action Bar 1923954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes */ 1933954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes boolean splitWhenNarrow = UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW 1943954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes .equals(getUiOptionsFromMetadata()); 1953954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes boolean splitActionBar; 1963954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 1973954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes if (splitWhenNarrow) { 1983954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes splitActionBar = mActivity.getResources() 19907a07ce59efb770e9fb9ca53a0133e5e64a63bbcChris Banes .getBoolean(R.bool.abc_split_action_bar_is_narrow); 2003954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes } else { 2013954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes TypedArray a = mActivity.obtainStyledAttributes(R.styleable.ActionBarWindow); 2023954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes splitActionBar = a 2033954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes .getBoolean(R.styleable.ActionBarWindow_windowSplitActionBar, false); 2043954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes a.recycle(); 2053954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes } 2063954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 2073954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes final ActionBarContainer splitView = (ActionBarContainer) mActivity.findViewById( 2083954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes R.id.split_action_bar); 2093954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes if (splitView != null) { 2103954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes mActionBarView.setSplitView(splitView); 2113954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes mActionBarView.setSplitActionBar(splitActionBar); 2123954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes mActionBarView.setSplitWhenNarrow(splitWhenNarrow); 2133954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 2143954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes final ActionBarContextView cab = (ActionBarContextView) mActivity.findViewById( 2153954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes R.id.action_context_bar); 2163954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes cab.setSplitView(splitView); 2173954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes cab.setSplitActionBar(splitActionBar); 2183954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes cab.setSplitWhenNarrow(splitWhenNarrow); 2193954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes } 2203954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes 22192b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes // Change our content FrameLayout to use the android.R.id.content id. 22292b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes // Useful for fragments. 22392b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes View content = mActivity.findViewById(android.R.id.content); 22492b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes content.setId(View.NO_ID); 22592b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes View abcContent = mActivity.findViewById(R.id.action_bar_activity_content); 22692b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes abcContent.setId(android.R.id.content); 22792b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes 2285a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mSubDecorInstalled = true; 229556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 230556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes supportInvalidateOptionsMenu(); 2316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 235ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes public boolean supportRequestWindowFeature(int featureId) { 2366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes switch (featureId) { 2376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR: 2385a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mHasActionBar = true; 2396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 2406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR_OVERLAY: 2415a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mOverlayActionBar = true; 2426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 243ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes case Window.FEATURE_PROGRESS: 244ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mFeatureProgress = true; 245ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return true; 246ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes case Window.FEATURE_INDETERMINATE_PROGRESS: 247ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mFeatureIndeterminateProgress = true; 248ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return true; 2496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes default: 2506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mActivity.requestWindowFeature(featureId); 2516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 255904507029cd8ea2d070b6df0911b2dd36b7075a6Chris Banes public void onTitleChanged(CharSequence title) { 256904507029cd8ea2d070b6df0911b2dd36b7075a6Chris Banes if (mActionBarView != null) { 257904507029cd8ea2d070b6df0911b2dd36b7075a6Chris Banes mActionBarView.setWindowTitle(title); 2586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public View onCreatePanelView(int featureId) { 2636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes View createdPanelView = null; 2646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2656386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (featureId == Window.FEATURE_OPTIONS_PANEL) { 2666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes boolean show = true; 2676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes MenuBuilder menu = mMenu; 2686386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 269d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode == null) { 270d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // We only want to dispatch Activity/Fragment menu calls if there isn't 271d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // currently an action mode 2726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 273d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (menu == null) { 274d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // We don't have a menu created, so create one 275d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu = createMenu(); 276d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes setMenu(menu); 2776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 278d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Make sure we're not dispatching item changes to presenters 279d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu.stopDispatchingItemsChanged(); 2802bc5191a8cc331b404724759a015949a4b5499fbChris Banes // Dispatch onCreateOptionsMenu 28130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell show = mActivity.superOnCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu); 282d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 283d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 284d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (show) { 285d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Make sure we're not dispatching item changes to presenters 286d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu.stopDispatchingItemsChanged(); 2872bc5191a8cc331b404724759a015949a4b5499fbChris Banes // Dispatch onPrepareOptionsMenu 28830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell show = mActivity.superOnPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu); 289d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 2906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (show) { 2936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes createdPanelView = (View) getListMenuView(mActivity, this); 2946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Allow menu to start dispatching changes to presenters 2966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.startDispatchingItemsChanged(); 2976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 2986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // If the menu isn't being shown, we no longer need it 2996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes setMenu(null); 3006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return createdPanelView; 3046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 30730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onCreatePanelMenu(int featureId, Menu menu) { 30830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId != Window.FEATURE_OPTIONS_PANEL) { 30930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnCreatePanelMenu(featureId, menu); 3106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 31530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onPreparePanel(int featureId, View view, Menu menu) { 31630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId != Window.FEATURE_OPTIONS_PANEL) { 31730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnPreparePanel(featureId, view, menu); 3186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 32330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onMenuItemSelected(int featureId, MenuItem item) { 32430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId == Window.FEATURE_OPTIONS_PANEL) { 3256e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brown item = MenuWrapperFactory.createMenuItemWrapper(item); 32630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell } 32730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnMenuItemSelected(featureId, item); 3286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { 33230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); 3336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onMenuModeChange(MenuBuilder menu) { 3376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes reopenMenu(menu, true); 3386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 3426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.closeOptionsMenu(); 3436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onOpenSubMenu(MenuBuilder subMenu) { 3476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 351d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public ActionMode startSupportActionMode(ActionMode.Callback callback) { 352d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (callback == null) { 353d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes throw new IllegalArgumentException("ActionMode callback can not be null."); 354d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 355d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 356d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 357d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode.finish(); 358d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 359d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 360d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); 361d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 362f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar(); 363d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (ab != null) { 3645a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mActionMode = ab.startActionMode(wrappedCallback); 365d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 366d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 367d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 368d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActivity.onSupportActionModeStarted(mActionMode); 369d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 370d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mActionMode; 371d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 372d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 373d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 3746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void supportInvalidateOptionsMenu() { 375556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes if (!mInvalidateMenuPosted) { 376556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes mInvalidateMenuPosted = true; 377556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes mActivity.getWindow().getDecorView().post(mInvalidateMenuRunnable); 3786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private MenuBuilder createMenu() { 382d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes MenuBuilder menu = new MenuBuilder(getActionBarThemedContext()); 3836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.setCallback(this); 3846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return menu; 3856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) { 3886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView != null && mActionBarView.isOverflowReserved()) { 3896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (!mActionBarView.isOverflowMenuShowing() || !toggleMenuMode) { 3906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView.getVisibility() == View.VISIBLE) { 3916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.showOverflowMenu(); 3926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 3946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.hideOverflowMenu(); 3956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return; 3976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.close(); 4006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private MenuView getListMenuView(Context context, MenuPresenter.Callback cb) { 4036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mMenu == null) { 4046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return null; 4056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mListMenuPresenter == null) { 4086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes TypedArray a = context.obtainStyledAttributes(R.styleable.Theme); 4096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final int listPresenterTheme = a.getResourceId( 4106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.styleable.Theme_panelMenuListTheme, 4116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.style.Theme_AppCompat_CompactMenu); 4126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes a.recycle(); 4136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter = new ListMenuPresenter( 415ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes R.layout.abc_list_menu_item_layout, listPresenterTheme); 4166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.setCallback(cb); 4179addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes mMenu.addMenuPresenter(mListMenuPresenter); 4186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 4196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Make sure we update the ListView 4206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.updateMenuView(false); 4216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 42330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mListMenuPresenter.getMenuView(new FrameLayout(context)); 4246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void setMenu(MenuBuilder menu) { 4276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (menu == mMenu) { 4286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return; 4296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mMenu != null) { 4326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mMenu.removeMenuPresenter(mListMenuPresenter); 4336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mMenu = menu; 4356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4369addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes if (menu != null && mListMenuPresenter != null) { 437d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Only update list menu if there isn't an action mode menu 4386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.addMenuPresenter(mListMenuPresenter); 4396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView != null) { 4416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.setMenu(menu, this); 4426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 445d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 446d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onBackPressed() { 447d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Back cancels action modes first. 448d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 449d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode.finish(); 450d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return true; 451d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 452d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 453d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Next collapse any expanded action views. 454d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionBarView != null && mActionBarView.hasExpandedActionView()) { 455d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionBarView.collapseActionView(); 456d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return true; 457d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 458d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 459d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return false; 460d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 461d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 462d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 463ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarVisibility(boolean visible) { 464ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON : 465ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes Window.PROGRESS_VISIBILITY_OFF); 466ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 467ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 468ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 469ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarIndeterminateVisibility(boolean visible) { 470ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON : 471ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes Window.PROGRESS_VISIBILITY_OFF); 472ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 473ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 474ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 475ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarIndeterminate(boolean indeterminate) { 476ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(indeterminate ? Window.PROGRESS_INDETERMINATE_ON 477ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes : Window.PROGRESS_INDETERMINATE_OFF); 478ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 479ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 480ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 481ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgress(int progress) { 482ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(Window.PROGRESS_START + progress); 483ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 484ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 48545d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 48645d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes ActionBarDrawerToggle.Delegate getDrawerToggleDelegate() { 48745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes return new ActionBarDrawableToggleImpl(); 48845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 48945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 490d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes /** 491ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes * Progress Bar function. Mostly extracted from PhoneWindow.java 492ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes */ 493ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void updateProgressBars(int value) { 494ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS circularProgressBar = getCircularProgressBar(); 495ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS horizontalProgressBar = getHorizontalProgressBar(); 496ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 497ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (value == Window.PROGRESS_VISIBILITY_ON) { 498ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 499ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes int level = horizontalProgressBar.getProgress(); 500ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ? 501ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes View.VISIBLE : View.INVISIBLE; 502ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(visibility); 503ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 504ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 505ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes circularProgressBar.setVisibility(View.VISIBLE); 506ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 507ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_VISIBILITY_OFF) { 508ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 509ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.GONE); 510ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 511ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 512ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes circularProgressBar.setVisibility(View.GONE); 513ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 514ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_INDETERMINATE_ON) { 515ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setIndeterminate(true); 516ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_INDETERMINATE_OFF) { 517ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setIndeterminate(false); 518ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) { 519ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // We want to set the progress value before testing for visibility 520ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // so that when the progress bar becomes visible again, it has the 521ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // correct level. 522ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setProgress(value - Window.PROGRESS_START); 523ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 524ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (value < Window.PROGRESS_END) { 525ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes showProgressBars(horizontalProgressBar, circularProgressBar); 526ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else { 527ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes hideProgressBars(horizontalProgressBar, circularProgressBar); 528ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 529ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 530ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 531ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 532ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void showProgressBars(ProgressBarICS horizontalProgressBar, 533ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS spinnyProgressBar) { 534ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.INVISIBLE) { 535ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes spinnyProgressBar.setVisibility(View.VISIBLE); 536ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 537ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // Only show the progress bars if the primary progress is not complete 538ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress && horizontalProgressBar.getProgress() < 10000) { 539ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.VISIBLE); 540ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 541ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 542ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 543ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void hideProgressBars(ProgressBarICS horizontalProgressBar, 544ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS spinnyProgressBar) { 545ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.VISIBLE) { 546ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes spinnyProgressBar.setVisibility(View.INVISIBLE); 547ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 548ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress && horizontalProgressBar.getVisibility() == View.VISIBLE) { 549ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.INVISIBLE); 550ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 551ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 552ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 553ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private ProgressBarICS getCircularProgressBar() { 554ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_circular); 555ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (pb != null) { 556ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes pb.setVisibility(View.INVISIBLE); 557ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 558ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return pb; 559ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 560ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 561ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private ProgressBarICS getHorizontalProgressBar() { 562ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_horizontal); 563ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (pb != null) { 564ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes pb.setVisibility(View.INVISIBLE); 565ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 566ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return pb; 567ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 568ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 569ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes /** 570d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes * Clears out internal reference when the action mode is destroyed. 571d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes */ 572d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes private class ActionModeCallbackWrapper implements ActionMode.Callback { 573d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes private ActionMode.Callback mWrapped; 574d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 575d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public ActionModeCallbackWrapper(ActionMode.Callback wrapped) { 576d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mWrapped = wrapped; 577d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 578d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 579d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onCreateActionMode(ActionMode mode, Menu menu) { 580d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mWrapped.onCreateActionMode(mode, menu); 581d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 582d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 583d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 5849addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes return mWrapped.onPrepareActionMode(mode, menu); 585d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 586d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 587d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 588d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mWrapped.onActionItemClicked(mode, item); 589d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 590d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 591d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public void onDestroyActionMode(ActionMode mode) { 592d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mWrapped.onDestroyActionMode(mode); 593d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActivity.onSupportActionModeFinished(mode); 594d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode = null; 595d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 596d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 597d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 59845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes private class ActionBarDrawableToggleImpl 59945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes implements ActionBarDrawerToggle.Delegate { 60045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 60145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 60245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes public Drawable getThemeUpIndicator() { 60345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes final TypedArray a = mActivity.obtainStyledAttributes(ACTION_BAR_DRAWABLE_TOGGLE_ATTRS); 60445d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes final Drawable result = a.getDrawable(0); 60545d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes a.recycle(); 60645d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes return result; 60745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 60845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 60945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 61045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes public void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) { 61145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes if (mActionBarView != null) { 61245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes mActionBarView.setHomeAsUpIndicator(upDrawable); 61345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 61445d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 61545d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 61645d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 61745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes public void setActionBarDescription(int contentDescRes) { 61845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes // No support for setting Action Bar content description 61945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 62045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 62145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 6226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes} 623