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;
3630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.Menu;
3730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem;
386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.View;
396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.ViewGroup;
406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.Window;
4130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.widget.FrameLayout;
426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
43f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powellclass ActionBarActivityDelegateBase extends ActionBarActivityDelegate implements
4430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        MenuPresenter.Callback, MenuBuilder.Callback {
4530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    private static final String TAG = "ActionBarActivityDelegateBase";
466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes    private static final int[] ACTION_BAR_DRAWABLE_TOGGLE_ATTRS = new int[] {
4845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes            R.attr.homeAsUpIndicator
4945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes    };
5045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes
515a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private ActionBarView mActionBarView;
525a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private ListMenuPresenter mListMenuPresenter;
535a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private MenuBuilder mMenu;
546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
555a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private ActionMode mActionMode;
565a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes
575a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    // true if we have installed a window sub-decor layout.
585a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private boolean mSubDecorInstalled;
59d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
60f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes    private CharSequence mTitleToSet;
61f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes
62ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    // Used to keep track of Progress Bar Window features
63ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private boolean mFeatureProgress, mFeatureIndeterminateProgress;
64ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
65556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes    private boolean mInvalidateMenuPosted;
66556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes    private final Runnable mInvalidateMenuRunnable = new Runnable() {
67556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes        @Override
68556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes        public void run() {
69556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            final MenuBuilder menu = createMenu();
7030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell            if (mActivity.superOnCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu) &&
7130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell                    mActivity.superOnPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu)) {
72556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes                setMenu(menu);
73556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            } else {
74556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes                setMenu(null);
75556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            }
76556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes
77556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            mInvalidateMenuPosted = false;
78556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes        }
79556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes    };
80556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes
81f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell    ActionBarActivityDelegateBase(ActionBarActivity activity) {
823954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes        super(activity);
836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public ActionBar createSupportActionBar() {
8730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        ensureSubDecor();
88f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell        return new ActionBarImplBase(mActivity, mActivity);
896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void onConfigurationChanged(Configuration newConfig) {
936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        // If this is called before sub-decor is installed, ActionBar will not
946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        // be properly initialized.
955a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar && mSubDecorInstalled) {
966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            // Note: The action bar will need to access
976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            // view changes from superclass.
98f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell            ActionBarImplBase actionBar = (ActionBarImplBase) getSupportActionBar();
996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            actionBar.onConfigurationChanged(newConfig);
1006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
1016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
104a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    public void onStop() {
105f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell        ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar();
106a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        if (ab != null) {
107a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            ab.setShowHideAnimationEnabled(false);
108a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
109a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    }
110a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
111a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    @Override
112a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    public void onPostResume() {
113f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell        ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar();
114a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        if (ab != null) {
115a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            ab.setShowHideAnimationEnabled(true);
116a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
117a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    }
118a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
119a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    @Override
1206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void setContentView(View v) {
1216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
1225a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar) {
1238befe35284f720362ec0a862ec840bd9fb598fe4Chris Banes            ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
1246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.removeAllViews();
1256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.addView(v);
1266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        } else {
1276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActivity.superSetContentView(v);
1286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
129d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes        mActivity.onSupportContentChanged();
1306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
1336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void setContentView(int resId) {
1346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
1355a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar) {
1368befe35284f720362ec0a862ec840bd9fb598fe4Chris Banes            ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
1376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.removeAllViews();
1388befe35284f720362ec0a862ec840bd9fb598fe4Chris Banes            mActivity.getLayoutInflater().inflate(resId, contentParent);
1396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        } else {
1406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActivity.superSetContentView(resId);
1416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
142d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes        mActivity.onSupportContentChanged();
1436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
1466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void setContentView(View v, ViewGroup.LayoutParams lp) {
1476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
1485a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar) {
1498befe35284f720362ec0a862ec840bd9fb598fe4Chris Banes            ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
1506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.removeAllViews();
1516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.addView(v, lp);
1526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        } else {
1536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActivity.superSetContentView(v, lp);
1546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
155d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes        mActivity.onSupportContentChanged();
1566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
1596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void addContentView(View v, ViewGroup.LayoutParams lp) {
1606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
1615a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar) {
1628befe35284f720362ec0a862ec840bd9fb598fe4Chris Banes            ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
1636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.addView(v, lp);
1646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        } else {
1656386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActivity.superSetContentView(v, lp);
1666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
167d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes        mActivity.onSupportContentChanged();
168d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes    }
169d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes
170d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes    @Override
171d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes    public void onContentChanged() {
172d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes        // Ignore all calls to this method as we call onSupportContentChanged manually above
1736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1758123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    final void ensureSubDecor() {
1765a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar && !mSubDecorInstalled) {
1775a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes            if (mOverlayActionBar) {
178ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes                mActivity.superSetContentView(R.layout.abc_action_bar_decor_overlay);
1796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            } else {
180ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes                mActivity.superSetContentView(R.layout.abc_action_bar_decor);
1816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            }
1826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActionBarView = (ActionBarView) mActivity.findViewById(R.id.action_bar);
18330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell            mActionBarView.setWindowCallback(mActivity);
1843954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes
1853954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            /**
186ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes             * Progress Bars
187ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes             */
188ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureProgress) {
189ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                mActionBarView.initProgress();
190ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
191ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureIndeterminateProgress) {
192ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                mActionBarView.initIndeterminateProgress();
193ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
194ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
195ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            /**
1963954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes             * Split Action Bar
1973954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes             */
1983954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            boolean splitWhenNarrow = UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW
1993954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                    .equals(getUiOptionsFromMetadata());
2003954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            boolean splitActionBar;
2013954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes
2023954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            if (splitWhenNarrow) {
2033954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                splitActionBar = mActivity.getResources()
20407a07ce59efb770e9fb9ca53a0133e5e64a63bbcChris Banes                        .getBoolean(R.bool.abc_split_action_bar_is_narrow);
2053954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            } else {
2063954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                TypedArray a = mActivity.obtainStyledAttributes(R.styleable.ActionBarWindow);
2073954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                splitActionBar = a
2083954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                        .getBoolean(R.styleable.ActionBarWindow_windowSplitActionBar, false);
2093954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                a.recycle();
2103954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            }
2113954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes
2123954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            final ActionBarContainer splitView = (ActionBarContainer) mActivity.findViewById(
2133954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                    R.id.split_action_bar);
2143954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            if (splitView != null) {
2153954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                mActionBarView.setSplitView(splitView);
2163954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                mActionBarView.setSplitActionBar(splitActionBar);
2173954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                mActionBarView.setSplitWhenNarrow(splitWhenNarrow);
2183954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes
2193954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                final ActionBarContextView cab = (ActionBarContextView) mActivity.findViewById(
2203954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                        R.id.action_context_bar);
2213954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                cab.setSplitView(splitView);
2223954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                cab.setSplitActionBar(splitActionBar);
2233954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                cab.setSplitWhenNarrow(splitWhenNarrow);
2243954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            }
2253954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes
22692b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            // Change our content FrameLayout to use the android.R.id.content id.
22792b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            // Useful for fragments.
22892b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            View content = mActivity.findViewById(android.R.id.content);
22992b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            content.setId(View.NO_ID);
23092b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            View abcContent = mActivity.findViewById(R.id.action_bar_activity_content);
23192b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            abcContent.setId(android.R.id.content);
23292b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes
233f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes            // A title was set before we've install the decor so set it now.
234f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes            if (mTitleToSet != null) {
235f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes                mActionBarView.setWindowTitle(mTitleToSet);
236f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes                mTitleToSet  = null;
237f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes            }
238556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes
239f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes            mSubDecorInstalled = true;
240556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            supportInvalidateOptionsMenu();
2416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
2426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
2436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
245ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    public boolean supportRequestWindowFeature(int featureId) {
2466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        switch (featureId) {
2476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            case WindowCompat.FEATURE_ACTION_BAR:
2485a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes                mHasActionBar = true;
2496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                return true;
2506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            case WindowCompat.FEATURE_ACTION_BAR_OVERLAY:
2515a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes                mOverlayActionBar = true;
2526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                return true;
253ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            case Window.FEATURE_PROGRESS:
254ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                mFeatureProgress = true;
255ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                return true;
256ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            case Window.FEATURE_INDETERMINATE_PROGRESS:
257ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                mFeatureIndeterminateProgress = true;
258ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                return true;
2596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            default:
2606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                return mActivity.requestWindowFeature(featureId);
2616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
2626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
2636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
265904507029cd8ea2d070b6df0911b2dd36b7075a6Chris Banes    public void onTitleChanged(CharSequence title) {
266904507029cd8ea2d070b6df0911b2dd36b7075a6Chris Banes        if (mActionBarView != null) {
267904507029cd8ea2d070b6df0911b2dd36b7075a6Chris Banes            mActionBarView.setWindowTitle(title);
268f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes        } else {
269f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes            mTitleToSet = title;
2706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
2716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
2726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
2746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public View onCreatePanelView(int featureId) {
2756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        View createdPanelView = null;
2766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
2786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            boolean show = true;
2796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            MenuBuilder menu = mMenu;
2806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
281d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            if (mActionMode == null) {
282d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                // We only want to dispatch Activity/Fragment menu calls if there isn't
283d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                // currently an action mode
2846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
285d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                if (menu == null) {
286d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    // We don't have a menu created, so create one
287d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    menu = createMenu();
288d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    setMenu(menu);
2896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
290d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    // Make sure we're not dispatching item changes to presenters
291d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    menu.stopDispatchingItemsChanged();
2922bc5191a8cc331b404724759a015949a4b5499fbChris Banes                    // Dispatch onCreateOptionsMenu
29330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell                    show = mActivity.superOnCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu);
294d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                }
295d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
296d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                if (show) {
297d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    // Make sure we're not dispatching item changes to presenters
298d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    menu.stopDispatchingItemsChanged();
2992bc5191a8cc331b404724759a015949a4b5499fbChris Banes                    // Dispatch onPrepareOptionsMenu
30030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell                    show = mActivity.superOnPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu);
301d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                }
3026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            }
3036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            if (show) {
3056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                createdPanelView = (View) getListMenuView(mActivity, this);
3066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                // Allow menu to start dispatching changes to presenters
3086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                menu.startDispatchingItemsChanged();
3096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            } else {
3106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                // If the menu isn't being shown, we no longer need it
3116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                setMenu(null);
3126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            }
3136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return createdPanelView;
3166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
31930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    public boolean onCreatePanelMenu(int featureId, Menu menu) {
32030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        if (featureId != Window.FEATURE_OPTIONS_PANEL) {
32130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell            return mActivity.superOnCreatePanelMenu(featureId, menu);
3226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return false;
3246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
32730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    public boolean onPreparePanel(int featureId, View view, Menu menu) {
32830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        if (featureId != Window.FEATURE_OPTIONS_PANEL) {
32930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell            return mActivity.superOnPreparePanel(featureId, view, menu);
3306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return false;
3326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
33530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    public boolean onMenuItemSelected(int featureId, MenuItem item) {
33630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
3376e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brown            item = MenuWrapperFactory.createMenuItemWrapper(item);
33830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        }
33930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        return mActivity.superOnMenuItemSelected(featureId, item);
3406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
34430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        return mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item);
3456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void onMenuModeChange(MenuBuilder menu) {
3496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        reopenMenu(menu, true);
3506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
3546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        mActivity.closeOptionsMenu();
3556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public boolean onOpenSubMenu(MenuBuilder subMenu) {
3596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return false;
3606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
363d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    public ActionMode startSupportActionMode(ActionMode.Callback callback) {
364d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (callback == null) {
365d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            throw new IllegalArgumentException("ActionMode callback can not be null.");
366d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
367d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
368d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mActionMode != null) {
369d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActionMode.finish();
370d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
371d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
372d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback);
373d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
374f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell        ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar();
375d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (ab != null) {
3765a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes            mActionMode = ab.startActionMode(wrappedCallback);
377d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
378d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
379d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mActionMode != null) {
380d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActivity.onSupportActionModeStarted(mActionMode);
381d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
382d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        return mActionMode;
383d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
384d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
385d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    @Override
3866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void supportInvalidateOptionsMenu() {
387556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes        if (!mInvalidateMenuPosted) {
388556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            mInvalidateMenuPosted = true;
389556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            mActivity.getWindow().getDecorView().post(mInvalidateMenuRunnable);
3906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private MenuBuilder createMenu() {
394d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        MenuBuilder menu = new MenuBuilder(getActionBarThemedContext());
3956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        menu.setCallback(this);
3966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return menu;
3976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) {
4006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mActionBarView != null && mActionBarView.isOverflowReserved()) {
4016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            if (!mActionBarView.isOverflowMenuShowing() || !toggleMenuMode) {
4026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                if (mActionBarView.getVisibility() == View.VISIBLE) {
4036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    mActionBarView.showOverflowMenu();
4046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                }
4056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            } else {
4066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                mActionBarView.hideOverflowMenu();
4076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            }
4086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            return;
4096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        menu.close();
4126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private MenuView getListMenuView(Context context, MenuPresenter.Callback cb) {
4156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mMenu == null) {
4166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            return null;
4176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mListMenuPresenter == null) {
4206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            TypedArray a = context.obtainStyledAttributes(R.styleable.Theme);
4216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            final int listPresenterTheme = a.getResourceId(
4226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    R.styleable.Theme_panelMenuListTheme,
4236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    R.style.Theme_AppCompat_CompactMenu);
4246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            a.recycle();
4256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mListMenuPresenter = new ListMenuPresenter(
427ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes                    R.layout.abc_list_menu_item_layout, listPresenterTheme);
4286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mListMenuPresenter.setCallback(cb);
4299addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes            mMenu.addMenuPresenter(mListMenuPresenter);
4306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        } else {
4316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            // Make sure we update the ListView
4326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mListMenuPresenter.updateMenuView(false);
4336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
43530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        return mListMenuPresenter.getMenuView(new FrameLayout(context));
4366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private void setMenu(MenuBuilder menu) {
4396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (menu == mMenu) {
4406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            return;
4416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mMenu != null) {
4446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mMenu.removeMenuPresenter(mListMenuPresenter);
4456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        mMenu = menu;
4476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4489addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes        if (menu != null && mListMenuPresenter != null) {
449d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            // Only update list menu if there isn't an action mode menu
4506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            menu.addMenuPresenter(mListMenuPresenter);
4516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mActionBarView != null) {
4536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActionBarView.setMenu(menu, this);
4546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
457d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    @Override
458d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    public boolean onBackPressed() {
459d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        // Back cancels action modes first.
460d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mActionMode != null) {
461d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActionMode.finish();
462d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return true;
463d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
464d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
465d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        // Next collapse any expanded action views.
466d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mActionBarView != null && mActionBarView.hasExpandedActionView()) {
467d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActionBarView.collapseActionView();
468d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return true;
469d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
470d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
471d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        return false;
472d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
473d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
474d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    @Override
475ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgressBarVisibility(boolean visible) {
476ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON :
477ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                Window.PROGRESS_VISIBILITY_OFF);
478ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
479ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
480ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    @Override
481ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgressBarIndeterminateVisibility(boolean visible) {
482ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON :
483ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                Window.PROGRESS_VISIBILITY_OFF);
484ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
485ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
486ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    @Override
487ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgressBarIndeterminate(boolean indeterminate) {
488ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(indeterminate ? Window.PROGRESS_INDETERMINATE_ON
489ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                : Window.PROGRESS_INDETERMINATE_OFF);
490ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
491ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
492ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    @Override
493ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgress(int progress) {
494ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(Window.PROGRESS_START + progress);
495ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
496ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
49745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes    @Override
49845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes    ActionBarDrawerToggle.Delegate getDrawerToggleDelegate() {
49945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes        return new ActionBarDrawableToggleImpl();
50045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes    }
50145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes
502d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    /**
503ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes     * Progress Bar function. Mostly extracted from PhoneWindow.java
504ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes     */
505ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private void updateProgressBars(int value) {
506ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        ProgressBarICS circularProgressBar = getCircularProgressBar();
507ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        ProgressBarICS horizontalProgressBar = getHorizontalProgressBar();
508ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
509ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (value == Window.PROGRESS_VISIBILITY_ON) {
510ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureProgress) {
511ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                int level = horizontalProgressBar.getProgress();
512ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ?
513ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                        View.VISIBLE : View.INVISIBLE;
514ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                horizontalProgressBar.setVisibility(visibility);
515ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
516ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureIndeterminateProgress) {
517ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                circularProgressBar.setVisibility(View.VISIBLE);
518ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
519ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (value == Window.PROGRESS_VISIBILITY_OFF) {
520ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureProgress) {
521ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                horizontalProgressBar.setVisibility(View.GONE);
522ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
523ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureIndeterminateProgress) {
524ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                circularProgressBar.setVisibility(View.GONE);
525ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
526ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (value == Window.PROGRESS_INDETERMINATE_ON) {
527ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setIndeterminate(true);
528ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (value == Window.PROGRESS_INDETERMINATE_OFF) {
529ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setIndeterminate(false);
530ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) {
531ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            // We want to set the progress value before testing for visibility
532ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            // so that when the progress bar becomes visible again, it has the
533ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            // correct level.
534ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setProgress(value - Window.PROGRESS_START);
535ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
536ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (value < Window.PROGRESS_END) {
537ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                showProgressBars(horizontalProgressBar, circularProgressBar);
538ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            } else {
539ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                hideProgressBars(horizontalProgressBar, circularProgressBar);
540ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
541ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
542ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
543ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
544ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private void showProgressBars(ProgressBarICS horizontalProgressBar,
545ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            ProgressBarICS spinnyProgressBar) {
546ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.INVISIBLE) {
547ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            spinnyProgressBar.setVisibility(View.VISIBLE);
548ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
549ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        // Only show the progress bars if the primary progress is not complete
550ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureProgress && horizontalProgressBar.getProgress() < 10000) {
551ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setVisibility(View.VISIBLE);
552ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
553ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
554ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
555ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private void hideProgressBars(ProgressBarICS horizontalProgressBar,
556ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            ProgressBarICS spinnyProgressBar) {
557ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.VISIBLE) {
558ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            spinnyProgressBar.setVisibility(View.INVISIBLE);
559ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
560ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureProgress && horizontalProgressBar.getVisibility() == View.VISIBLE) {
561ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setVisibility(View.INVISIBLE);
562ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
563ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
564ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
565ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private ProgressBarICS getCircularProgressBar() {
566ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_circular);
567ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (pb != null) {
568ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            pb.setVisibility(View.INVISIBLE);
569ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
570ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        return pb;
571ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
572ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
573ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private ProgressBarICS getHorizontalProgressBar() {
574ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_horizontal);
575ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (pb != null) {
576ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            pb.setVisibility(View.INVISIBLE);
577ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
578ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        return pb;
579ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
580ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
581ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    /**
582d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes     * Clears out internal reference when the action mode is destroyed.
583d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes     */
584d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    private class ActionModeCallbackWrapper implements ActionMode.Callback {
585d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        private ActionMode.Callback mWrapped;
586d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
587d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public ActionModeCallbackWrapper(ActionMode.Callback wrapped) {
588d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mWrapped = wrapped;
589d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
590d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
591d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
592d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return mWrapped.onCreateActionMode(mode, menu);
593d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
594d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
595d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
5969addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes            return mWrapped.onPrepareActionMode(mode, menu);
597d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
598d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
599d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
600d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return mWrapped.onActionItemClicked(mode, item);
601d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
602d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
603d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public void onDestroyActionMode(ActionMode mode) {
604d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mWrapped.onDestroyActionMode(mode);
605d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActivity.onSupportActionModeFinished(mode);
606d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActionMode = null;
607d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
608d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
609d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
61045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes    private class ActionBarDrawableToggleImpl
61145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes            implements ActionBarDrawerToggle.Delegate {
61245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes
61345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes        @Override
61445d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes        public Drawable getThemeUpIndicator() {
61545d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes            final TypedArray a = mActivity.obtainStyledAttributes(ACTION_BAR_DRAWABLE_TOGGLE_ATTRS);
61645d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes            final Drawable result = a.getDrawable(0);
61745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes            a.recycle();
61845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes            return result;
61945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes        }
62045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes
62145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes        @Override
62245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes        public void setActionBarUpIndicator(Drawable upDrawable, int contentDescRes) {
62345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes            if (mActionBarView != null) {
62445d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes                mActionBarView.setHomeAsUpIndicator(upDrawable);
62545d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes            }
62645d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes        }
62745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes
62845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes        @Override
62945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes        public void setActionBarDescription(int contentDescRes) {
63045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes            // No support for setting Action Bar content description
63145d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes        }
63245d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes    }
63345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes
6346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes}
635