ActionBarActivityDelegateBase.java revision 6386aac7ea9be44d23dcea28d9a02110c174e988
16386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes/* 26386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * Copyright (C) 2013 The Android Open Source Project 36386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * 46386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 56386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * you may not use this file except in compliance with the License. 66386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * You may obtain a copy of the License at 76386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * 86386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 96386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * 106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * Unless required by applicable law or agreed to in writing, software 116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * See the License for the specific language governing permissions and 146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes * limitations under the License. 156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes */ 166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banespackage android.support.v7.app; 186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.content.Context; 206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.content.res.Configuration; 216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.content.res.TypedArray; 226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.os.Bundle; 236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v4.view.WindowCompat; 246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.appcompat.R; 256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.ListMenuPresenter; 266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuBuilder; 276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuPresenter; 286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuView; 296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.widget.ActionBarView; 306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.view.MenuItem; 316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.LayoutInflater; 326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.View; 336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.ViewGroup; 346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.Window; 356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesclass ActionBarActivityDelegateCompat implements ActionBarActivity.ActionBarActivityDelegate, 376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes MenuPresenter.Callback, MenuBuilder.Callback { 386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ActionBarActivity mActivity; 406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ActionBarView mActionBarView; 416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ListMenuPresenter mListMenuPresenter; 426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes MenuBuilder mMenu; 436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ActionBarActivityDelegateCompat(ActionBarActivity activity) { 456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity = activity; 466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public ActionBar createSupportActionBar() { 506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return new ActionBarImplCompat(mActivity, mActivity); 516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onCreate(Bundle savedInstanceState) { 556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onPostCreate(Bundle savedInstanceState) { 596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // After the Activity has been created and the content views added, we need to make sure 606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // that we've inflated the app's menu, so that Action Items can be rendered. 616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActivity.mSubDecorInstalled) { 626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes supportInvalidateOptionsMenu(); 636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 656386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onConfigurationChanged(Configuration newConfig) { 686386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // If this is called before sub-decor is installed, ActionBar will not 696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // be properly initialized. 706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActivity.mHasActionBar && mActivity.mSubDecorInstalled) { 716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Note: The action bar will need to access 726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // view changes from superclass. 736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ActionBarImplCompat actionBar = 746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ActionBarImplCompat) mActivity.getSupportActionBar(); 756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes actionBar.onConfigurationChanged(newConfig); 766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(View v) { 816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActivity.mHasActionBar) { 836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v); 876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v); 896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(int resId) { 946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActivity.mHasActionBar) { 966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final LayoutInflater inflater = mActivity.getLayoutInflater(); 1006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes inflater.inflate(resId, contentParent); 1016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(resId); 1036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setContentView(View v, ViewGroup.LayoutParams lp) { 1086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActivity.mHasActionBar) { 1106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 1116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 1126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.removeAllViews(); 1136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v, lp); 1146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v, lp); 1166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void addContentView(View v, ViewGroup.LayoutParams lp) { 1216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ensureSubDecor(); 1226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActivity.mHasActionBar) { 1236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final ViewGroup contentParent = 1246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content); 1256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes contentParent.addView(v, lp); 1266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(v, lp); 1286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void ensureSubDecor() { 1326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActivity.mHasActionBar && !mActivity.mSubDecorInstalled) { 1336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActivity.mOverlayActionBar) { 1346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(R.layout.action_bar_decor_overlay); 1356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.superSetContentView(R.layout.action_bar_decor); 1376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView = (ActionBarView) mActivity.findViewById(R.id.action_bar); 1396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.mSubDecorInstalled = true; 1406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean requestWindowFeature(int featureId) { 1456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes switch (featureId) { 1466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR: 1476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.mHasActionBar = true; 1486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 1496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes case WindowCompat.FEATURE_ACTION_BAR_OVERLAY: 1506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.mOverlayActionBar = true; 1516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 1526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes default: 1536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mActivity.requestWindowFeature(featureId); 1546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void setTitle(CharSequence title) { 1596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ActionBar ab = mActivity.getSupportActionBar(); 1606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (ab != null) { 1616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ab.setTitle(title); 1626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1656386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 1666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public View onCreatePanelView(int featureId) { 1676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes View createdPanelView = null; 1686386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (featureId == Window.FEATURE_OPTIONS_PANEL) { 1706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes boolean show = true; 1716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes MenuBuilder menu = mMenu; 1726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (menu == null) { 1746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // We don't have a menu created, so create one 1756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu = createMenu(); 1766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes setMenu(menu); 1776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Make sure we're not dispatching item changes to presenters 1796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.stopDispatchingItemsChanged(); 1806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Dispatch onCreateSupportOptionsMenu 1816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes show = dispatchCreateSupportOptionsMenu(menu); 1826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (show) { 1856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Make sure we're not dispatching item changes to presenters 1866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.stopDispatchingItemsChanged(); 1876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Dispatch onPrepareSupportOptionsMenu 1886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes show = dispatchPrepareSupportOptionsMenu(menu); 1896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 1906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (show) { 1926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes createdPanelView = (View) getListMenuView(mActivity, this); 1936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 1946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Allow menu to start dispatching changes to presenters 1956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.startDispatchingItemsChanged(); 1966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 1976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // If the menu isn't being shown, we no longer need it 1986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes setMenu(null); 1996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return createdPanelView; 2036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onCreatePanelMenu(int featureId, android.view.Menu frameworkMenu) { 2076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (Window.FEATURE_OPTIONS_PANEL != featureId) { 2086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mActivity.superOnCreatePanelMenu(featureId, frameworkMenu); 2096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Should never get here as FEATURE_OPTIONS_PANEL is handled by onCreatePanelView 2126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 2136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onPreparePanel(int featureId, View view, android.view.Menu menu) { 2176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (Window.FEATURE_OPTIONS_PANEL != featureId) { 2186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mActivity.superOnPreparePanelMenu(featureId, view, menu); 2196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Should never get here as FEATURE_OPTIONS_PANEL is handled by onCreatePanelView 2226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 2236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onMenuItemSelected(int featureId, android.view.MenuItem frameworkItem) { 2276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // We don't want to handle framework items here 2286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 2296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { 2336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActivity.onSupportOptionsItemSelected(item)) { 2346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return true; 2356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // FIXME: Reintroduce support options menu dispatch through facade. 2376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes //if (mActivity.mFragments.dispatchSupportOptionsItemSelected(item)) { 2386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // return true; 2396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes //} 2406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ActionBar ab = mActivity.getSupportActionBar(); 2426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (item.getItemId() == R.id.home && ab != null && 2436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes (ab.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0) { 2446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActivity.getParent() == null) { 2456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // TODO: Implement "Up" button 2466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // return mActivity.onNavigateUp(); 2476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 2486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // TODO: Implement "Up" button 2496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // return mParent.onNavigateUpFromChild(this); 2506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 2536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onMenuModeChange(MenuBuilder menu) { 2576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes reopenMenu(menu, true); 2586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 2626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActivity.closeOptionsMenu(); 2636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2656386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public boolean onOpenSubMenu(MenuBuilder subMenu) { 2676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return false; 2686386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes @Override 2716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes public void supportInvalidateOptionsMenu() { 2726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final MenuBuilder menu = createMenu(); 2736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // No need to use start/stopDispatchingItemsChanged here 2756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // as there are no presenters attached yet 2766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (dispatchCreateSupportOptionsMenu(menu) && 2786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes dispatchPrepareSupportOptionsMenu(menu)) { 2796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes setMenu(menu); 2806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 2816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes setMenu(null); 2826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private MenuBuilder createMenu() { 2866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes Context context = mActivity; 2876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // If we have an action bar, initialize the menu with a context themed from it. 2896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes ActionBar ab = mActivity.getSupportActionBar(); 2906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (ab != null) { 2916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes context = ab.getThemedContext(); 2926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes MenuBuilder menu = new MenuBuilder(context); 2956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.setCallback(this); 2966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return menu; 2976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 2986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 2996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) { 3006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView != null && mActionBarView.isOverflowReserved()) { 3016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (!mActionBarView.isOverflowMenuShowing() || !toggleMenuMode) { 3026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView.getVisibility() == View.VISIBLE) { 3036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.showOverflowMenu(); 3046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 3066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.hideOverflowMenu(); 3076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return; 3096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.close(); 3126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private MenuView getListMenuView(Context context, MenuPresenter.Callback cb) { 3156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mMenu == null) { 3166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return null; 3176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mListMenuPresenter == null) { 3206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes TypedArray a = context.obtainStyledAttributes(R.styleable.Theme); 3216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes final int listPresenterTheme = a.getResourceId( 3226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.styleable.Theme_panelMenuListTheme, 3236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.style.Theme_AppCompat_CompactMenu); 3246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes a.recycle(); 3256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter = new ListMenuPresenter( 3276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes R.layout.list_menu_item_layout, listPresenterTheme); 3286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.setCallback(cb); 3296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mMenu.addMenuPresenter(mListMenuPresenter); 3306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } else { 3316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Make sure we update the ListView 3326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mListMenuPresenter.updateMenuView(false); 3336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return mListMenuPresenter.getMenuView(null); 3366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private void setMenu(MenuBuilder menu) { 3396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (menu == mMenu) { 3406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return; 3416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mMenu != null) { 3446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mMenu.removeMenuPresenter(mListMenuPresenter); 3456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mMenu = menu; 3476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (menu != null && mListMenuPresenter != null) { 3496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes menu.addMenuPresenter(mListMenuPresenter); 3506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes if (mActionBarView != null) { 3526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes mActionBarView.setMenu(menu, this); 3536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private boolean dispatchCreateSupportOptionsMenu(MenuBuilder menu) { 3576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // Allow activity to inflate menu contents 3586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes boolean show = mActivity.onCreateSupportOptionsMenu(menu); 3596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // FIXME: Reintroduce support options menu dispatch through facade. 3616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes //show |= mActivity.mFragments.dispatchCreateSupportOptionsMenu(menu, 3626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // mActivity.getCompatMenuInflater()); 3636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return show; 3656386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes private boolean dispatchPrepareSupportOptionsMenu(MenuBuilder menu) { 3686386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes boolean goforit = mActivity.onPrepareSupportOptionsMenu(menu); 3696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes // FIXME: Reintroduce support options menu dispatch through facade. 3706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes //goforit |= mActivity.mFragments.dispatchPrepareSupportOptionsMenu(menu); 3716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes return goforit; 3726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes } 3736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes 3746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes} 375