AppCompatDelegateImplV7.java revision 61c0bbe56a13fe55ce91a5b1d64e751164ecb894
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;
2161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banesimport android.content.res.Resources;
226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.content.res.TypedArray;
238902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banesimport android.os.Bundle;
2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.app.NavUtils;
2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewConfigurationCompat;
266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v4.view.WindowCompat;
276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.appcompat.R;
2849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.app.ToolbarActionBar;
2949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.app.WindowCallback;
3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.app.WindowDecorActionBar;
316386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.ListMenuPresenter;
326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuBuilder;
336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuPresenter;
346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.support.v7.internal.view.menu.MenuView;
356e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brownimport android.support.v7.internal.view.menu.MenuWrapperFactory;
3649c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.widget.DecorContentParent;
3749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.widget.ProgressBarCompat;
38d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banesimport android.support.v7.view.ActionMode;
3949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.Toolbar;
4056fd50144df518461398a9b3397ee4842b346708Chris Banesimport android.util.AttributeSet;
4156fd50144df518461398a9b3397ee4842b346708Chris Banesimport android.util.DisplayMetrics;
4256fd50144df518461398a9b3397ee4842b346708Chris Banesimport android.util.TypedValue;
4361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banesimport android.view.ContextThemeWrapper;
4461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banesimport android.view.LayoutInflater;
4530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.Menu;
4630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem;
476386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.View;
4849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.ViewConfiguration;
496386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.ViewGroup;
506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banesimport android.view.Window;
5130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.widget.FrameLayout;
526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
53f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powellclass ActionBarActivityDelegateBase extends ActionBarActivityDelegate implements
5430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        MenuPresenter.Callback, MenuBuilder.Callback {
5530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    private static final String TAG = "ActionBarActivityDelegateBase";
566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
5745d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes    private static final int[] ACTION_BAR_DRAWABLE_TOGGLE_ATTRS = new int[] {
5845d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes            R.attr.homeAsUpIndicator
5945d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes    };
6045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes
6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private DecorContentParent mDecorContentParent;
625a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private ListMenuPresenter mListMenuPresenter;
635a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private MenuBuilder mMenu;
646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
655a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private ActionMode mActionMode;
665a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes
675a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    // true if we have installed a window sub-decor layout.
685a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes    private boolean mSubDecorInstalled;
69d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
70f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes    private CharSequence mTitleToSet;
71f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes
72ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    // Used to keep track of Progress Bar Window features
73ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private boolean mFeatureProgress, mFeatureIndeterminateProgress;
74ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
758902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes    // Used for emulating PanelFeatureState
768902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes    private boolean mClosingActionMenu;
778902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes    private boolean mPanelIsPrepared;
788902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes    private boolean mPanelRefreshContent;
798902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes    private Bundle mPanelFrozenActionViewState;
80556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes
8149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private boolean mEnableDefaultActionBarUp;
8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
83f2b7cd67036d78fd5b487b0a2dab28aee11d9c88Adam Powell    ActionBarActivityDelegateBase(ActionBarActivity activity) {
843954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes        super(activity);
856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
8849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    void onCreate(Bundle savedInstanceState) {
8949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        super.onCreate(savedInstanceState);
9049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
9149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (NavUtils.getParentActivityName(mActivity) != null) {
9249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ActionBar ab = getSupportActionBar();
9349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (ab == null) {
9449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mEnableDefaultActionBarUp = true;
9549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            } else {
9649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ab.setDefaultDisplayHomeAsUpEnabled(true);
9749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
9949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
10049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
10149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
1026386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public ActionBar createSupportActionBar() {
10330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        ensureSubDecor();
10449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ActionBar ab = new WindowDecorActionBar(mActivity, mOverlayActionBar);
10549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ab.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
10649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return ab;
10749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
10849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
10949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
11049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    void setSupportActionBar(Toolbar toolbar) {
11149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (getSupportActionBar() instanceof WindowDecorActionBar) {
11249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalStateException("This Activity already has an action bar supplied " +
11349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    "by the window decor. Do not request Window.FEATURE_ACTION_BAR and set " +
11449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    "windowActionBar to false in your theme to use a Toolbar instead.");
11549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
11649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ActionBar ab = new ToolbarActionBar(toolbar, mActivity.getTitle(), mWindowMenuCallback);
11749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ab.invalidateOptionsMenu();
11849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setSupportActionBar(ab);
1196386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1206386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1216386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
1226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void onConfigurationChanged(Configuration newConfig) {
1236386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        // If this is called before sub-decor is installed, ActionBar will not
1246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        // be properly initialized.
1255a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes        if (mHasActionBar && mSubDecorInstalled) {
1266386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            // Note: The action bar will need to access
1276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            // view changes from superclass.
12849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ActionBar ab = getSupportActionBar();
12949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (ab != null) {
13049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                ab.onConfigurationChanged(newConfig);
13149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
1326386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
1336386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1346386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1356386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
136a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    public void onStop() {
13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ActionBar ab = getSupportActionBar();
138a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        if (ab != null) {
139a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            ab.setShowHideAnimationEnabled(false);
140a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
141a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    }
142a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
143a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    @Override
144a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    public void onPostResume() {
14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ActionBar ab = getSupportActionBar();
146a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        if (ab != null) {
147a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes            ab.setShowHideAnimationEnabled(true);
148a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes        }
149a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    }
150a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes
151a1fae63dbeeef71c2daa25bfcaa2348bffc369aaChris Banes    @Override
1526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void setContentView(View v) {
1536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
15456fd50144df518461398a9b3397ee4842b346708Chris Banes        ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
15556fd50144df518461398a9b3397ee4842b346708Chris Banes        contentParent.removeAllViews();
15656fd50144df518461398a9b3397ee4842b346708Chris Banes        contentParent.addView(v);
157d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes        mActivity.onSupportContentChanged();
1586386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
1616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void setContentView(int resId) {
1626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
16356fd50144df518461398a9b3397ee4842b346708Chris Banes        ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
16456fd50144df518461398a9b3397ee4842b346708Chris Banes        contentParent.removeAllViews();
16556fd50144df518461398a9b3397ee4842b346708Chris Banes        mActivity.getLayoutInflater().inflate(resId, contentParent);
166d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes        mActivity.onSupportContentChanged();
1676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1686386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
1706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void setContentView(View v, ViewGroup.LayoutParams lp) {
1716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
17256fd50144df518461398a9b3397ee4842b346708Chris Banes        ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
17356fd50144df518461398a9b3397ee4842b346708Chris Banes        contentParent.removeAllViews();
17456fd50144df518461398a9b3397ee4842b346708Chris Banes        contentParent.addView(v, lp);
175d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes        mActivity.onSupportContentChanged();
1766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
1796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void addContentView(View v, ViewGroup.LayoutParams lp) {
1806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        ensureSubDecor();
18156fd50144df518461398a9b3397ee4842b346708Chris Banes        ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
18256fd50144df518461398a9b3397ee4842b346708Chris Banes        contentParent.addView(v, lp);
183d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes        mActivity.onSupportContentChanged();
184d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes    }
185d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes
186d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes    @Override
187d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes    public void onContentChanged() {
188d64322f4b9686fabfd5a03f402d50a8e3fe5adedChris Banes        // Ignore all calls to this method as we call onSupportContentChanged manually above
1896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
1906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
1918123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    final void ensureSubDecor() {
19256fd50144df518461398a9b3397ee4842b346708Chris Banes        if (!mSubDecorInstalled) {
19356fd50144df518461398a9b3397ee4842b346708Chris Banes            if (mHasActionBar) {
19449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mActivity.superSetContentView(R.layout.abc_screen_toolbar);
19549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
19661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                ViewGroup root = (ViewGroup) mActivity.findViewById(R.id.action_bar_root);
19761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                if (root != null && root.getChildCount() == 0) {
19861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                    /**
19961c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                     * This needs some explanation. As we can not use the android:theme attribute
20061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                     * pre-L, we emulate it by manually creating a LayoutInflater using a
20161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                     * ContextThemeWrapper pointing to actionBarTheme.
20261c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                     */
20361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                    TypedValue outValue = new TypedValue();
20461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                    mActivity.getTheme().resolveAttribute(R.attr.actionBarTheme, outValue, true);
20561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes
20661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                    Context themedContext;
20761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                    if (outValue.resourceId != 0) {
20861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                        themedContext = new ContextThemeWrapper(mActivity, outValue.resourceId);
20961c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                    } else {
21061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                        themedContext = mActivity;
21161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                    }
21261c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes
21361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                    LayoutInflater.from(themedContext)
21461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                            .inflate(R.layout.abc_screen_toolbar_include, root, true);
21561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                }
21661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes
21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorContentParent = (DecorContentParent) mActivity.findViewById(R.id.decor_content_parent);
21849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorContentParent.setWindowCallback(mWindowMenuCallback);
219ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
22056fd50144df518461398a9b3397ee4842b346708Chris Banes                /**
22149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                 * Propagate features to DecorContentParent
22256fd50144df518461398a9b3397ee4842b346708Chris Banes                 */
22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if (mOverlayActionBar) {
22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mDecorContentParent.initFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY);
22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
22656fd50144df518461398a9b3397ee4842b346708Chris Banes                if (mFeatureProgress) {
22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mDecorContentParent.initFeature(Window.FEATURE_PROGRESS);
22856fd50144df518461398a9b3397ee4842b346708Chris Banes                }
22956fd50144df518461398a9b3397ee4842b346708Chris Banes                if (mFeatureIndeterminateProgress) {
23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mDecorContentParent.initFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
23156fd50144df518461398a9b3397ee4842b346708Chris Banes                }
23256fd50144df518461398a9b3397ee4842b346708Chris Banes            } else {
23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mActivity.superSetContentView(R.layout.abc_screen_simple);
2343954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes            }
2353954d59cb6073615ead9dd34cbdba9e16b8c5b6fChris Banes
23692b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            // Change our content FrameLayout to use the android.R.id.content id.
23792b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            // Useful for fragments.
23892b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            View content = mActivity.findViewById(android.R.id.content);
23992b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            content.setId(View.NO_ID);
24092b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            View abcContent = mActivity.findViewById(R.id.action_bar_activity_content);
24192b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes            abcContent.setId(android.R.id.content);
24292b18eb0263ef2421fda5bf977fea3bf044bf941Chris Banes
243f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes            // A title was set before we've install the decor so set it now.
24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mTitleToSet != null && mDecorContentParent != null) {
24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorContentParent.setWindowTitle(mTitleToSet);
24656fd50144df518461398a9b3397ee4842b346708Chris Banes                mTitleToSet = null;
247f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes            }
248556ac47ce764a4a9320b5ac914536e9da2524176Chris Banes
24956fd50144df518461398a9b3397ee4842b346708Chris Banes            applyFixedSizeWindow();
25056fd50144df518461398a9b3397ee4842b346708Chris Banes
25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            onSubDecorInstalled();
25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
253f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes            mSubDecorInstalled = true;
2548902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
2558902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            // Post supportInvalidateOptionsMenu() so that the menu is invalidated post-onCreate()
25656fd50144df518461398a9b3397ee4842b346708Chris Banes            mActivity.getWindow().getDecorView().post(new Runnable() {
2578902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                @Override
2588902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                public void run() {
2598902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                    supportInvalidateOptionsMenu();
2608902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                }
2618902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            });
2626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
2636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
2646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
26549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    void onSubDecorInstalled() {}
26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
26756fd50144df518461398a9b3397ee4842b346708Chris Banes    private void applyFixedSizeWindow() {
26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        TypedArray a = mActivity.obtainStyledAttributes(R.styleable.Theme);
26956fd50144df518461398a9b3397ee4842b346708Chris Banes
27056fd50144df518461398a9b3397ee4842b346708Chris Banes        TypedValue mFixedWidthMajor = null;
27156fd50144df518461398a9b3397ee4842b346708Chris Banes        TypedValue mFixedWidthMinor = null;
27256fd50144df518461398a9b3397ee4842b346708Chris Banes        TypedValue mFixedHeightMajor = null;
27356fd50144df518461398a9b3397ee4842b346708Chris Banes        TypedValue mFixedHeightMinor = null;
27456fd50144df518461398a9b3397ee4842b346708Chris Banes
27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (a.hasValue(R.styleable.Theme_windowFixedWidthMajor)) {
27656fd50144df518461398a9b3397ee4842b346708Chris Banes            if (mFixedWidthMajor == null) mFixedWidthMajor = new TypedValue();
27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            a.getValue(R.styleable.Theme_windowFixedWidthMajor, mFixedWidthMajor);
27856fd50144df518461398a9b3397ee4842b346708Chris Banes        }
27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (a.hasValue(R.styleable.Theme_windowFixedWidthMinor)) {
28056fd50144df518461398a9b3397ee4842b346708Chris Banes            if (mFixedWidthMinor == null) mFixedWidthMinor = new TypedValue();
28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            a.getValue(R.styleable.Theme_windowFixedWidthMinor, mFixedWidthMinor);
28256fd50144df518461398a9b3397ee4842b346708Chris Banes        }
28349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (a.hasValue(R.styleable.Theme_windowFixedHeightMajor)) {
28456fd50144df518461398a9b3397ee4842b346708Chris Banes            if (mFixedHeightMajor == null) mFixedHeightMajor = new TypedValue();
28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            a.getValue(R.styleable.Theme_windowFixedHeightMajor, mFixedHeightMajor);
28656fd50144df518461398a9b3397ee4842b346708Chris Banes        }
28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (a.hasValue(R.styleable.Theme_windowFixedHeightMinor)) {
28856fd50144df518461398a9b3397ee4842b346708Chris Banes            if (mFixedHeightMinor == null) mFixedHeightMinor = new TypedValue();
28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            a.getValue(R.styleable.Theme_windowFixedHeightMinor, mFixedHeightMinor);
29056fd50144df518461398a9b3397ee4842b346708Chris Banes        }
29156fd50144df518461398a9b3397ee4842b346708Chris Banes
29256fd50144df518461398a9b3397ee4842b346708Chris Banes        final DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
29356fd50144df518461398a9b3397ee4842b346708Chris Banes        final boolean isPortrait = metrics.widthPixels < metrics.heightPixels;
29456fd50144df518461398a9b3397ee4842b346708Chris Banes        int w = ViewGroup.LayoutParams.MATCH_PARENT;
29556fd50144df518461398a9b3397ee4842b346708Chris Banes        int h = ViewGroup.LayoutParams.MATCH_PARENT;
29656fd50144df518461398a9b3397ee4842b346708Chris Banes
29756fd50144df518461398a9b3397ee4842b346708Chris Banes        final TypedValue tvw = isPortrait ? mFixedWidthMinor : mFixedWidthMajor;
29856fd50144df518461398a9b3397ee4842b346708Chris Banes        if (tvw != null && tvw.type != TypedValue.TYPE_NULL) {
29956fd50144df518461398a9b3397ee4842b346708Chris Banes            if (tvw.type == TypedValue.TYPE_DIMENSION) {
30056fd50144df518461398a9b3397ee4842b346708Chris Banes                w = (int) tvw.getDimension(metrics);
30156fd50144df518461398a9b3397ee4842b346708Chris Banes            } else if (tvw.type == TypedValue.TYPE_FRACTION) {
30256fd50144df518461398a9b3397ee4842b346708Chris Banes                w = (int) tvw.getFraction(metrics.widthPixels, metrics.widthPixels);
30356fd50144df518461398a9b3397ee4842b346708Chris Banes            }
30456fd50144df518461398a9b3397ee4842b346708Chris Banes        }
30556fd50144df518461398a9b3397ee4842b346708Chris Banes
30656fd50144df518461398a9b3397ee4842b346708Chris Banes        final TypedValue tvh = isPortrait ? mFixedHeightMajor : mFixedHeightMinor;
30756fd50144df518461398a9b3397ee4842b346708Chris Banes        if (tvh != null && tvh.type != TypedValue.TYPE_NULL) {
30856fd50144df518461398a9b3397ee4842b346708Chris Banes            if (tvh.type == TypedValue.TYPE_DIMENSION) {
30956fd50144df518461398a9b3397ee4842b346708Chris Banes                h = (int) tvh.getDimension(metrics);
31056fd50144df518461398a9b3397ee4842b346708Chris Banes            } else if (tvh.type == TypedValue.TYPE_FRACTION) {
31156fd50144df518461398a9b3397ee4842b346708Chris Banes                h = (int) tvh.getFraction(metrics.heightPixels, metrics.heightPixels);
31256fd50144df518461398a9b3397ee4842b346708Chris Banes            }
31356fd50144df518461398a9b3397ee4842b346708Chris Banes        }
31456fd50144df518461398a9b3397ee4842b346708Chris Banes
31556fd50144df518461398a9b3397ee4842b346708Chris Banes        if (w != ViewGroup.LayoutParams.MATCH_PARENT || h != ViewGroup.LayoutParams.MATCH_PARENT) {
31656fd50144df518461398a9b3397ee4842b346708Chris Banes            mActivity.getWindow().setLayout(w, h);
31756fd50144df518461398a9b3397ee4842b346708Chris Banes        }
31856fd50144df518461398a9b3397ee4842b346708Chris Banes
31956fd50144df518461398a9b3397ee4842b346708Chris Banes        a.recycle();
32056fd50144df518461398a9b3397ee4842b346708Chris Banes    }
32156fd50144df518461398a9b3397ee4842b346708Chris Banes
3226386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
323ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    public boolean supportRequestWindowFeature(int featureId) {
3246386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        switch (featureId) {
3256386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            case WindowCompat.FEATURE_ACTION_BAR:
3265a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes                mHasActionBar = true;
3276386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                return true;
3286386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            case WindowCompat.FEATURE_ACTION_BAR_OVERLAY:
3295a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes                mOverlayActionBar = true;
3306386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                return true;
331ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            case Window.FEATURE_PROGRESS:
332ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                mFeatureProgress = true;
333ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                return true;
334ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            case Window.FEATURE_INDETERMINATE_PROGRESS:
335ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                mFeatureIndeterminateProgress = true;
336ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                return true;
3376386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            default:
3386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                return mActivity.requestWindowFeature(featureId);
3396386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3406386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3416386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3426386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
343904507029cd8ea2d070b6df0911b2dd36b7075a6Chris Banes    public void onTitleChanged(CharSequence title) {
34449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mDecorContentParent != null) {
34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mDecorContentParent.setWindowTitle(title);
34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else if (getSupportActionBar() != null) {
34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            getSupportActionBar().setTitle(title);
348f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes        } else {
349f53c7bf3146bf9bcba46324f9f06449df475be36Chris Banes            mTitleToSet = title;
3506386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3526386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3546386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public View onCreatePanelView(int featureId) {
3556386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        View createdPanelView = null;
3566386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3578902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        if (featureId == Window.FEATURE_OPTIONS_PANEL && preparePanel()) {
3588902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            createdPanelView = (View) getListMenuView(mActivity, this);
3596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return createdPanelView;
3626386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3636386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3646386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
36530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    public boolean onCreatePanelMenu(int featureId, Menu menu) {
36630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        if (featureId != Window.FEATURE_OPTIONS_PANEL) {
36730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell            return mActivity.superOnCreatePanelMenu(featureId, menu);
3686386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return false;
3706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
37330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    public boolean onPreparePanel(int featureId, View view, Menu menu) {
37430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        if (featureId != Window.FEATURE_OPTIONS_PANEL) {
37530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell            return mActivity.superOnPreparePanel(featureId, view, menu);
3766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
3776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return false;
3786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
38130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell    public boolean onMenuItemSelected(int featureId, MenuItem item) {
38230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
3836e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brown            item = MenuWrapperFactory.createMenuItemWrapper(item);
38430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        }
38530837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        return mActivity.superOnMenuItemSelected(featureId, item);
3866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3896386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
39030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        return mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item);
3916386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void onMenuModeChange(MenuBuilder menu) {
3956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        reopenMenu(menu, true);
3966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
3976386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
3986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
3996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
4008902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        if (mClosingActionMenu) {
4018902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            return;
4028902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        }
4038902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        mClosingActionMenu = true;
4046386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        mActivity.closeOptionsMenu();
40549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorContentParent.dismissPopups();
4068902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        mClosingActionMenu = false;
4076386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4086386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4096386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
4106386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public boolean onOpenSubMenu(MenuBuilder subMenu) {
4116386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        return false;
4126386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4136386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4146386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    @Override
415d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    public ActionMode startSupportActionMode(ActionMode.Callback callback) {
416d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (callback == null) {
417d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            throw new IllegalArgumentException("ActionMode callback can not be null.");
418d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
419d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
420d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mActionMode != null) {
421d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActionMode.finish();
422d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
423d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
424d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback);
425d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ActionBar ab = getSupportActionBar();
427d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (ab != null) {
4285a2bcc375e046c5b6644dcc4d331d3fca0778aedChris Banes            mActionMode = ab.startActionMode(wrappedCallback);
429d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
430d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
431d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mActionMode != null) {
432d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActivity.onSupportActionModeStarted(mActionMode);
433d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
434d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        return mActionMode;
435d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
436d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
437d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    @Override
4386386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    public void supportInvalidateOptionsMenu() {
43949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final ActionBar ab = getSupportActionBar();
44049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (ab != null && ab.invalidateOptionsMenu()) return;
44149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
4428902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        if (mMenu != null) {
4438902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            Bundle savedActionViewStates = new Bundle();
4448902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            mMenu.saveActionViewStates(savedActionViewStates);
4458902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            if (savedActionViewStates.size() > 0) {
4468902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                mPanelFrozenActionViewState = savedActionViewStates;
4478902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            }
4488902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            // This will be started again when the panel is prepared.
4498902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            mMenu.stopDispatchingItemsChanged();
4508902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            mMenu.clear();
4516386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4528902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        mPanelRefreshContent = true;
4536386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4548902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        // Prepare the options panel if we have an action bar
45549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mDecorContentParent != null) {
4568902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            mPanelIsPrepared = false;
4578902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            preparePanel();
4588902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        }
4596386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4606386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) {
46249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mDecorContentParent != null && mDecorContentParent.canShowOverflowMenu() &&
46349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                (!ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mActivity)) ||
46449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        mDecorContentParent.isOverflowMenuShowPending())) {
46549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (!mDecorContentParent.isOverflowMenuShowing() || !toggleMenuMode) {
46649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorContentParent.showOverflowMenu();
4676386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            } else {
46849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorContentParent.hideOverflowMenu();
4696386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            }
4706386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            return;
4716386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4726386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4736386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        menu.close();
4746386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4756386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4766386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    private MenuView getListMenuView(Context context, MenuPresenter.Callback cb) {
4776386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mMenu == null) {
4786386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            return null;
4796386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4806386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4816386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        if (mListMenuPresenter == null) {
4826386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            TypedArray a = context.obtainStyledAttributes(R.styleable.Theme);
4836386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            final int listPresenterTheme = a.getResourceId(
4846386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    R.styleable.Theme_panelMenuListTheme,
4856386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes                    R.style.Theme_AppCompat_CompactMenu);
4866386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            a.recycle();
4876386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
4886386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mListMenuPresenter = new ListMenuPresenter(
489ee7c9fb199e9b9af8d40a1f9e27d85465acf8301Chris Banes                    R.layout.abc_list_menu_item_layout, listPresenterTheme);
4906386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mListMenuPresenter.setCallback(cb);
4919addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes            mMenu.addMenuPresenter(mListMenuPresenter);
4926386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        } else {
4936386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            // Make sure we update the ListView
4946386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes            mListMenuPresenter.updateMenuView(false);
4956386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes        }
4966386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
49730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell        return mListMenuPresenter.getMenuView(new FrameLayout(context));
4986386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes    }
4996386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes
500d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    @Override
501d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    public boolean onBackPressed() {
502d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        // Back cancels action modes first.
503d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        if (mActionMode != null) {
504d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActionMode.finish();
505d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return true;
506d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
507d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
508d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        // Next collapse any expanded action views.
50949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ActionBar ab = getSupportActionBar();
51049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (ab != null && ab.collapseActionView()) {
511d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return true;
512d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
513d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
514d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        return false;
515d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
516d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
517d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    @Override
518ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgressBarVisibility(boolean visible) {
519ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON :
520ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                Window.PROGRESS_VISIBILITY_OFF);
521ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
522ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
523ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    @Override
524ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgressBarIndeterminateVisibility(boolean visible) {
525ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON :
526ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                Window.PROGRESS_VISIBILITY_OFF);
527ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
528ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
529ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    @Override
530ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgressBarIndeterminate(boolean indeterminate) {
531ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(indeterminate ? Window.PROGRESS_INDETERMINATE_ON
532ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                : Window.PROGRESS_INDETERMINATE_OFF);
533ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
534ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
535ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    @Override
536ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    void setSupportProgress(int progress) {
537ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        updateProgressBars(Window.PROGRESS_START + progress);
538ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
539ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
54045d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes    @Override
541f4a93d160fc696de65e103e7e078106ea8f818faChris Banes    int getHomeAsUpIndicatorAttrId() {
542f4a93d160fc696de65e103e7e078106ea8f818faChris Banes        return R.attr.homeAsUpIndicator;
54345d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes    }
54445d973fcc4c43f5ea00cddd3d9b947d9e8d8fc4eChris Banes
545d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    /**
546ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes     * Progress Bar function. Mostly extracted from PhoneWindow.java
547ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes     */
548ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    private void updateProgressBars(int value) {
54949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ProgressBarCompat circularProgressBar = getCircularProgressBar();
55049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ProgressBarCompat horizontalProgressBar = getHorizontalProgressBar();
551ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
552ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (value == Window.PROGRESS_VISIBILITY_ON) {
553ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureProgress) {
554ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                int level = horizontalProgressBar.getProgress();
555ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ?
556ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                        View.VISIBLE : View.INVISIBLE;
557ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                horizontalProgressBar.setVisibility(visibility);
558ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
559ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureIndeterminateProgress) {
560ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                circularProgressBar.setVisibility(View.VISIBLE);
561ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
562ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (value == Window.PROGRESS_VISIBILITY_OFF) {
563ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureProgress) {
564ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                horizontalProgressBar.setVisibility(View.GONE);
565ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
566ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (mFeatureIndeterminateProgress) {
567ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                circularProgressBar.setVisibility(View.GONE);
568ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
569ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (value == Window.PROGRESS_INDETERMINATE_ON) {
570ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setIndeterminate(true);
571ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (value == Window.PROGRESS_INDETERMINATE_OFF) {
572ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setIndeterminate(false);
573ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) {
574ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            // We want to set the progress value before testing for visibility
575ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            // so that when the progress bar becomes visible again, it has the
576ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            // correct level.
577ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setProgress(value - Window.PROGRESS_START);
578ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
579ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            if (value < Window.PROGRESS_END) {
580ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                showProgressBars(horizontalProgressBar, circularProgressBar);
581ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            } else {
582ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes                hideProgressBars(horizontalProgressBar, circularProgressBar);
583ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            }
584ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
585ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
586ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
58749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void showProgressBars(ProgressBarCompat horizontalProgressBar,
58849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ProgressBarCompat spinnyProgressBar) {
589ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.INVISIBLE) {
590ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            spinnyProgressBar.setVisibility(View.VISIBLE);
591ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
592ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        // Only show the progress bars if the primary progress is not complete
593ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureProgress && horizontalProgressBar.getProgress() < 10000) {
594ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setVisibility(View.VISIBLE);
595ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
596ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
597ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
59849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private void hideProgressBars(ProgressBarCompat horizontalProgressBar,
59949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ProgressBarCompat spinnyProgressBar) {
600ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.VISIBLE) {
601ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            spinnyProgressBar.setVisibility(View.INVISIBLE);
602ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
603ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (mFeatureProgress && horizontalProgressBar.getVisibility() == View.VISIBLE) {
604ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            horizontalProgressBar.setVisibility(View.INVISIBLE);
605ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
606ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
607ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
60849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private ProgressBarCompat getCircularProgressBar() {
60949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ProgressBarCompat pb = (ProgressBarCompat) mActivity.findViewById(R.id.progress_circular);
610ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (pb != null) {
611ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            pb.setVisibility(View.INVISIBLE);
612ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
613ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        return pb;
614ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
615ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
61649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private ProgressBarCompat getHorizontalProgressBar() {
61749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        ProgressBarCompat pb = (ProgressBarCompat) mActivity.findViewById(R.id.progress_horizontal);
618ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        if (pb != null) {
619ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes            pb.setVisibility(View.INVISIBLE);
620ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        }
621ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes        return pb;
622ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    }
623ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes
6248902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes    private boolean initializePanelMenu() {
62561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes        Context context = mActivity;
62661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes
62761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes        if (mDecorContentParent != null) {
62861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes            final TypedValue outValue = new TypedValue();
62961c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes            final Resources.Theme baseTheme = context.getTheme();
63061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes            baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true);
63161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes
63261c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes            Resources.Theme widgetTheme = null;
63361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes            if (outValue.resourceId != 0) {
63461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                widgetTheme = context.getResources().newTheme();
63561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                widgetTheme.setTo(baseTheme);
63661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                widgetTheme.applyStyle(outValue.resourceId, true);
63761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                widgetTheme.resolveAttribute(
63861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                        R.attr.actionBarWidgetTheme, outValue, true);
63961c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes            } else {
64061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                baseTheme.resolveAttribute(
64161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                        R.attr.actionBarWidgetTheme, outValue, true);
64261c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes            }
64361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes
64461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes            if (outValue.resourceId != 0) {
64561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                if (widgetTheme == null) {
64661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                    widgetTheme = context.getResources().newTheme();
64761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                    widgetTheme.setTo(baseTheme);
64861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                }
64961c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                widgetTheme.applyStyle(outValue.resourceId, true);
65061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes            }
65161c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes
65261c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes            if (widgetTheme != null) {
65361c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                context = new ContextThemeWrapper(context, 0);
65461c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes                context.getTheme().setTo(widgetTheme);
65561c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes            }
65661c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes        }
65761c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes
65861c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes        mMenu = new MenuBuilder(context);
6598902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        mMenu.setCallback(this);
66061c0bbe56a13fe55ce91a5b1d64e751164ecb894Chris Banes
6618902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        return true;
6628902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes    }
6638902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
6648902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes    private boolean preparePanel() {
6658902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        // Already prepared (isPrepared will be reset to false later)
6668902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        if (mPanelIsPrepared) {
6678902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            return true;
6688902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        }
6698902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
6708902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        // Init the panel state's menu--return false if init failed
6718902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        if (mMenu == null || mPanelRefreshContent) {
6728902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            if (mMenu == null) {
6738902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                if (!initializePanelMenu() || (mMenu == null)) {
6748902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                    return false;
6758902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                }
6768902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            }
6778902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
67849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mDecorContentParent != null) {
67949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorContentParent.setMenu(mMenu, this);
6808902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            }
6818902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
6828902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            // Creating the panel menu will involve a lot of manipulation;
6838902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            // don't dispatch change events to presenters until we're done.
6848902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            mMenu.stopDispatchingItemsChanged();
6858902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
6868902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            // Call callback, and return if it doesn't want to display menu.
6878902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            if (!mActivity.superOnCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, mMenu)) {
6888902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                // Ditch the menu created above
6898902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                mMenu = null;
6908902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
69149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                if (mDecorContentParent != null) {
6928902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                    // Don't show it in the action bar either
69349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    mDecorContentParent.setMenu(null, this);
6948902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                }
6958902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
6968902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                return false;
6978902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            }
6988902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
6998902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            mPanelRefreshContent = false;
7008902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        }
7018902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
7028902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        // Preparing the panel menu can involve a lot of manipulation;
7038902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        // don't dispatch change events to presenters until we're done.
7048902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        mMenu.stopDispatchingItemsChanged();
7058902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
7068902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        // Restore action view state before we prepare. This gives apps
7078902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        // an opportunity to override frozen/restored state in onPrepare.
7088902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        if (mPanelFrozenActionViewState != null) {
7098902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            mMenu.restoreActionViewStates(mPanelFrozenActionViewState);
7108902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            mPanelFrozenActionViewState = null;
7118902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        }
7128902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
7138902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        // Callback and return if the callback does not want to show the menu
7148902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        if (!mActivity.superOnPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, mMenu)) {
71549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mDecorContentParent != null) {
7168902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                // The app didn't want to show the menu for now but it still exists.
7178902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes                // Clear it out of the action bar.
71849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorContentParent.setMenu(null, this);
7198902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            }
7208902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            mMenu.startDispatchingItemsChanged();
7218902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes            return false;
7228902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        }
7238902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
7248902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        mMenu.startDispatchingItemsChanged();
7258902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
7268902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        // Set other state
7278902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        mPanelIsPrepared = true;
7288902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
7298902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes        return true;
7308902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes    }
7318902df1bf0006a156503d40b1fc8a01f95d5b806Chris Banes
732ed34e2dffd0ce7da89063d06fd3b25687ca367a2Chris Banes    /**
733d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes     * Clears out internal reference when the action mode is destroyed.
734d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes     */
735d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    private class ActionModeCallbackWrapper implements ActionMode.Callback {
736d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        private ActionMode.Callback mWrapped;
737d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
738d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public ActionModeCallbackWrapper(ActionMode.Callback wrapped) {
739d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mWrapped = wrapped;
740d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
741d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
742d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
743d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return mWrapped.onCreateActionMode(mode, menu);
744d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
745d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
746d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
7479addcff1698f71fb4145f39dacaf33a9c1fef24fChris Banes            return mWrapped.onPrepareActionMode(mode, menu);
748d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
749d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
750d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
751d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            return mWrapped.onActionItemClicked(mode, item);
752d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
753d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
754d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        public void onDestroyActionMode(ActionMode mode) {
755d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mWrapped.onDestroyActionMode(mode);
756d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActivity.onSupportActionModeFinished(mode);
757d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes            mActionMode = null;
758d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes        }
759d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes    }
760d8222dedaacae30fa03bee346ebf42ee75b39928Chris Banes
7616386aac7ea9be44d23dcea28d9a02110c174e988Chris Banes}
762