ActionBarActivityDelegateBase.java revision 8123e4b3d19031e34a60c0db202f0b3d100eb9d8
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 2215a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mSubDecorInstalled = true; 222556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes 223556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes supportInvalidateOptionsMenu(); 2246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 228ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes public boolean supportRequestWindowFeature(int featureId) { 2296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes switch (featureId) { 2306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR: 2315a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mHasActionBar = true; 2326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 2336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR_OVERLAY: 2345a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mOverlayActionBar = true; 2356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 236ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes case Window.FEATURE_PROGRESS: 237ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mFeatureProgress = true; 238ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return true; 239ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes case Window.FEATURE_INDETERMINATE_PROGRESS: 240ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes mFeatureIndeterminateProgress = true; 241ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return true; 2426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes default: 2436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mActivity.requestWindowFeature(featureId); 2446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setTitle(CharSequence title) { 2495a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes ActionBar ab = getSupportActionBar(); 2506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (ab != null) { 2516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ab.setTitle(title); 2526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public View onCreatePanelView(int featureId) { 2576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes View createdPanelView = null; 2586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (featureId == Window.FEATURE_OPTIONS_PANEL) { 2606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes boolean show = true; 2616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes MenuBuilder menu = mMenu; 2626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 263d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode == null) { 264d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // We only want to dispatch Activity/Fragment menu calls if there isn't 265d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // currently an action mode 2666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 267d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (menu == null) { 268d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // We don't have a menu created, so create one 269d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu = createMenu(); 270d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes setMenu(menu); 2716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 272d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Make sure we're not dispatching item changes to presenters 273d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu.stopDispatchingItemsChanged(); 274d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Dispatch onCreateSupportOptionsMenu 27530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell show = mActivity.superOnCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu); 276d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 277d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 278d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (show) { 279d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Make sure we're not dispatching item changes to presenters 280d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes menu.stopDispatchingItemsChanged(); 281d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Dispatch onPrepareSupportOptionsMenu 28230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell show = mActivity.superOnPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu); 283d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 2846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (show) { 2876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes createdPanelView = (View) getListMenuView(mActivity, this); 2886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Allow menu to start dispatching changes to presenters 2906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.startDispatchingItemsChanged(); 2916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 2926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // If the menu isn't being shown, we no longer need it 2936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes setMenu(null); 2946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return createdPanelView; 2986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 30130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onCreatePanelMenu(int featureId, Menu menu) { 30230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId != Window.FEATURE_OPTIONS_PANEL) { 30330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnCreatePanelMenu(featureId, menu); 3046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 30930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onPreparePanel(int featureId, View view, Menu menu) { 31030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId != Window.FEATURE_OPTIONS_PANEL) { 31130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnPreparePanel(featureId, view, menu); 3126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 31730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public boolean onMenuItemSelected(int featureId, MenuItem item) { 31830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell if (featureId == Window.FEATURE_OPTIONS_PANEL) { 3196e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brown item = MenuWrapperFactory.createMenuItemWrapper(item); 32030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell } 32130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.superOnMenuItemSelected(featureId, item); 3226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { 32630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); 3276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onMenuModeChange(MenuBuilder menu) { 3316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes reopenMenu(menu, true); 3326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 3366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.closeOptionsMenu(); 3376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 3406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onOpenSubMenu(MenuBuilder subMenu) { 3416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 3426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 345d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public ActionMode startSupportActionMode(ActionMode.Callback callback) { 346d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (callback == null) { 347d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes throw new IllegalArgumentException("ActionMode callback can not be null."); 348d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 349d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 350d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 351d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode.finish(); 352d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 353d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 354d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); 355d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 356f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar(); 357d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (ab != null) { 3585a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes mActionMode = ab.startActionMode(wrappedCallback); 359d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 360d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 361d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 362d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActivity.onSupportActionModeStarted(mActionMode); 363d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 364d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mActionMode; 365d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 366d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 367d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 3686386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void supportInvalidateOptionsMenu() { 369556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes if (!mInvalidateMenuPosted) { 370556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes mInvalidateMenuPosted = true; 371556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes mActivity.getWindow().getDecorView().post(mInvalidateMenuRunnable); 3726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private MenuBuilder createMenu() { 376d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes MenuBuilder menu = new MenuBuilder(getActionBarThemedContext()); 3776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.setCallback(this); 3786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return menu; 3796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) { 3826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView != null && mActionBarView.isOverflowReserved()) { 3836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (!mActionBarView.isOverflowMenuShowing() || !toggleMenuMode) { 3846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView.getVisibility() == View.VISIBLE) { 3856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.showOverflowMenu(); 3866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 3886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.hideOverflowMenu(); 3896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return; 3916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.close(); 3946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private MenuView getListMenuView(Context context, MenuPresenter.Callback cb) { 3976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mMenu == null) { 3986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return null; 3996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mListMenuPresenter == null) { 4026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes TypedArray a = context.obtainStyledAttributes(R.styleable.Theme); 4036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final int listPresenterTheme = a.getResourceId( 4046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.styleable.Theme_panelMenuListTheme, 4056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.style.Theme_AppCompat_CompactMenu); 4066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes a.recycle(); 4076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter = new ListMenuPresenter( 409ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes R.layout.abc_list_menu_item_layout, listPresenterTheme); 4106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.setCallback(cb); 4119addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes mMenu.addMenuPresenter(mListMenuPresenter); 4126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 4136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Make sure we update the ListView 4146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.updateMenuView(false); 4156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 41730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mListMenuPresenter.getMenuView(new FrameLayout(context)); 4186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void setMenu(MenuBuilder menu) { 4216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (menu == mMenu) { 4226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return; 4236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mMenu != null) { 4266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mMenu.removeMenuPresenter(mListMenuPresenter); 4276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mMenu = menu; 4296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 4309addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes if (menu != null && mListMenuPresenter != null) { 431d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Only update list menu if there isn't an action mode menu 4326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.addMenuPresenter(mListMenuPresenter); 4336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView != null) { 4356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.setMenu(menu, this); 4366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 4386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 439d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 440d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onBackPressed() { 441d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Back cancels action modes first. 442d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionMode != null) { 443d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode.finish(); 444d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return true; 445d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 446d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 447d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes // Next collapse any expanded action views. 448d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes if (mActionBarView != null && mActionBarView.hasExpandedActionView()) { 449d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionBarView.collapseActionView(); 450d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return true; 451d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 452d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 453d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return false; 454d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 455d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 456d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes @Override 457ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarVisibility(boolean visible) { 458ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON : 459ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes Window.PROGRESS_VISIBILITY_OFF); 460ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 461ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 462ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 463ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgressBarIndeterminateVisibility(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 setSupportProgressBarIndeterminate(boolean indeterminate) { 470ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(indeterminate ? Window.PROGRESS_INDETERMINATE_ON 471ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes : Window.PROGRESS_INDETERMINATE_OFF); 472ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 473ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 474ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes @Override 475ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes void setSupportProgress(int progress) { 476ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes updateProgressBars(Window.PROGRESS_START + progress); 477ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 478ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 47945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 48045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes ActionBarDrawerToggle.Delegate getDrawerToggleDelegate() { 48145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes return new ActionBarDrawableToggleImpl(); 48245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 48345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 484d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes /** 485ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes * Progress Bar function. Mostly extracted from PhoneWindow.java 486ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes */ 487ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void updateProgressBars(int value) { 488ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS circularProgressBar = getCircularProgressBar(); 489ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS horizontalProgressBar = getHorizontalProgressBar(); 490ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 491ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (value == Window.PROGRESS_VISIBILITY_ON) { 492ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 493ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes int level = horizontalProgressBar.getProgress(); 494ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ? 495ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes View.VISIBLE : View.INVISIBLE; 496ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(visibility); 497ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 498ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 499ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes circularProgressBar.setVisibility(View.VISIBLE); 500ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 501ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_VISIBILITY_OFF) { 502ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress) { 503ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.GONE); 504ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 505ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress) { 506ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes circularProgressBar.setVisibility(View.GONE); 507ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 508ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_INDETERMINATE_ON) { 509ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setIndeterminate(true); 510ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (value == Window.PROGRESS_INDETERMINATE_OFF) { 511ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setIndeterminate(false); 512ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) { 513ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // We want to set the progress value before testing for visibility 514ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // so that when the progress bar becomes visible again, it has the 515ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // correct level. 516ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setProgress(value - Window.PROGRESS_START); 517ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 518ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (value < Window.PROGRESS_END) { 519ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes showProgressBars(horizontalProgressBar, circularProgressBar); 520ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } else { 521ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes hideProgressBars(horizontalProgressBar, circularProgressBar); 522ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 523ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 524ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 525ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 526ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void showProgressBars(ProgressBarICS horizontalProgressBar, 527ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS spinnyProgressBar) { 528ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.INVISIBLE) { 529ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes spinnyProgressBar.setVisibility(View.VISIBLE); 530ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 531ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes // Only show the progress bars if the primary progress is not complete 532ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress && horizontalProgressBar.getProgress() < 10000) { 533ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.VISIBLE); 534ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 535ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 536ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 537ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private void hideProgressBars(ProgressBarICS horizontalProgressBar, 538ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS spinnyProgressBar) { 539ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.VISIBLE) { 540ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes spinnyProgressBar.setVisibility(View.INVISIBLE); 541ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 542ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (mFeatureProgress && horizontalProgressBar.getVisibility() == View.VISIBLE) { 543ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes horizontalProgressBar.setVisibility(View.INVISIBLE); 544ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 545ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 546ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 547ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private ProgressBarICS getCircularProgressBar() { 548ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_circular); 549ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (pb != null) { 550ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes pb.setVisibility(View.INVISIBLE); 551ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 552ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return pb; 553ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 554ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 555ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes private ProgressBarICS getHorizontalProgressBar() { 556ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_horizontal); 557ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes if (pb != null) { 558ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes pb.setVisibility(View.INVISIBLE); 559ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 560ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes return pb; 561ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes } 562ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes 563ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes /** 564d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes * Clears out internal reference when the action mode is destroyed. 565d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes */ 566d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes private class ActionModeCallbackWrapper implements ActionMode.Callback { 567d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes private ActionMode.Callback mWrapped; 568d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 569d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public ActionModeCallbackWrapper(ActionMode.Callback wrapped) { 570d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mWrapped = wrapped; 571d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 572d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 573d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onCreateActionMode(ActionMode mode, Menu menu) { 574d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mWrapped.onCreateActionMode(mode, menu); 575d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 576d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 577d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 5789addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes return mWrapped.onPrepareActionMode(mode, menu); 579d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 580d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 581d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 582d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes return mWrapped.onActionItemClicked(mode, item); 583d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 584d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 585d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes public void onDestroyActionMode(ActionMode mode) { 586d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mWrapped.onDestroyActionMode(mode); 587d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActivity.onSupportActionModeFinished(mode); 588d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes mActionMode = null; 589d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 590d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes } 591d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes 59245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes private class ActionBarDrawableToggleImpl 59345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes implements ActionBarDrawerToggle.Delegate { 59445d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 59545d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 59645d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes public Drawable getThemeUpIndicator() { 59745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes final TypedArray a = mActivity.obtainStyledAttributes(ACTION_BAR_DRAWABLE_TOGGLE_ATTRS); 59845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes final Drawable result = a.getDrawable(0); 59945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes a.recycle(); 60045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes return result; 60145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 60245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 60345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 60445d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes public void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) { 60545d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes if (mActionBarView != null) { 60645d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes mActionBarView.setHomeAsUpIndicator(upDrawable); 60745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 60845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 60945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 61045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes @Override 61145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes public void setActionBarDescription(int contentDescRes) { 61245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes // No support for setting Action Bar content description 61345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 61445d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes } 61545d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes 6166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes} 617