1e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell/*
2e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Copyright (C) 2014 The Android Open Source Project
3e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *
4e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Licensed under the Apache License, Version 2.0 (the "License");
5e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * you may not use this file except in compliance with the License.
6e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * You may obtain a copy of the License at
7e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *
8e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *      http://www.apache.org/licenses/LICENSE-2.0
9e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *
10e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Unless required by applicable law or agreed to in writing, software
11e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * distributed under the License is distributed on an "AS IS" BASIS,
12e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * See the License for the specific language governing permissions and
14e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * limitations under the License.
15e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */
16e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
17e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
18e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellpackage com.android.internal.app;
19e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
20e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.annotation.Nullable;
21e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.app.ActionBar;
22e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.content.Context;
23e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.content.res.Configuration;
24e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.graphics.drawable.Drawable;
25e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.ActionMode;
2607a74548ae5c1e064508cb1c79ac34de1142b240Adam Powellimport android.view.KeyEvent;
27e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.LayoutInflater;
2807a74548ae5c1e064508cb1c79ac34de1142b240Adam Powellimport android.view.Menu;
2907a74548ae5c1e064508cb1c79ac34de1142b240Adam Powellimport android.view.MenuItem;
30e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.View;
3107a74548ae5c1e064508cb1c79ac34de1142b240Adam Powellimport android.view.Window;
3214e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powellimport android.view.WindowCallbackWrapper;
33e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.widget.SpinnerAdapter;
34e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.widget.Toolbar;
3507a74548ae5c1e064508cb1c79ac34de1142b240Adam Powellimport com.android.internal.view.menu.MenuBuilder;
3604c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powellimport com.android.internal.view.menu.MenuPresenter;
3707a74548ae5c1e064508cb1c79ac34de1142b240Adam Powellimport com.android.internal.widget.DecorToolbar;
3807a74548ae5c1e064508cb1c79ac34de1142b240Adam Powellimport com.android.internal.widget.ToolbarWidgetWrapper;
39e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
40e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport java.util.ArrayList;
41e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
42e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellpublic class ToolbarActionBar extends ActionBar {
4307a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    private DecorToolbar mDecorToolbar;
4414e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell    private boolean mToolbarMenuPrepared;
4507a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    private Window.Callback mWindowCallback;
4604c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell    private boolean mMenuCallbackSet;
47e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
48e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private boolean mLastMenuVisibility;
49e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private ArrayList<OnMenuVisibilityListener> mMenuVisibilityListeners =
50e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            new ArrayList<OnMenuVisibilityListener>();
51e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
5207a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    private final Runnable mMenuInvalidator = new Runnable() {
5307a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        @Override
5407a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        public void run() {
5507a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            populateOptionsMenu();
5607a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        }
5707a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    };
5807a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell
5907a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    private final Toolbar.OnMenuItemClickListener mMenuClicker =
6007a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            new Toolbar.OnMenuItemClickListener() {
6107a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        @Override
6207a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        public boolean onMenuItemClick(MenuItem item) {
6307a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            return mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item);
6407a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        }
6507a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    };
6607a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell
6707a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    public ToolbarActionBar(Toolbar toolbar, CharSequence title, Window.Callback windowCallback) {
682aa09a94dd540650d3ebad7363e4fb3aab2ebc95Adam Powell        mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false);
6914e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell        mWindowCallback = new ToolbarCallbackWrapper(windowCallback);
70b40484bb30838e2769857f30f439cd0fc5e8223eAdam Powell        mDecorToolbar.setWindowCallback(mWindowCallback);
7107a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        toolbar.setOnMenuItemClickListener(mMenuClicker);
7207a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        mDecorToolbar.setWindowTitle(title);
73e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
74e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
7514e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell    public Window.Callback getWrappedWindowCallback() {
7614e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell        return mWindowCallback;
7714e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell    }
7814e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell
79e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
80e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setCustomView(View view) {
81e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setCustomView(view, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
82e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
83e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
84e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
85e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setCustomView(View view, LayoutParams layoutParams) {
8607a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        view.setLayoutParams(layoutParams);
8707a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        mDecorToolbar.setCustomView(view);
88e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
89e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
90e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
91e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setCustomView(int resId) {
92fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        final LayoutInflater inflater = LayoutInflater.from(mDecorToolbar.getContext());
93fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        setCustomView(inflater.inflate(resId, mDecorToolbar.getViewGroup(), false));
94e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
95e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
96e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
97e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setIcon(int resId) {
9807a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        mDecorToolbar.setIcon(resId);
99e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
100e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
101e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
102e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setIcon(Drawable icon) {
10307a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        mDecorToolbar.setIcon(icon);
104e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
105e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
106e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
107e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setLogo(int resId) {
10807a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        mDecorToolbar.setLogo(resId);
109e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
110e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
111e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
112e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setLogo(Drawable logo) {
11307a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        mDecorToolbar.setLogo(logo);
114e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
115e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
116e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
117e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setStackedBackgroundDrawable(Drawable d) {
118e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // This space for rent (do nothing)
119e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
120e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
121e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
122e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setSplitBackgroundDrawable(Drawable d) {
123e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // This space for rent (do nothing)
124e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
125e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
126e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
127e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setHomeButtonEnabled(boolean enabled) {
128e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // If the nav button on a Toolbar is present, it's enabled. No-op.
129e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
130e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
131e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
13214d1fa4ba753d3480abf031525da0aa23d8e5abeAdam Powell    public void setElevation(float elevation) {
133fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        mDecorToolbar.getViewGroup().setElevation(elevation);
13414d1fa4ba753d3480abf031525da0aa23d8e5abeAdam Powell    }
13514d1fa4ba753d3480abf031525da0aa23d8e5abeAdam Powell
13614d1fa4ba753d3480abf031525da0aa23d8e5abeAdam Powell    @Override
13714d1fa4ba753d3480abf031525da0aa23d8e5abeAdam Powell    public float getElevation() {
138fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        return mDecorToolbar.getViewGroup().getElevation();
13914d1fa4ba753d3480abf031525da0aa23d8e5abeAdam Powell    }
14014d1fa4ba753d3480abf031525da0aa23d8e5abeAdam Powell
14114d1fa4ba753d3480abf031525da0aa23d8e5abeAdam Powell    @Override
142e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public Context getThemedContext() {
143fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        return mDecorToolbar.getContext();
144e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
145e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
146e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
147e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public boolean isTitleTruncated() {
148e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return super.isTitleTruncated();
149e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
150e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
151e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
152e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setHomeAsUpIndicator(Drawable indicator) {
153fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        mDecorToolbar.setNavigationIcon(indicator);
154e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
155e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
156e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
157e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setHomeAsUpIndicator(int resId) {
158fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        mDecorToolbar.setNavigationIcon(resId);
159e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
160e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
161e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
162e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setHomeActionContentDescription(CharSequence description) {
163e91f7c0219d0f47d9c44a4933b571b0a482ec058Yigit Boyar        mDecorToolbar.setNavigationContentDescription(description);
164e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
165e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
166e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
167e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setDefaultDisplayHomeAsUpEnabled(boolean enabled) {
168e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // Do nothing
169e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
170e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
171e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
172e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setHomeActionContentDescription(int resId) {
173e91f7c0219d0f47d9c44a4933b571b0a482ec058Yigit Boyar        mDecorToolbar.setNavigationContentDescription(resId);
174e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
175e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
176e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
177e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setShowHideAnimationEnabled(boolean enabled) {
178e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // This space for rent; no-op.
179e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
180e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
181e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
182e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void onConfigurationChanged(Configuration config) {
183e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        super.onConfigurationChanged(config);
184e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
185e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
186e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
187e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public ActionMode startActionMode(ActionMode.Callback callback) {
1881dcedbac347a363f77bc7d4818a7da6aefd4d9f4Adam Powell        return null;
189e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
190e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
191e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
192e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) {
1936790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell        mDecorToolbar.setDropdownParams(adapter, new NavItemSelectedListener(callback));
194e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
195e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
196e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
197e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setSelectedNavigationItem(int position) {
1986790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell        switch (mDecorToolbar.getNavigationMode()) {
1996790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell            case NAVIGATION_MODE_LIST:
2006790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                mDecorToolbar.setDropdownSelectedPosition(position);
2016790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                break;
2026790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell            default:
2036790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                throw new IllegalStateException(
2046790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                        "setSelectedNavigationIndex not valid for current navigation mode");
2056790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell        }
206e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
207e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
208e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
209e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public int getSelectedNavigationIndex() {
210e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return -1;
211e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
212e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
213e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
214e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public int getNavigationItemCount() {
215e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return 0;
216e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
217e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
218e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
219e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setTitle(CharSequence title) {
22007a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        mDecorToolbar.setTitle(title);
221e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
222e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
223e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
224e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setTitle(int resId) {
22507a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        mDecorToolbar.setTitle(resId != 0 ? mDecorToolbar.getContext().getText(resId) : null);
226e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
227e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
228e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
229af2d85973ed768e390bc2f40f255ea39cc6f6fe5Adam Powell    public void setWindowTitle(CharSequence title) {
230af2d85973ed768e390bc2f40f255ea39cc6f6fe5Adam Powell        mDecorToolbar.setWindowTitle(title);
231af2d85973ed768e390bc2f40f255ea39cc6f6fe5Adam Powell    }
232af2d85973ed768e390bc2f40f255ea39cc6f6fe5Adam Powell
233af2d85973ed768e390bc2f40f255ea39cc6f6fe5Adam Powell    @Override
234e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setSubtitle(CharSequence subtitle) {
23507a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        mDecorToolbar.setSubtitle(subtitle);
236e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
237e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
238e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
239e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setSubtitle(int resId) {
24007a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        mDecorToolbar.setSubtitle(resId != 0 ? mDecorToolbar.getContext().getText(resId) : null);
241e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
242e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
243e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
244e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setDisplayOptions(@DisplayOptions int options) {
245e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setDisplayOptions(options, 0xffffffff);
246e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
247e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
248e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
249e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setDisplayOptions(@DisplayOptions int options, @DisplayOptions int mask) {
25012b0321c0b400f105cad40568a1f572020ba6336Adam Powell        final int currentOptions = mDecorToolbar.getDisplayOptions();
25112b0321c0b400f105cad40568a1f572020ba6336Adam Powell        mDecorToolbar.setDisplayOptions(options & mask | currentOptions & ~mask);
252e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
253e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
254e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
255e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setDisplayUseLogoEnabled(boolean useLogo) {
256e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setDisplayOptions(useLogo ? DISPLAY_USE_LOGO : 0, DISPLAY_USE_LOGO);
257e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
258e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
259e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
260e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setDisplayShowHomeEnabled(boolean showHome) {
261e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME);
262e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
263e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
264e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
265e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) {
266e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP);
267e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
268e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
269e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
270e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setDisplayShowTitleEnabled(boolean showTitle) {
271e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE);
272e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
273e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
274e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
275e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setDisplayShowCustomEnabled(boolean showCustom) {
276e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM);
277e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
278e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
279e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
280e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setBackgroundDrawable(@Nullable Drawable d) {
281fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        mDecorToolbar.setBackgroundDrawable(d);
282e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
283e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
284e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
285e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public View getCustomView() {
28607a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        return mDecorToolbar.getCustomView();
287e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
288e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
289e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
290e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public CharSequence getTitle() {
291fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        return mDecorToolbar.getTitle();
292e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
293e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
294e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
295e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public CharSequence getSubtitle() {
296fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        return mDecorToolbar.getSubtitle();
297e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
298e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
299e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
300e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public int getNavigationMode() {
301e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return NAVIGATION_MODE_STANDARD;
302e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
303e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
304e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
305e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setNavigationMode(@NavigationMode int mode) {
306e002c2fb39f9df1db38a7412832882ae622660d4Adam Powell        if (mode == ActionBar.NAVIGATION_MODE_TABS) {
307e002c2fb39f9df1db38a7412832882ae622660d4Adam Powell            throw new IllegalArgumentException("Tabs not supported in this configuration");
308e002c2fb39f9df1db38a7412832882ae622660d4Adam Powell        }
3096790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell        mDecorToolbar.setNavigationMode(mode);
310e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
311e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
312e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
313e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public int getDisplayOptions() {
31407a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        return mDecorToolbar.getDisplayOptions();
315e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
316e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
317e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
318e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public Tab newTab() {
319e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        throw new UnsupportedOperationException(
3206790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                "Tabs are not supported in toolbar action bars");
321e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
322e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
323e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
324e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void addTab(Tab tab) {
325e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        throw new UnsupportedOperationException(
3266790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                "Tabs are not supported in toolbar action bars");
327e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
328e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
329e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
330e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void addTab(Tab tab, boolean setSelected) {
331e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        throw new UnsupportedOperationException(
3326790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                "Tabs are not supported in toolbar action bars");
333e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
334e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
335e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
336e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void addTab(Tab tab, int position) {
337e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        throw new UnsupportedOperationException(
3386790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                "Tabs are not supported in toolbar action bars");
339e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
340e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
341e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
342e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void addTab(Tab tab, int position, boolean setSelected) {
343e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        throw new UnsupportedOperationException(
3446790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                "Tabs are not supported in toolbar action bars");
345e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
346e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
347e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
348e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void removeTab(Tab tab) {
349e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        throw new UnsupportedOperationException(
3506790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                "Tabs are not supported in toolbar action bars");
351e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
352e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
353e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
354e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void removeTabAt(int position) {
355e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        throw new UnsupportedOperationException(
3566790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                "Tabs are not supported in toolbar action bars");
357e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
358e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
359e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
360e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void removeAllTabs() {
361e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        throw new UnsupportedOperationException(
3626790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                "Tabs are not supported in toolbar action bars");
363e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
364e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
365e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
366e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void selectTab(Tab tab) {
367e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        throw new UnsupportedOperationException(
3686790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                "Tabs are not supported in toolbar action bars");
369e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
370e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
371e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
372e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public Tab getSelectedTab() {
373e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        throw new UnsupportedOperationException(
3746790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                "Tabs are not supported in toolbar action bars");
375e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
376e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
377e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
378e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public Tab getTabAt(int index) {
379e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        throw new UnsupportedOperationException(
3806790b0502b0ab6375ab9f750a5faf6a9b1748a4cAdam Powell                "Tabs are not supported in toolbar action bars");
381e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
382e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
383e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
384e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public int getTabCount() {
385e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return 0;
386e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
387e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
388e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
389e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public int getHeight() {
390fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        return mDecorToolbar.getHeight();
391e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
392e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
393e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
394e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void show() {
395e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // TODO: Consider a better transition for this.
396e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // Right now use no automatic transition so that the app can supply one if desired.
397fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        mDecorToolbar.setVisibility(View.VISIBLE);
398e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
399e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
400e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
401e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void hide() {
402e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // TODO: Consider a better transition for this.
403e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // Right now use no automatic transition so that the app can supply one if desired.
404fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        mDecorToolbar.setVisibility(View.GONE);
405e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
406e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
407e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
408e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public boolean isShowing() {
409fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        return mDecorToolbar.getVisibility() == View.VISIBLE;
410e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
411e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
41207a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    @Override
41307a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    public boolean openOptionsMenu() {
414fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        return mDecorToolbar.showOverflowMenu();
41507a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    }
41607a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell
41707a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    @Override
41807a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    public boolean invalidateOptionsMenu() {
419fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        mDecorToolbar.getViewGroup().removeCallbacks(mMenuInvalidator);
420fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        mDecorToolbar.getViewGroup().postOnAnimation(mMenuInvalidator);
42107a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        return true;
42207a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    }
42307a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell
42407a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    @Override
42507a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    public boolean collapseActionView() {
426fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        if (mDecorToolbar.hasExpandedActionView()) {
427fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar            mDecorToolbar.collapseActionView();
42807a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            return true;
42907a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        }
43007a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        return false;
43107a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    }
43207a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell
43307a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    void populateOptionsMenu() {
43404c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell        if (!mMenuCallbackSet) {
435fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar            mDecorToolbar.setMenuCallbacks(new ActionMenuPresenterCallback(), new MenuBuilderCallback());
43604c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell            mMenuCallbackSet = true;
43704c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell        }
438fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar        final Menu menu = mDecorToolbar.getMenu();
43907a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        final MenuBuilder mb = menu instanceof MenuBuilder ? (MenuBuilder) menu : null;
44007a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        if (mb != null) {
44107a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            mb.stopDispatchingItemsChanged();
44207a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        }
44307a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        try {
44407a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            menu.clear();
44507a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            if (!mWindowCallback.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu) ||
44607a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell                    !mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu)) {
44707a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell                menu.clear();
44807a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            }
44907a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        } finally {
45007a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            if (mb != null) {
45107a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell                mb.startDispatchingItemsChanged();
45207a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            }
45307a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        }
45407a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    }
45507a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell
45607a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    @Override
45707a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    public boolean onMenuKeyEvent(KeyEvent event) {
45807a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        if (event.getAction() == KeyEvent.ACTION_UP) {
45907a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            openOptionsMenu();
46007a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        }
46107a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        return true;
46207a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    }
46307a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell
464e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
465e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mMenuVisibilityListeners.add(listener);
466e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
467e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
468e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
469e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mMenuVisibilityListeners.remove(listener);
470e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
471e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
472e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void dispatchMenuVisibilityChanged(boolean isVisible) {
473e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (isVisible == mLastMenuVisibility) {
474e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            return;
475e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
476e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mLastMenuVisibility = isVisible;
477e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
478e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int count = mMenuVisibilityListeners.size();
479e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        for (int i = 0; i < count; i++) {
480e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible);
481e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
482e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
48314e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell
48414e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell    private class ToolbarCallbackWrapper extends WindowCallbackWrapper {
48514e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell        public ToolbarCallbackWrapper(Window.Callback wrapped) {
48614e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell            super(wrapped);
48714e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell        }
48814e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell
48914e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell        @Override
49014e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell        public boolean onPreparePanel(int featureId, View view, Menu menu) {
49114e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell            final boolean result = super.onPreparePanel(featureId, view, menu);
49214e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell            if (result && !mToolbarMenuPrepared) {
49314e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell                mDecorToolbar.setMenuPrepared();
49414e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell                mToolbarMenuPrepared = true;
49514e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell            }
49614e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell            return result;
49714e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell        }
49814e1afe0d86de826ae1831d64ca00da03da86b4bAdam Powell    }
49904c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell
50004c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell    private final class ActionMenuPresenterCallback implements MenuPresenter.Callback {
50104c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell        private boolean mClosingActionMenu;
50204c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell
50304c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell        @Override
50404c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell        public boolean onOpenSubMenu(MenuBuilder subMenu) {
50504c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell            if (mWindowCallback != null) {
50604c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell                mWindowCallback.onMenuOpened(Window.FEATURE_ACTION_BAR, subMenu);
50704c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell                return true;
50804c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell            }
50904c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell            return false;
51004c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell        }
51104c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell
51204c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell        @Override
51304c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
51404c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell            if (mClosingActionMenu) {
51504c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell                return;
51604c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell            }
51704c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell
51804c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell            mClosingActionMenu = true;
519fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar            mDecorToolbar.dismissPopupMenus();
52004c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell            if (mWindowCallback != null) {
52104c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell                mWindowCallback.onPanelClosed(Window.FEATURE_ACTION_BAR, menu);
52204c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell            }
52304c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell            mClosingActionMenu = false;
52404c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell        }
52504c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell    }
526c46125042493e66f7dfdccec24e3b0739600b194Adam Powell
527c46125042493e66f7dfdccec24e3b0739600b194Adam Powell    private final class MenuBuilderCallback implements MenuBuilder.Callback {
528c46125042493e66f7dfdccec24e3b0739600b194Adam Powell
529c46125042493e66f7dfdccec24e3b0739600b194Adam Powell        @Override
530c46125042493e66f7dfdccec24e3b0739600b194Adam Powell        public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
531c46125042493e66f7dfdccec24e3b0739600b194Adam Powell            return false;
532c46125042493e66f7dfdccec24e3b0739600b194Adam Powell        }
533c46125042493e66f7dfdccec24e3b0739600b194Adam Powell
534c46125042493e66f7dfdccec24e3b0739600b194Adam Powell        @Override
535c46125042493e66f7dfdccec24e3b0739600b194Adam Powell        public void onMenuModeChange(MenuBuilder menu) {
536c46125042493e66f7dfdccec24e3b0739600b194Adam Powell            if (mWindowCallback != null) {
537fe6d57c366ba78295d3320cb73512f02876eed61Yigit Boyar                if (mDecorToolbar.isOverflowMenuShowing()) {
538c46125042493e66f7dfdccec24e3b0739600b194Adam Powell                    mWindowCallback.onPanelClosed(Window.FEATURE_ACTION_BAR, menu);
539c46125042493e66f7dfdccec24e3b0739600b194Adam Powell                } else if (mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL,
540c46125042493e66f7dfdccec24e3b0739600b194Adam Powell                        null, menu)) {
541c46125042493e66f7dfdccec24e3b0739600b194Adam Powell                    mWindowCallback.onMenuOpened(Window.FEATURE_ACTION_BAR, menu);
542c46125042493e66f7dfdccec24e3b0739600b194Adam Powell                }
543c46125042493e66f7dfdccec24e3b0739600b194Adam Powell            }
544c46125042493e66f7dfdccec24e3b0739600b194Adam Powell        }
545c46125042493e66f7dfdccec24e3b0739600b194Adam Powell    }
546e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell}
547