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