ActionBarActivityDelegateBase.java revision f2b7cd67036d78fd5b487b0a2dab28aee11d9c88
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.support.v4.view.WindowCompat;
236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.appcompat.R;
246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.ListMenuPresenter;
256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuBuilder;
266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuPresenter;
276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuView;
283954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banesimport android.support.v7.internal.widget.ActionBarContainer;
293954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banesimport android.support.v7.internal.widget.ActionBarContextView;
306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.widget.ActionBarView;
31ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banesimport android.support.v7.internal.widget.ProgressBarICS;
32d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.view.ActionMode;
33d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.view.Menu;
346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.view.MenuItem;
356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.LayoutInflater;
366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.View;
376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.ViewGroup;
386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.Window;
396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
40f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powellclass ActionBarActivityDelegateBase extends ActionBarActivityDelegate implements
4197b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes        MenuPresenter.Callback, MenuBuilder.Callback, ActionBarView.Callback {
426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
435a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private ActionBarView mActionBarView;
445a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private ListMenuPresenter mListMenuPresenter;
455a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private MenuBuilder mMenu;
466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
475a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private ActionMode mActionMode;
485a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes
495a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    // true if we have installed a window sub-decor layout.
505a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private boolean mSubDecorInstalled;
51d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
52ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    // Used to keep track of Progress Bar Window features
53ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private boolean mFeatureProgress, mFeatureIndeterminateProgress;
54ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
55556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes    private boolean mInvalidateMenuPosted;
56556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes    private final Runnable mInvalidateMenuRunnable = new Runnable() {
57556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes        @Override
58556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes        public void run() {
59556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            final MenuBuilder menu = createMenu();
60556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            if (dispatchCreateSupportOptionsMenu(menu) &&
61556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes                    dispatchPrepareSupportOptionsMenu(menu)) {
62556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes                setMenu(menu);
63556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            } else {
64556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes                setMenu(null);
65556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            }
66556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes
67556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            mInvalidateMenuPosted = false;
68556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes        }
69556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes    };
70556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes
71f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell    ActionBarActivityDelegateBase(ActionBarActivity activity) {
723954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes        super(activity);
736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public ActionBar createSupportActionBar() {
77f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell        return new ActionBarImplBase(mActivity, mActivity);
786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void onConfigurationChanged(Configuration newConfig) {
826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        // If this is called before sub-decor is installed, ActionBar will not
836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        // be properly initialized.
845a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar && mSubDecorInstalled) {
856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            // Note: The action bar will need to access
866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            // view changes from superclass.
87f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell            ActionBarImplBase actionBar = (ActionBarImplBase) getSupportActionBar();
886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            actionBar.onConfigurationChanged(newConfig);
896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
93a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    public void onStop() {
94f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell        ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar();
95a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        if (ab != null) {
96a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            ab.setShowHideAnimationEnabled(false);
97a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
98a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    }
99a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
100a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    @Override
101a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    public void onPostResume() {
102f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell        ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar();
103a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        if (ab != null) {
104a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            ab.setShowHideAnimationEnabled(true);
105a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
106a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    }
107a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
108a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    @Override
1096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void setContentView(View v) {
1106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
1115a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar) {
1126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            final ViewGroup contentParent =
1136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content);
1146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.removeAllViews();
1156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.addView(v);
1166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        } else {
1176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActivity.superSetContentView(v);
1186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
1196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
1226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void setContentView(int resId) {
1236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
1245a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar) {
1256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            final ViewGroup contentParent =
1266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content);
1276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.removeAllViews();
1286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            final LayoutInflater inflater = mActivity.getLayoutInflater();
1296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            inflater.inflate(resId, contentParent);
1306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        } else {
1316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActivity.superSetContentView(resId);
1326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
1336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
1366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void setContentView(View v, ViewGroup.LayoutParams lp) {
1376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
1385a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar) {
1396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            final ViewGroup contentParent =
1406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content);
1416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.removeAllViews();
1426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.addView(v, lp);
1436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        } else {
1446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActivity.superSetContentView(v, lp);
1456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
1466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
1496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void addContentView(View v, ViewGroup.LayoutParams lp) {
1506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
1515a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar) {
1526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            final ViewGroup contentParent =
1536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    (ViewGroup) mActivity.findViewById(R.id.action_bar_activity_content);
1546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            contentParent.addView(v, lp);
1556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        } else {
1566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActivity.superSetContentView(v, lp);
1576386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
1586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private void ensureSubDecor() {
1615a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar && !mSubDecorInstalled) {
1625a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes            if (mOverlayActionBar) {
163ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes                mActivity.superSetContentView(R.layout.abc_action_bar_decor_overlay);
1646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            } else {
165ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes                mActivity.superSetContentView(R.layout.abc_action_bar_decor);
1666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            }
1676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActionBarView = (ActionBarView) mActivity.findViewById(R.id.action_bar);
16897b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes            mActionBarView.setViewCallback(this);
1693954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes
1703954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            /**
171ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes             * Progress Bars
172ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes             */
173ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureProgress) {
174ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                mActionBarView.initProgress();
175ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
176ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureIndeterminateProgress) {
177ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                mActionBarView.initIndeterminateProgress();
178ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
179ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
180ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            /**
1813954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes             * Split Action Bar
1823954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes             */
1833954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            boolean splitWhenNarrow = UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW
1843954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                    .equals(getUiOptionsFromMetadata());
1853954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            boolean splitActionBar;
1863954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes
1873954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            if (splitWhenNarrow) {
1883954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                splitActionBar = mActivity.getResources()
1893954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                        .getBoolean(R.bool.split_action_bar_is_narrow);
1903954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            } else {
1913954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                TypedArray a = mActivity.obtainStyledAttributes(R.styleable.ActionBarWindow);
1923954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                splitActionBar = a
1933954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                        .getBoolean(R.styleable.ActionBarWindow_windowSplitActionBar, false);
1943954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                a.recycle();
1953954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            }
1963954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes
1973954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            final ActionBarContainer splitView = (ActionBarContainer) mActivity.findViewById(
1983954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                    R.id.split_action_bar);
1993954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            if (splitView != null) {
2003954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                mActionBarView.setSplitView(splitView);
2013954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                mActionBarView.setSplitActionBar(splitActionBar);
2023954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                mActionBarView.setSplitWhenNarrow(splitWhenNarrow);
2033954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes
2043954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                final ActionBarContextView cab = (ActionBarContextView) mActivity.findViewById(
2053954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                        R.id.action_context_bar);
2063954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                cab.setSplitView(splitView);
2073954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                cab.setSplitActionBar(splitActionBar);
2083954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes                cab.setSplitWhenNarrow(splitWhenNarrow);
2093954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            }
2103954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes
2115a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes            mSubDecorInstalled = true;
212556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes
213556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            supportInvalidateOptionsMenu();
2146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
2156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
2166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
218ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    public boolean supportRequestWindowFeature(int featureId) {
2196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        switch (featureId) {
2206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            case WindowCompat.FEATURE_ACTION_BAR:
2215a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes                mHasActionBar = true;
2226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                return true;
2236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            case WindowCompat.FEATURE_ACTION_BAR_OVERLAY:
2245a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes                mOverlayActionBar = true;
2256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                return true;
226ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            case Window.FEATURE_PROGRESS:
227ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                mFeatureProgress = true;
228ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                return true;
229ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            case Window.FEATURE_INDETERMINATE_PROGRESS:
230ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                mFeatureIndeterminateProgress = true;
231ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                return true;
2326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            default:
2336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                return mActivity.requestWindowFeature(featureId);
2346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
2356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
2366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
2386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void setTitle(CharSequence title) {
2395a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        ActionBar ab = getSupportActionBar();
2406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (ab != null) {
2416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            ab.setTitle(title);
2426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
2436386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
2446386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2456386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
2466386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public View onCreatePanelView(int featureId) {
2476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        View createdPanelView = null;
2486386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
2506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            boolean show = true;
2516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            MenuBuilder menu = mMenu;
2526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
253d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            if (mActionMode == null) {
254d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                // We only want to dispatch Activity/Fragment menu calls if there isn't
255d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                // currently an action mode
2566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
257d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                if (menu == null) {
258d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    // We don't have a menu created, so create one
259d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    menu = createMenu();
260d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    setMenu(menu);
2616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
262d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    // Make sure we're not dispatching item changes to presenters
263d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    menu.stopDispatchingItemsChanged();
264d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    // Dispatch onCreateSupportOptionsMenu
265d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    show = dispatchCreateSupportOptionsMenu(menu);
266d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                }
267d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
268d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                if (show) {
269d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    // Make sure we're not dispatching item changes to presenters
270d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    menu.stopDispatchingItemsChanged();
271d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    // Dispatch onPrepareSupportOptionsMenu
272d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                    show = dispatchPrepareSupportOptionsMenu(menu);
273d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes                }
2746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            }
2756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            if (show) {
2776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                createdPanelView = (View) getListMenuView(mActivity, this);
2786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                // Allow menu to start dispatching changes to presenters
2806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                menu.startDispatchingItemsChanged();
2816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            } else {
2826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                // If the menu isn't being shown, we no longer need it
2836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                setMenu(null);
2846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            }
2856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
2866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return createdPanelView;
2886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
2896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
2916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public boolean onCreatePanelMenu(int featureId, android.view.Menu frameworkMenu) {
2926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (Window.FEATURE_OPTIONS_PANEL != featureId) {
2936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            return mActivity.superOnCreatePanelMenu(featureId, frameworkMenu);
2946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
2956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
2966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        // Should never get here as FEATURE_OPTIONS_PANEL is handled by onCreatePanelView
2976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return false;
2986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
2996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3016386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public boolean onPreparePanel(int featureId, View view, android.view.Menu menu) {
3026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (Window.FEATURE_OPTIONS_PANEL != featureId) {
3036386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            return mActivity.superOnPreparePanelMenu(featureId, view, menu);
3046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        // Should never get here as FEATURE_OPTIONS_PANEL is handled by onCreatePanelView
3076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return false;
3086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public boolean onMenuItemSelected(int featureId, android.view.MenuItem frameworkItem) {
3126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        // We don't want to handle framework items here
3136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return false;
3146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
31851e35e07a00e4b56a1ca330323e69ef9258c4e57Chris Banes        return mActivity.onSupportMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item);
3196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void onMenuModeChange(MenuBuilder menu) {
3236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        reopenMenu(menu, true);
3246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
3286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        mActivity.closeOptionsMenu();
3296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public boolean onOpenSubMenu(MenuBuilder subMenu) {
3336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return false;
3346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3366386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
337d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    public ActionMode startSupportActionMode(ActionMode.Callback callback) {
338d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (callback == null) {
339d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            throw new IllegalArgumentException("ActionMode callback can not be null.");
340d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
341d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
342d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mActionMode != null) {
343d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActionMode.finish();
344d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
345d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
346d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback);
347d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
348f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell        ActionBarImplBase ab = (ActionBarImplBase) getSupportActionBar();
349d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (ab != null) {
3505a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes            mActionMode = ab.startActionMode(wrappedCallback);
351d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
352d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
353d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mActionMode != null) {
354d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActivity.onSupportActionModeStarted(mActionMode);
355d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
356d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        return mActionMode;
357d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
358d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
359d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    @Override
3606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void supportInvalidateOptionsMenu() {
361556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes        if (!mInvalidateMenuPosted) {
362556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            mInvalidateMenuPosted = true;
363556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes            mActivity.getWindow().getDecorView().post(mInvalidateMenuRunnable);
3646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3656386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3666386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private MenuBuilder createMenu() {
368d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        MenuBuilder menu = new MenuBuilder(getActionBarThemedContext());
3696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        menu.setCallback(this);
3706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return menu;
3716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) {
3746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mActionBarView != null && mActionBarView.isOverflowReserved()) {
3756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            if (!mActionBarView.isOverflowMenuShowing() || !toggleMenuMode) {
3766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                if (mActionBarView.getVisibility() == View.VISIBLE) {
3776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    mActionBarView.showOverflowMenu();
3786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                }
3796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            } else {
3806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                mActionBarView.hideOverflowMenu();
3816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            }
3826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            return;
3836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        menu.close();
3866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private MenuView getListMenuView(Context context, MenuPresenter.Callback cb) {
3896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mMenu == null) {
3906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            return null;
3916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mListMenuPresenter == null) {
3946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            TypedArray a = context.obtainStyledAttributes(R.styleable.Theme);
3956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            final int listPresenterTheme = a.getResourceId(
3966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    R.styleable.Theme_panelMenuListTheme,
3976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    R.style.Theme_AppCompat_CompactMenu);
3986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            a.recycle();
3996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4006386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mListMenuPresenter = new ListMenuPresenter(
401ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes                    R.layout.abc_list_menu_item_layout, listPresenterTheme);
4026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mListMenuPresenter.setCallback(cb);
4039addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes            mMenu.addMenuPresenter(mListMenuPresenter);
4046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        } else {
4056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            // Make sure we update the ListView
4066386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mListMenuPresenter.updateMenuView(false);
4076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return mListMenuPresenter.getMenuView(null);
4106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private void setMenu(MenuBuilder menu) {
4136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (menu == mMenu) {
4146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            return;
4156386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4166386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4176386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mMenu != null) {
4186386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mMenu.removeMenuPresenter(mListMenuPresenter);
4196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        mMenu = menu;
4216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4229addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes        if (menu != null && mListMenuPresenter != null) {
423d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            // Only update list menu if there isn't an action mode menu
4246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            menu.addMenuPresenter(mListMenuPresenter);
4256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mActionBarView != null) {
4276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mActionBarView.setMenu(menu, this);
4286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4296386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
431d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    @Override
432d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    public boolean onBackPressed() {
433d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        // Back cancels action modes first.
434d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mActionMode != null) {
435d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActionMode.finish();
436d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return true;
437d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
438d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
439d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        // Next collapse any expanded action views.
440d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mActionBarView != null && mActionBarView.hasExpandedActionView()) {
441d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActionBarView.collapseActionView();
442d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return true;
443d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
444d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
445d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        return false;
446d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
447d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
448d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    @Override
449d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    public void onActionModeStarted(android.view.ActionMode mode) {
450d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        // Will never be called
451d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
452d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
453d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    @Override
454ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgressBarVisibility(boolean visible) {
455ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON :
456ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                Window.PROGRESS_VISIBILITY_OFF);
457ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
458ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
459ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    @Override
460ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgressBarIndeterminateVisibility(boolean visible) {
461ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON :
462ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                Window.PROGRESS_VISIBILITY_OFF);
463ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
464ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
465ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    @Override
466ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgressBarIndeterminate(boolean indeterminate) {
467ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(indeterminate ? Window.PROGRESS_INDETERMINATE_ON
468ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                : Window.PROGRESS_INDETERMINATE_OFF);
469ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
470ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
471ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    @Override
472ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgress(int progress) {
473ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(Window.PROGRESS_START + progress);
474ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
475ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
476ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    @Override
477d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    public void onActionModeFinished(android.view.ActionMode mode) {
478d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        // Will never be called
479d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
480d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
4816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private boolean dispatchCreateSupportOptionsMenu(MenuBuilder menu) {
4823a1a7fff9873abbf8097c96f7654a459bf34f223Jeff Brown        return mActivity.dispatchCreateSupportOptionsMenu(menu);
4836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private boolean dispatchPrepareSupportOptionsMenu(MenuBuilder menu) {
4863a1a7fff9873abbf8097c96f7654a459bf34f223Jeff Brown        return mActivity.dispatchPrepareSupportOptionsMenu(menu);
4876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
489d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    /**
490ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes     * Progress Bar function. Mostly extracted from PhoneWindow.java
491ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes     */
492ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private void updateProgressBars(int value) {
493ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        ProgressBarICS circularProgressBar = getCircularProgressBar();
494ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        ProgressBarICS horizontalProgressBar = getHorizontalProgressBar();
495ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
496ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (value == Window.PROGRESS_VISIBILITY_ON) {
497ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureProgress) {
498ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                int level = horizontalProgressBar.getProgress();
499ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ?
500ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                        View.VISIBLE : View.INVISIBLE;
501ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                horizontalProgressBar.setVisibility(visibility);
502ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
503ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureIndeterminateProgress) {
504ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                circularProgressBar.setVisibility(View.VISIBLE);
505ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
506ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (value == Window.PROGRESS_VISIBILITY_OFF) {
507ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureProgress) {
508ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                horizontalProgressBar.setVisibility(View.GONE);
509ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
510ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureIndeterminateProgress) {
511ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                circularProgressBar.setVisibility(View.GONE);
512ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
513ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (value == Window.PROGRESS_INDETERMINATE_ON) {
514ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setIndeterminate(true);
515ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (value == Window.PROGRESS_INDETERMINATE_OFF) {
516ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setIndeterminate(false);
517ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) {
518ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            // We want to set the progress value before testing for visibility
519ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            // so that when the progress bar becomes visible again, it has the
520ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            // correct level.
521ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setProgress(value - Window.PROGRESS_START);
522ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
523ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (value < Window.PROGRESS_END) {
524ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                showProgressBars(horizontalProgressBar, circularProgressBar);
525ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            } else {
526ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                hideProgressBars(horizontalProgressBar, circularProgressBar);
527ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
528ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
529ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
530ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
531ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private void showProgressBars(ProgressBarICS horizontalProgressBar,
532ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            ProgressBarICS spinnyProgressBar) {
533ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.INVISIBLE) {
534ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            spinnyProgressBar.setVisibility(View.VISIBLE);
535ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
536ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        // Only show the progress bars if the primary progress is not complete
537ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureProgress && horizontalProgressBar.getProgress() < 10000) {
538ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setVisibility(View.VISIBLE);
539ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
540ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
541ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
542ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private void hideProgressBars(ProgressBarICS horizontalProgressBar,
543ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            ProgressBarICS spinnyProgressBar) {
544ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.VISIBLE) {
545ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            spinnyProgressBar.setVisibility(View.INVISIBLE);
546ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
547ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureProgress && horizontalProgressBar.getVisibility() == View.VISIBLE) {
548ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setVisibility(View.INVISIBLE);
549ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
550ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
551ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
552ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private ProgressBarICS getCircularProgressBar() {
553ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_circular);
554ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (pb != null) {
555ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            pb.setVisibility(View.INVISIBLE);
556ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
557ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        return pb;
558ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
559ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
560ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private ProgressBarICS getHorizontalProgressBar() {
561ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        ProgressBarICS pb = (ProgressBarICS) mActionBarView.findViewById(R.id.progress_horizontal);
562ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (pb != null) {
563ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            pb.setVisibility(View.INVISIBLE);
564ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
565ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        return pb;
566ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
567ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
568ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    /**
56997b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes     *  From ActionBarView.Callback
57097b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes     */
57197b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes    @Override
57251e35e07a00e4b56a1ca330323e69ef9258c4e57Chris Banes    public boolean onMenuItemSelected(int featureId, android.support.v7.view.MenuItem item) {
57351e35e07a00e4b56a1ca330323e69ef9258c4e57Chris Banes        return mActivity.onSupportMenuItemSelected(featureId, item);
57497b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes    }
57597b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes
57697b0db12faafe07b5f1d981c1a1c1f8e02773c8dChris Banes    /**
577d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes     * Clears out internal reference when the action mode is destroyed.
578d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes     */
579d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    private class ActionModeCallbackWrapper implements ActionMode.Callback {
580d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        private ActionMode.Callback mWrapped;
581d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
582d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public ActionModeCallbackWrapper(ActionMode.Callback wrapped) {
583d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mWrapped = wrapped;
584d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
585d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
586d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
587d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return mWrapped.onCreateActionMode(mode, menu);
588d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
589d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
590d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
5919addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes            return mWrapped.onPrepareActionMode(mode, menu);
592d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
593d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
594d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
595d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return mWrapped.onActionItemClicked(mode, item);
596d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
597d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
598d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public void onDestroyActionMode(ActionMode mode) {
599d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mWrapped.onDestroyActionMode(mode);
600d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActivity.onSupportActionModeFinished(mode);
601d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActionMode = null;
602d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
603d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
604d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
6056386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes}
606