ActionBarActivityDelegateBase.java revision 0b216f2263135782c361e122892a12156d5d2ce1
1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Copyright (C) 2013 The Android Open Source Project
3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * you may not use this file except in compliance with the License.
6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * You may obtain a copy of the License at
7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See the License for the specific language governing permissions and
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * limitations under the License.
15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectpackage android.support.v7.app;
18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.content.Context;
20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.content.res.Configuration;
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.content.res.Resources;
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.content.res.TypedArray;
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.os.Bundle;
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v4.app.NavUtils;
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v4.view.ViewCompat;
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v4.view.ViewConfigurationCompat;
27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v4.view.WindowCompat;
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.appcompat.R;
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.app.ToolbarActionBar;
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.app.WindowDecorActionBar;
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.view.StandaloneActionMode;
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.view.menu.ListMenuPresenter;
33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.view.menu.MenuBuilder;
34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.view.menu.MenuPresenter;
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.view.menu.MenuView;
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.widget.ActionBarContextView;
37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.widget.DecorContentParent;
38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.internal.widget.ProgressBarCompat;
39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.view.ActionMode;
40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.support.v7.widget.Toolbar;
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.util.DisplayMetrics;
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.util.TypedValue;
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.ContextThemeWrapper;
4494442ad4107000e6d49f9b85a46a591495a57632Selim Gurunimport android.view.LayoutInflater;
4594442ad4107000e6d49f9b85a46a591495a57632Selim Gurunimport android.view.Gravity;
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.Menu;
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.MenuItem;
48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.View;
49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.ViewConfiguration;
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.ViewGroup;
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.ViewStub;
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.Window;
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.view.accessibility.AccessibilityEvent;
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.widget.FrameLayout;
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectimport android.widget.PopupWindow;
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectclass ActionBarActivityDelegateBase extends ActionBarActivityDelegate
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        implements MenuBuilder.Callback {
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private static final String TAG = "ActionBarActivityDelegateBase";
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private DecorContentParent mDecorContentParent;
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private ActionMenuPresenterCallback mActionMenuPresenterCallback;
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private PanelMenuPresenterCallback mPanelMenuPresenterCallback;
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    private ListMenuPresenter mListMenuPresenter;
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private MenuBuilder mMenu;
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ActionMode mActionMode;
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ActionBarContextView mActionModeView;
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PopupWindow mActionModePopup;
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    Runnable mShowActionModePopup;
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    // true if we have installed a window sub-decor layout.
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private boolean mSubDecorInstalled;
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private ViewGroup mWindowDecor;
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private CharSequence mTitleToSet;
78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    // Used to keep track of Progress Bar Window features
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private boolean mFeatureProgress, mFeatureIndeterminateProgress;
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    // Used for emulating PanelFeatureState
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private boolean mClosingActionMenu;
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private boolean mPanelIsPrepared;
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private boolean mPanelRefreshMenuContent;
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private Bundle mPanelFrozenActionViewState;
8794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private boolean mInvalidatePanelMenuPosted;
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private final Runnable mInvalidatePanelMenuRunnable = new Runnable() {
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        @Override
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        public void run() {
9294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun            supportInvalidateOptionsMenu();
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    };
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private boolean mEnableDefaultActionBarUp;
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ActionBarActivityDelegateBase(ActionBarActivity activity) {
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        super(activity);
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void onCreate(Bundle savedInstanceState) {
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        super.onCreate(savedInstanceState);
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mWindowDecor = (ViewGroup) mActivity.getWindow().getDecorView();
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (NavUtils.getParentActivityName(mActivity) != null) {
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ActionBar ab = getSupportActionBar();
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ab == null) {
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mEnableDefaultActionBarUp = true;
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ab.setDefaultDisplayHomeAsUpEnabled(true);
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public ActionBar createSupportActionBar() {
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ensureSubDecor();
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ActionBar ab = new WindowDecorActionBar(mActivity, mOverlayActionBar);
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ab.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return ab;
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void setSupportActionBar(Toolbar toolbar) {
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (getSupportActionBar() instanceof WindowDecorActionBar) {
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            throw new IllegalStateException("This Activity already has an action bar supplied " +
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "by the window decor. Do not request Window.FEATURE_ACTION_BAR and set " +
131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "windowActionBar to false in your theme to use a Toolbar instead.");
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ToolbarActionBar tbab = new ToolbarActionBar(toolbar, mActivity.getTitle(),
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mWindowMenuCallback);
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        setSupportActionBar(tbab);
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        setWindowCallback(tbab.getWrappedWindowCallback());
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tbab.invalidateOptionsMenu();
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // If this is called before sub-decor is installed, ActionBar will not
143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // be properly initialized.
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mHasActionBar && mSubDecorInstalled) {
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // Note: The action bar will need to access
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // view changes from superclass.
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ActionBar ab = getSupportActionBar();
148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ab != null) {
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ab.onConfigurationChanged(newConfig);
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void onStop() {
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ActionBar ab = getSupportActionBar();
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ab != null) {
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ab.setShowHideAnimationEnabled(false);
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void onPostResume() {
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ActionBar ab = getSupportActionBar();
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ab != null) {
166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ab.setShowHideAnimationEnabled(true);
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void setContentView(View v) {
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ensureSubDecor();
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        contentParent.removeAllViews();
175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        contentParent.addView(v);
176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mActivity.onSupportContentChanged();
177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void setContentView(int resId) {
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ensureSubDecor();
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        contentParent.removeAllViews();
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mActivity.getLayoutInflater().inflate(resId, contentParent);
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mActivity.onSupportContentChanged();
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void setContentView(View v, ViewGroup.LayoutParams lp) {
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ensureSubDecor();
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        contentParent.removeAllViews();
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        contentParent.addView(v, lp);
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mActivity.onSupportContentChanged();
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void addContentView(View v, ViewGroup.LayoutParams lp) {
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ensureSubDecor();
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ViewGroup contentParent = (ViewGroup) mActivity.findViewById(android.R.id.content);
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        contentParent.addView(v, lp);
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mActivity.onSupportContentChanged();
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void onContentChanged() {
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // Ignore all calls to this method as we call onSupportContentChanged manually above
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    final void ensureSubDecor() {
211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!mSubDecorInstalled) {
212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mHasActionBar) {
21394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                mActivity.superSetContentView(R.layout.abc_screen_toolbar);
214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ViewGroup root = (ViewGroup) mActivity.findViewById(R.id.action_bar_root);
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (root != null && root.getChildCount() == 0) {
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /**
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * This needs some explanation. As we can not use the android:theme attribute
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * pre-L, we emulate it by manually creating a LayoutInflater using a
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * ContextThemeWrapper pointing to actionBarTheme.
221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    TypedValue outValue = new TypedValue();
223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mActivity.getTheme().resolveAttribute(R.attr.actionBarTheme, outValue, true);
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    Context themedContext;
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (outValue.resourceId != 0) {
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        themedContext = new ContextThemeWrapper(mActivity, outValue.resourceId);
228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        themedContext = mActivity;
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    LayoutInflater.from(themedContext)
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            .inflate(R.layout.abc_screen_toolbar_include, root, true);
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mDecorContentParent = (DecorContentParent) mActivity
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        .findViewById(R.id.decor_content_parent);
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mDecorContentParent.setWindowCallback(mWindowMenuCallback);
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /**
241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Propagate features to DecorContentParent
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (mOverlayActionBar) {
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mDecorContentParent.initFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY);
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (mFeatureProgress) {
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mDecorContentParent.initFeature(Window.FEATURE_PROGRESS);
248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (mFeatureIndeterminateProgress) {
250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mDecorContentParent.initFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (mOverlayActionMode) {
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActivity.superSetContentView(R.layout.abc_screen_simple_overlay_action_mode);
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActivity.superSetContentView(R.layout.abc_screen_simple);
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // Change our content FrameLayout to use the android.R.id.content id.
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // Useful for fragments.
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            View content = mActivity.findViewById(android.R.id.content);
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            content.setId(View.NO_ID);
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            View abcContent = mActivity.findViewById(R.id.action_bar_activity_content);
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            abcContent.setId(android.R.id.content);
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // A title was set before we've install the decor so set it now.
26694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun            if (mTitleToSet != null && mDecorContentParent != null) {
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mDecorContentParent.setWindowTitle(mTitleToSet);
26894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                mTitleToSet = null;
269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            applyFixedSizeWindow();
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            onSubDecorInstalled();
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mSubDecorInstalled = true;
276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            invalidatePanelMenu();
278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void onSubDecorInstalled() {}
282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private void applyFixedSizeWindow() {
284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TypedArray a = mActivity.obtainStyledAttributes(R.styleable.Theme);
285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TypedValue mFixedWidthMajor = null;
287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TypedValue mFixedWidthMinor = null;
288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TypedValue mFixedHeightMajor = null;
289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TypedValue mFixedHeightMinor = null;
290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (a.hasValue(R.styleable.Theme_windowFixedWidthMajor)) {
292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mFixedWidthMajor == null) mFixedWidthMajor = new TypedValue();
293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            a.getValue(R.styleable.Theme_windowFixedWidthMajor, mFixedWidthMajor);
294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (a.hasValue(R.styleable.Theme_windowFixedWidthMinor)) {
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mFixedWidthMinor == null) mFixedWidthMinor = new TypedValue();
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            a.getValue(R.styleable.Theme_windowFixedWidthMinor, mFixedWidthMinor);
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (a.hasValue(R.styleable.Theme_windowFixedHeightMajor)) {
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mFixedHeightMajor == null) mFixedHeightMajor = new TypedValue();
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            a.getValue(R.styleable.Theme_windowFixedHeightMajor, mFixedHeightMajor);
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (a.hasValue(R.styleable.Theme_windowFixedHeightMinor)) {
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mFixedHeightMinor == null) mFixedHeightMinor = new TypedValue();
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            a.getValue(R.styleable.Theme_windowFixedHeightMinor, mFixedHeightMinor);
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        final DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        final boolean isPortrait = metrics.widthPixels < metrics.heightPixels;
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int w = ViewGroup.LayoutParams.MATCH_PARENT;
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int h = ViewGroup.LayoutParams.MATCH_PARENT;
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        final TypedValue tvw = isPortrait ? mFixedWidthMinor : mFixedWidthMajor;
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tvw != null && tvw.type != TypedValue.TYPE_NULL) {
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tvw.type == TypedValue.TYPE_DIMENSION) {
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                w = (int) tvw.getDimension(metrics);
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (tvw.type == TypedValue.TYPE_FRACTION) {
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                w = (int) tvw.getFraction(metrics.widthPixels, metrics.widthPixels);
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        final TypedValue tvh = isPortrait ? mFixedHeightMajor : mFixedHeightMinor;
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tvh != null && tvh.type != TypedValue.TYPE_NULL) {
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tvh.type == TypedValue.TYPE_DIMENSION) {
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                h = (int) tvh.getDimension(metrics);
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (tvh.type == TypedValue.TYPE_FRACTION) {
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                h = (int) tvh.getFraction(metrics.heightPixels, metrics.heightPixels);
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (w != ViewGroup.LayoutParams.MATCH_PARENT || h != ViewGroup.LayoutParams.MATCH_PARENT) {
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mActivity.getWindow().setLayout(w, h);
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        a.recycle();
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public boolean supportRequestWindowFeature(int featureId) {
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        switch (featureId) {
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case WindowCompat.FEATURE_ACTION_BAR:
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mHasActionBar = true;
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return true;
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case WindowCompat.FEATURE_ACTION_BAR_OVERLAY:
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mOverlayActionBar = true;
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return true;
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case WindowCompat.FEATURE_ACTION_MODE_OVERLAY:
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mOverlayActionMode = true;
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return true;
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case Window.FEATURE_PROGRESS:
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mFeatureProgress = true;
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return true;
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case Window.FEATURE_INDETERMINATE_PROGRESS:
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mFeatureIndeterminateProgress = true;
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return true;
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            default:
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return mActivity.requestWindowFeature(featureId);
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void onTitleChanged(CharSequence title) {
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mDecorContentParent != null) {
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mDecorContentParent.setWindowTitle(title);
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (getSupportActionBar() != null) {
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            getSupportActionBar().setTitle(title);
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mTitleToSet = title;
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public View onCreatePanelView(int featureId) {
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        View createdPanelView = null;
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL && preparePanel()) {
377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            createdPanelView = (View) getListMenuView(mActivity);
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return createdPanelView;
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public boolean onCreatePanelMenu(int featureId, Menu menu) {
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (featureId != Window.FEATURE_OPTIONS_PANEL) {
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return mWindowMenuCallback.onCreatePanelMenu(featureId, menu);
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return false;
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public boolean onPreparePanel(int featureId, View view, Menu menu) {
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (featureId != Window.FEATURE_OPTIONS_PANEL) {
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return mWindowMenuCallback.onPreparePanel(featureId, view, menu);
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return false;
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void onPanelClosed(int featureId, Menu menu) {
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mPanelIsPrepared = false;
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
40694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    @Override
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item);
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void onMenuModeChange(MenuBuilder menu) {
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        reopenMenu(menu, true);
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public ActionMode startSupportActionMode(ActionMode.Callback callback) {
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (callback == null) {
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            throw new IllegalArgumentException("ActionMode callback can not be null.");
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mActionMode != null) {
423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mActionMode.finish();
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback);
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ActionBar ab = getSupportActionBar();
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ab != null) {
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mActionMode = ab.startActionMode(wrappedCallback);
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mActionMode != null) {
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActivity.onSupportActionModeStarted(mActionMode);
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mActionMode == null) {
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // If the action bar didn't provide an action mode, start the emulated window one
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mActionMode = startSupportActionModeFromWindow(wrappedCallback);
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return mActionMode;
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public void supportInvalidateOptionsMenu() {
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        final ActionBar ab = getSupportActionBar();
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ab != null && ab.invalidateOptionsMenu()) return;
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mMenu != null) {
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            Bundle savedActionViewStates = new Bundle();
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mMenu.saveActionViewStates(savedActionViewStates);
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (savedActionViewStates.size() > 0) {
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mPanelFrozenActionViewState = savedActionViewStates;
454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // This will be started again when the panel is prepared.
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mMenu.stopDispatchingItemsChanged();
457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mMenu.clear();
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mPanelRefreshMenuContent = true;
460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // Prepare the options panel if we have an action bar
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mDecorContentParent != null) {
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mPanelIsPrepared = false;
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            preparePanel();
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ActionMode startSupportActionModeFromWindow(ActionMode.Callback callback) {
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mActionMode != null) {
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mActionMode.finish();
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback);
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ActionMode mode = null;
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mActionModeView == null) {
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mIsFloating) {
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModeView = new ActionBarContextView(mActivity);
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModePopup = new PopupWindow(mActivity, null,
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        R.attr.actionModePopupWindowStyle);
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModePopup.setContentView(mActionModeView);
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModePopup.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                TypedValue heightValue = new TypedValue();
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActivity.getTheme().resolveAttribute(R.attr.actionBarSize, heightValue, true);
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                final int height = TypedValue.complexToDimensionPixelSize(heightValue.data,
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        mActivity.getResources().getDisplayMetrics());
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModeView.setContentHeight(height);
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModePopup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mShowActionModePopup = new Runnable() {
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    public void run() {
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        mActionModePopup.showAtLocation(
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                mActionModeView,
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                };
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ViewStub stub = (ViewStub) mActivity.findViewById(R.id.action_mode_bar_stub);
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (stub != null) {
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mActionModeView = (ActionBarContextView) stub.inflate();
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mActionModeView != null) {
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mActionModeView.killMode();
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mode = new StandaloneActionMode(mActivity, mActionModeView, wrappedCallback,
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mActionModePopup == null);
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (callback.onCreateActionMode(mode, mode.getMenu())) {
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mode.invalidate();
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModeView.initForMode(mode);
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModeView.setVisibility(View.VISIBLE);
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionMode = mode;
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (mActionModePopup != null) {
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mActivity.getWindow().getDecorView().post(mShowActionModePopup);
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModeView.sendAccessibilityEvent(
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionMode = null;
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mActionMode != null && mActivity != null) {
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mActivity.onSupportActionModeStarted(mActionMode);
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return mActionMode;
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) {
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mDecorContentParent != null && mDecorContentParent.canShowOverflowMenu() &&
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (!ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mActivity)) ||
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        mDecorContentParent.isOverflowMenuShowPending())) {
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (!mDecorContentParent.isOverflowMenuShowing() || !toggleMenuMode) {
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                // If we have a menu invalidation pending, do it now.
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (mInvalidatePanelMenuPosted) {
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mWindowDecor.removeCallbacks(mInvalidatePanelMenuRunnable);
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mInvalidatePanelMenuRunnable.run();
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                // If we don't have a menu or we're waiting for a full content refresh,
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                // forget it. This is a lingering event that no longer matters.
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (mMenu != null && !mPanelRefreshMenuContent && preparePanel()) {
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mDecorContentParent.showOverflowMenu();
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mDecorContentParent.hideOverflowMenu();
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return;
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private MenuView getListMenuView(Context context) {
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mMenu == null) {
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return null;
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mPanelMenuPresenterCallback == null) {
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mPanelMenuPresenterCallback = new PanelMenuPresenterCallback();
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mListMenuPresenter == null) {
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TypedArray a = context.obtainStyledAttributes(R.styleable.Theme);
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            final int listPresenterTheme = a.getResourceId(
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    R.styleable.Theme_panelMenuListTheme,
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    R.style.Theme_AppCompat_CompactMenu);
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            a.recycle();
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mListMenuPresenter = new ListMenuPresenter(
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    R.layout.abc_list_menu_item_layout, listPresenterTheme);
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mListMenuPresenter.setCallback(mPanelMenuPresenterCallback);
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mMenu.addMenuPresenter(mListMenuPresenter, mActivity);
57494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        } else {
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // Make sure we update the ListView
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mListMenuPresenter.updateMenuView(false);
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mListMenuPresenter.getAdapter().isEmpty()) {
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return null;
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return mListMenuPresenter.getMenuView(mWindowDecor);
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    public boolean onBackPressed() {
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // Back cancels action modes first.
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mActionMode != null) {
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mActionMode.finish();
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return true;
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // Next collapse any expanded action views.
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ActionBar ab = getSupportActionBar();
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ab != null && ab.collapseActionView()) {
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return true;
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return false;
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void setSupportProgressBarVisibility(boolean visible) {
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON :
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                Window.PROGRESS_VISIBILITY_OFF);
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void setSupportProgressBarIndeterminateVisibility(boolean visible) {
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        updateProgressBars(visible ? Window.PROGRESS_VISIBILITY_ON :
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                Window.PROGRESS_VISIBILITY_OFF);
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void setSupportProgressBarIndeterminate(boolean indeterminate) {
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        updateProgressBars(indeterminate ? Window.PROGRESS_INDETERMINATE_ON
618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                : Window.PROGRESS_INDETERMINATE_OFF);
619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void setSupportProgress(int progress) {
623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        updateProgressBars(Window.PROGRESS_START + progress);
624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    @Override
627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int getHomeAsUpIndicatorAttrId() {
628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return R.attr.homeAsUpIndicator;
629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /**
632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Progress Bar function. Mostly extracted from PhoneWindow.java
633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private void updateProgressBars(int value) {
635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ProgressBarCompat circularProgressBar = getCircularProgressBar();
636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ProgressBarCompat horizontalProgressBar = getHorizontalProgressBar();
637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (value == Window.PROGRESS_VISIBILITY_ON) {
639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mFeatureProgress) {
640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int level = horizontalProgressBar.getProgress();
641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ?
642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        View.VISIBLE : View.INVISIBLE;
643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                horizontalProgressBar.setVisibility(visibility);
644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mFeatureIndeterminateProgress) {
646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                circularProgressBar.setVisibility(View.VISIBLE);
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (value == Window.PROGRESS_VISIBILITY_OFF) {
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mFeatureProgress) {
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                horizontalProgressBar.setVisibility(View.GONE);
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mFeatureIndeterminateProgress) {
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                circularProgressBar.setVisibility(View.GONE);
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (value == Window.PROGRESS_INDETERMINATE_ON) {
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            horizontalProgressBar.setIndeterminate(true);
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (value == Window.PROGRESS_INDETERMINATE_OFF) {
658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            horizontalProgressBar.setIndeterminate(false);
659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) {
660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // We want to set the progress value before testing for visibility
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // so that when the progress bar becomes visible again, it has the
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // correct level.
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            horizontalProgressBar.setProgress(value - Window.PROGRESS_START);
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (value < Window.PROGRESS_END) {
666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                showProgressBars(horizontalProgressBar, circularProgressBar);
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                hideProgressBars(horizontalProgressBar, circularProgressBar);
669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private void showProgressBars(ProgressBarCompat horizontalProgressBar,
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ProgressBarCompat spinnyProgressBar) {
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.INVISIBLE) {
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            spinnyProgressBar.setVisibility(View.VISIBLE);
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // Only show the progress bars if the primary progress is not complete
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mFeatureProgress && horizontalProgressBar.getProgress() < 10000) {
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            horizontalProgressBar.setVisibility(View.VISIBLE);
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private void hideProgressBars(ProgressBarCompat horizontalProgressBar,
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ProgressBarCompat spinnyProgressBar) {
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mFeatureIndeterminateProgress && spinnyProgressBar.getVisibility() == View.VISIBLE) {
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            spinnyProgressBar.setVisibility(View.INVISIBLE);
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mFeatureProgress && horizontalProgressBar.getVisibility() == View.VISIBLE) {
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            horizontalProgressBar.setVisibility(View.INVISIBLE);
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
69294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    }
693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private ProgressBarCompat getCircularProgressBar() {
695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ProgressBarCompat pb = (ProgressBarCompat) mActivity.findViewById(R.id.progress_circular);
696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (pb != null) {
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            pb.setVisibility(View.INVISIBLE);
698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return pb;
700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private ProgressBarCompat getHorizontalProgressBar() {
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ProgressBarCompat pb = (ProgressBarCompat) mActivity.findViewById(R.id.progress_horizontal);
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (pb != null) {
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            pb.setVisibility(View.INVISIBLE);
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return pb;
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private boolean initializePanelMenu() {
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        Context context = mActivity;
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mDecorContentParent != null) {
714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            final TypedValue outValue = new TypedValue();
715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            final Resources.Theme baseTheme = context.getTheme();
716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true);
717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            Resources.Theme widgetTheme = null;
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (outValue.resourceId != 0) {
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                widgetTheme = context.getResources().newTheme();
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                widgetTheme.setTo(baseTheme);
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                widgetTheme.applyStyle(outValue.resourceId, true);
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                widgetTheme.resolveAttribute(
724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        R.attr.actionBarWidgetTheme, outValue, true);
725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                baseTheme.resolveAttribute(
727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        R.attr.actionBarWidgetTheme, outValue, true);
728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (outValue.resourceId != 0) {
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (widgetTheme == null) {
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    widgetTheme = context.getResources().newTheme();
733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    widgetTheme.setTo(baseTheme);
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                widgetTheme.applyStyle(outValue.resourceId, true);
736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (widgetTheme != null) {
739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                context = new ContextThemeWrapper(context, 0);
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                context.getTheme().setTo(widgetTheme);
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mMenu = new MenuBuilder(context);
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mMenu.setCallback(this);
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return true;
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private boolean preparePanel() {
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // Already prepared (isPrepared will be reset to false later)
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mPanelIsPrepared) {
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return true;
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mDecorContentParent != null) {
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // Enforce ordering guarantees around events so that the action bar never
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // dispatches menu-related events before the panel is prepared.
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mDecorContentParent.setMenuPrepared();
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // Init the panel state's menu--return false if init failed
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mMenu == null || mPanelRefreshMenuContent) {
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mMenu == null) {
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (!initializePanelMenu() || (mMenu == null)) {
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return false;
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mDecorContentParent != null) {
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (mActionMenuPresenterCallback == null) {
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mActionMenuPresenterCallback = new ActionMenuPresenterCallback();
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mDecorContentParent.setMenu(mMenu, mActionMenuPresenterCallback);
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // Creating the panel menu will involve a lot of manipulation;
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // don't dispatch change events to presenters until we're done.
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mMenu.stopDispatchingItemsChanged();
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            // Call callback, and return if it doesn't want to display menu.
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (!mWindowMenuCallback.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, mMenu)) {
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                // Ditch the menu created above
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mMenu = null;
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (mDecorContentParent != null) {
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    // Don't show it in the action bar either
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mDecorContentParent.setMenu(null, mActionMenuPresenterCallback);
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return false;
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mPanelRefreshMenuContent = false;
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // Preparing the panel menu can involve a lot of manipulation;
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // don't dispatch change events to presenters until we're done.
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mMenu.stopDispatchingItemsChanged();
800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // Restore action view state before we prepare. This gives apps
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // an opportunity to override frozen/restored state in onPrepare.
803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mPanelFrozenActionViewState != null) {
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mMenu.restoreActionViewStates(mPanelFrozenActionViewState);
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mPanelFrozenActionViewState = null;
806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // Callback and return if the callback does not want to show the menu
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!mWindowMenuCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, mMenu)) {
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mDecorContentParent != null) {
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                // The app didn't want to show the menu for now but it still exists.
812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                // Clear it out of the action bar.
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mDecorContentParent.setMenu(null, mActionMenuPresenterCallback);
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mMenu.startDispatchingItemsChanged();
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return false;
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mMenu.startDispatchingItemsChanged();
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        // Set other state
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mPanelIsPrepared = true;
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return true;
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private void checkCloseActionMenu() {
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (mClosingActionMenu) {
82994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun            return;
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mClosingActionMenu = true;
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mDecorContentParent.dismissPopups();
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        mClosingActionMenu = false;
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private void closePanel(int featureId) {
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (featureId == Window.FEATURE_OPTIONS_PANEL && mDecorContentParent != null &&
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mDecorContentParent.canShowOverflowMenu() &&
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mActivity))) {
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mDecorContentParent.hideOverflowMenu();
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mActivity.closeOptionsMenu();
844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mPanelIsPrepared = false;
845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private void invalidatePanelMenu() {
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!mInvalidatePanelMenuPosted && mWindowDecor != null) {
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ViewCompat.postOnAnimation(mWindowDecor, mInvalidatePanelMenuRunnable);
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mInvalidatePanelMenuPosted = true;
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /**
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Clears out internal reference when the action mode is destroyed.
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private class ActionModeCallbackWrapper implements ActionMode.Callback {
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        private ActionMode.Callback mWrapped;
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        public ActionModeCallbackWrapper(ActionMode.Callback wrapped) {
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mWrapped = wrapped;
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return mWrapped.onCreateActionMode(mode, menu);
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return mWrapped.onPrepareActionMode(mode, menu);
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return mWrapped.onActionItemClicked(mode, item);
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        public void onDestroyActionMode(ActionMode mode) {
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mWrapped.onDestroyActionMode(mode);
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mActionModePopup != null) {
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActivity.getWindow().getDecorView().removeCallbacks(mShowActionModePopup);
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModePopup.dismiss();
882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (mActionModeView != null) {
883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModeView.setVisibility(View.GONE);
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mActionModeView != null) {
886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                mActionModeView.removeAllViews();
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (mActivity != null) {
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                try {
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    mActivity.onSupportActionModeFinished(mActionMode);
891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } catch (AbstractMethodError ame) {
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    // Older apps might not implement this callback method.
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            mActionMode = null;
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private final class PanelMenuPresenterCallback implements MenuPresenter.Callback {
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        @Override
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        public boolean onOpenSubMenu(MenuBuilder subMenu) {
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return false;
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        @Override
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            closePanel(Window.FEATURE_OPTIONS_PANEL);
908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    private final class ActionMenuPresenterCallback implements MenuPresenter.Callback {
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        @Override
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        public boolean onOpenSubMenu(MenuBuilder subMenu) {
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return false;
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        @Override
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
91994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun            checkCloseActionMenu();
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project