149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/*
249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Copyright (C) 2014 The Android Open Source Project
349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * you may not use this file except in compliance with the License.
649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * You may obtain a copy of the License at
749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes *
1049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Unless required by applicable law or agreed to in writing, software
1149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
1249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * See the License for the specific language governing permissions and
1449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * limitations under the License.
1549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */
1649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
1749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
1849c78900da0d43140fb602431fb93212bd7f6c70Chris Banespackage android.support.v7.internal.app;
1949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
2049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.Context;
2149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.res.Configuration;
2257c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banesimport android.content.res.Resources;
2349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.graphics.drawable.Drawable;
2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.annotation.Nullable;
2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewCompat;
26c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banesimport android.support.v4.view.WindowCompat;
2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.app.ActionBar;
28ac00a989afc2f1c559fc33174f481a0a0ef5b3d8Chris Banesimport android.support.v7.appcompat.R;
2957c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banesimport android.support.v7.internal.view.menu.ListMenuPresenter;
3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.view.menu.MenuBuilder;
31c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banesimport android.support.v7.internal.view.menu.MenuPresenter;
3249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.widget.DecorToolbar;
3349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.widget.ToolbarWidgetWrapper;
3449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.view.ActionMode;
3549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.Toolbar;
360b216f2263135782c361e122892a12156d5d2ce1Chris Banesimport android.support.v7.widget.WindowCallbackWrapper;
3757c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banesimport android.util.TypedValue;
3857c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banesimport android.view.ContextThemeWrapper;
3949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.KeyEvent;
4049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.LayoutInflater;
4149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Menu;
4249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.MenuItem;
4349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.View;
4449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Window;
4549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.widget.SpinnerAdapter;
4649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
4749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport java.util.ArrayList;
4849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
4949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/**
5049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide
5149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */
5249c78900da0d43140fb602431fb93212bd7f6c70Chris Banespublic class ToolbarActionBar extends ActionBar {
5349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private DecorToolbar mDecorToolbar;
540b216f2263135782c361e122892a12156d5d2ce1Chris Banes    private boolean mToolbarMenuPrepared;
5549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private WindowCallback mWindowCallback;
56c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes    private boolean mMenuCallbackSet;
5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private boolean mLastMenuVisibility;
5949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private ArrayList<OnMenuVisibilityListener> mMenuVisibilityListeners =
6049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            new ArrayList<OnMenuVisibilityListener>();
6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
62da0b9d63d6f940cbfd5b526c3f81858aeadcb7e8Chris Banes    private Window mWindow;
6357c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes    private ListMenuPresenter mListMenuPresenter;
6457c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes
6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private final Runnable mMenuInvalidator = new Runnable() {
6649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
6749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void run() {
6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            populateOptionsMenu();
6949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    };
7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private final Toolbar.OnMenuItemClickListener mMenuClicker =
7349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            new Toolbar.OnMenuItemClickListener() {
7449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                @Override
7549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                public boolean onMenuItemClick(MenuItem item) {
7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    return mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item);
7749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
7849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            };
7949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
80da0b9d63d6f940cbfd5b526c3f81858aeadcb7e8Chris Banes    public ToolbarActionBar(Toolbar toolbar, CharSequence title, Window window,
81da0b9d63d6f940cbfd5b526c3f81858aeadcb7e8Chris Banes            WindowCallback windowCallback) {
82a2c72b87007d10202c25e78e904938f770c6337dChris Banes        mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false);
830b216f2263135782c361e122892a12156d5d2ce1Chris Banes        mWindowCallback = new ToolbarCallbackWrapper(windowCallback);
8449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setWindowCallback(mWindowCallback);
8549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        toolbar.setOnMenuItemClickListener(mMenuClicker);
8649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setWindowTitle(title);
87da0b9d63d6f940cbfd5b526c3f81858aeadcb7e8Chris Banes
88da0b9d63d6f940cbfd5b526c3f81858aeadcb7e8Chris Banes        mWindow = window;
8949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
9049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
910b216f2263135782c361e122892a12156d5d2ce1Chris Banes    public WindowCallback getWrappedWindowCallback() {
920b216f2263135782c361e122892a12156d5d2ce1Chris Banes        return mWindowCallback;
930b216f2263135782c361e122892a12156d5d2ce1Chris Banes    }
940b216f2263135782c361e122892a12156d5d2ce1Chris Banes
9549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
9649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(View view) {
9749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setCustomView(view, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
9949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
10049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
10149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(View view, LayoutParams layoutParams) {
10249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        view.setLayoutParams(layoutParams);
10349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setCustomView(view);
10449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
10549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
10649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
10749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(int resId) {
1086aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        final LayoutInflater inflater = LayoutInflater.from(mDecorToolbar.getContext());
1096aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        setCustomView(inflater.inflate(resId, mDecorToolbar.getViewGroup(), false));
11049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
11149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
11249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
11349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(int resId) {
11449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setIcon(resId);
11549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
11649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
11749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
11849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(Drawable icon) {
11949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setIcon(icon);
12049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
12149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
12249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
12349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(int resId) {
12449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setLogo(resId);
12549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
12649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
12749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
12849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(Drawable logo) {
12949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setLogo(logo);
13049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
13149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
13249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
13349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setStackedBackgroundDrawable(Drawable d) {
13449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // This space for rent (do nothing)
13549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
13649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
13849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSplitBackgroundDrawable(Drawable d) {
13949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // This space for rent (do nothing)
14049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
14149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
14249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
14349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeButtonEnabled(boolean enabled) {
14449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // If the nav button on a Toolbar is present, it's enabled. No-op.
14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
14649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
14749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
14849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setElevation(float elevation) {
1496aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        ViewCompat.setElevation(mDecorToolbar.getViewGroup(), elevation);
15049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
15149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
15249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
15349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public float getElevation() {
1546aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return ViewCompat.getElevation(mDecorToolbar.getViewGroup());
15549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
15649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
15849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Context getThemedContext() {
1596aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getContext();
16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
16149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
16349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isTitleTruncated() {
16449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return super.isTitleTruncated();
16549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
16649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
16749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
16849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeAsUpIndicator(Drawable indicator) {
1696aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mDecorToolbar.setNavigationIcon(indicator);
17049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
17149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
17249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
17349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeAsUpIndicator(int resId) {
1746aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mDecorToolbar.setNavigationIcon(resId);
17549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
17649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
17849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeActionContentDescription(CharSequence description) {
179b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        mDecorToolbar.setNavigationContentDescription(description);
18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDefaultDisplayHomeAsUpEnabled(boolean enabled) {
18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Do nothing
18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
18849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeActionContentDescription(int resId) {
189b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        mDecorToolbar.setNavigationContentDescription(resId);
19049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
19149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
19249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
19349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setShowHideAnimationEnabled(boolean enabled) {
19449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // This space for rent; no-op.
19549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
19649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
19749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
19849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void onConfigurationChanged(Configuration config) {
19949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        super.onConfigurationChanged(config);
20049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
20149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
20249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
20349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public ActionMode startActionMode(ActionMode.Callback callback) {
2044c2a95906254748cb9a843b061288265d6e185a9Chris Banes        return mWindowCallback.startActionMode(callback);
20549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
20649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
20749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
20849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) {
20949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setDropdownParams(adapter, new NavItemSelectedListener(callback));
21049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
21149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
21249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
21349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSelectedNavigationItem(int position) {
21449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (mDecorToolbar.getNavigationMode()) {
21549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_LIST:
21649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorToolbar.setDropdownSelectedPosition(position);
21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                break;
21849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            default:
21949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                throw new IllegalStateException(
22049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        "setSelectedNavigationIndex not valid for current navigation mode");
22149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getSelectedNavigationIndex() {
22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return -1;
22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getNavigationItemCount() {
23149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return 0;
23249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
23549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setTitle(CharSequence title) {
23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setTitle(title);
23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
23949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
24049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setTitle(int resId) {
24149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setTitle(resId != 0 ? mDecorToolbar.getContext().getText(resId) : null);
24249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
24349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
245ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    public void setWindowTitle(CharSequence title) {
246ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes        mDecorToolbar.setWindowTitle(title);
247ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    }
248ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes
249ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    @Override
25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSubtitle(CharSequence subtitle) {
25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setSubtitle(subtitle);
25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
25349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
25449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSubtitle(int resId) {
25649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setSubtitle(resId != 0 ? mDecorToolbar.getContext().getText(resId) : null);
25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
25849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
25949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
26049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayOptions(@DisplayOptions int options) {
26149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(options, 0xffffffff);
26249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
26349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
26549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayOptions(@DisplayOptions int options, @DisplayOptions int mask) {
266ac00a989afc2f1c559fc33174f481a0a0ef5b3d8Chris Banes        final int currentOptions = mDecorToolbar.getDisplayOptions();
267ac00a989afc2f1c559fc33174f481a0a0ef5b3d8Chris Banes        mDecorToolbar.setDisplayOptions(options & mask | currentOptions & ~mask);
26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
26949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
27049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
27149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayUseLogoEnabled(boolean useLogo) {
27249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(useLogo ? DISPLAY_USE_LOGO : 0, DISPLAY_USE_LOGO);
27349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
27449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
27649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowHomeEnabled(boolean showHome) {
27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME);
27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) {
28249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP);
28349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
28649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowTitleEnabled(boolean showTitle) {
28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE);
28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
29149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowCustomEnabled(boolean showCustom) {
29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM);
29349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
29649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setBackgroundDrawable(@Nullable Drawable d) {
2976aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mDecorToolbar.setBackgroundDrawable(d);
29849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
29949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
30049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
30149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public View getCustomView() {
30249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getCustomView();
30349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
30449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
30549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
30649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public CharSequence getTitle() {
3076aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getTitle();
30849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
30949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
31049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
31149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public CharSequence getSubtitle() {
3126aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getSubtitle();
31349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
31449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
31549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
31649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getNavigationMode() {
31749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return NAVIGATION_MODE_STANDARD;
31849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
31949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
32049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationMode(@NavigationMode int mode) {
32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mode == ActionBar.NAVIGATION_MODE_TABS) {
32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalArgumentException("Tabs not supported in this configuration");
32449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
32549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationMode(mode);
32649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
32749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
32849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
32949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getDisplayOptions() {
33049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getDisplayOptions();
33149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
33249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
33349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
33449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Tab newTab() {
33549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
33649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
33749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
33849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
33949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
34049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addTab(Tab tab) {
34149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
34249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
34349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
34449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addTab(Tab tab, boolean setSelected) {
34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
34849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
34949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
35049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
35149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
35249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addTab(Tab tab, int position) {
35349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
35449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
35549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
35649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
35749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
35849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addTab(Tab tab, int position, boolean setSelected) {
35949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
36049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
36149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
36249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
36349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
36449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeTab(Tab tab) {
36549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
36649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
36749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
36849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
36949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
37049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeTabAt(int position) {
37149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
37249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
37349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
37449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
37549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
37649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeAllTabs() {
37749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
37849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
37949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
38049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
38149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
38249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void selectTab(Tab tab) {
38349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
38449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
38549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
38649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
38749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
38849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Tab getSelectedTab() {
38949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
39049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
39149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
39249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
39349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
39449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Tab getTabAt(int index) {
39549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
39649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
39749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
39849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
39949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
40049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getTabCount() {
40149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return 0;
40249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
40349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
40449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
40549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getHeight() {
4066aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getHeight();
40749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
40849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
40949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
41049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void show() {
41149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // TODO: Consider a better transition for this.
41249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Right now use no automatic transition so that the app can supply one if desired.
4136aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mDecorToolbar.setVisibility(View.VISIBLE);
41449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
41549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
41649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
41749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void hide() {
41849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // TODO: Consider a better transition for this.
41949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Right now use no automatic transition so that the app can supply one if desired.
4206aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mDecorToolbar.setVisibility(View.GONE);
42149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
42249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
42349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
42449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isShowing() {
4256aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getVisibility() == View.VISIBLE;
42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
42749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
42849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
42949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean openOptionsMenu() {
4306aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.showOverflowMenu();
43149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
43249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
43349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
43449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean invalidateOptionsMenu() {
4356aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mDecorToolbar.getViewGroup().removeCallbacks(mMenuInvalidator);
4366aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        ViewCompat.postOnAnimation(mDecorToolbar.getViewGroup(), mMenuInvalidator);
43749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return true;
43849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
43949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
44049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
44149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean collapseActionView() {
4426aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        if (mDecorToolbar.hasExpandedActionView()) {
4436aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            mDecorToolbar.collapseActionView();
44449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return true;
44549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
44649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return false;
44749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
44849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
44949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    void populateOptionsMenu() {
4500b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes        final Menu menu = getMenu();
45149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final MenuBuilder mb = menu instanceof MenuBuilder ? (MenuBuilder) menu : null;
45249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mb != null) {
45349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mb.stopDispatchingItemsChanged();
45449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
45549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        try {
45649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            menu.clear();
45749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (!mWindowCallback.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu) ||
45849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    !mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu)) {
45949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                menu.clear();
46049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
46149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } finally {
46249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mb != null) {
46349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mb.startDispatchingItemsChanged();
46449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
46549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
46649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
46749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
46849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
46949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean onMenuKeyEvent(KeyEvent event) {
47049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (event.getAction() == KeyEvent.ACTION_UP) {
47149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            openOptionsMenu();
47249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
47349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return true;
47449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
47549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
476d15ee7df01f2f48b536a610c4739f33b226d3f81Chris Banes    @Override
477d15ee7df01f2f48b536a610c4739f33b226d3f81Chris Banes    public boolean onKeyShortcut(int keyCode, KeyEvent ev) {
478d15ee7df01f2f48b536a610c4739f33b226d3f81Chris Banes        Menu menu = getMenu();
479d15ee7df01f2f48b536a610c4739f33b226d3f81Chris Banes        return menu != null ? menu.performShortcut(keyCode, ev, 0) : false;
480d15ee7df01f2f48b536a610c4739f33b226d3f81Chris Banes    }
481d15ee7df01f2f48b536a610c4739f33b226d3f81Chris Banes
48249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
48349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mMenuVisibilityListeners.add(listener);
48449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
48549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
48649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
48749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mMenuVisibilityListeners.remove(listener);
48849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
48949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
49049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void dispatchMenuVisibilityChanged(boolean isVisible) {
49149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (isVisible == mLastMenuVisibility) {
49249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return;
49349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
49449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mLastMenuVisibility = isVisible;
49549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
49649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int count = mMenuVisibilityListeners.size();
49749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        for (int i = 0; i < count; i++) {
49849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible);
49949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
50049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
5010b216f2263135782c361e122892a12156d5d2ce1Chris Banes
50257c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes    private View getListMenuView(Menu menu) {
50346dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes        ensureListMenuPresenter(menu);
50446dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes
505da0b9d63d6f940cbfd5b526c3f81858aeadcb7e8Chris Banes        if (menu == null || mListMenuPresenter == null) {
50657c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes            return null;
50757c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        }
50857c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes
50957c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        if (mListMenuPresenter.getAdapter().getCount() > 0) {
5106aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            return (View) mListMenuPresenter.getMenuView(mDecorToolbar.getViewGroup());
51157c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        }
51257c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        return null;
51357c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes    }
51457c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes
51546dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes    private void ensureListMenuPresenter(Menu menu) {
51646dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes        if (mListMenuPresenter == null && (menu instanceof MenuBuilder)) {
51746dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            MenuBuilder mb = (MenuBuilder) menu;
51846dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes
51946dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            Context context = mDecorToolbar.getContext();
52046dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            final TypedValue outValue = new TypedValue();
52146dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            final Resources.Theme widgetTheme = context.getResources().newTheme();
52246dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            widgetTheme.setTo(context.getTheme());
52346dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes
52446dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            // Apply the panelMenuListTheme
52546dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            widgetTheme.resolveAttribute(R.attr.panelMenuListTheme, outValue, true);
52646dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            if (outValue.resourceId != 0) {
52746dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes                widgetTheme.applyStyle(outValue.resourceId, true);
52846dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            } else {
52946dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes                widgetTheme.applyStyle(R.style.Theme_AppCompat_CompactMenu, true);
53046dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            }
53146dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes
53246dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            context = new ContextThemeWrapper(context, 0);
53346dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            context.getTheme().setTo(widgetTheme);
53446dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes
53546dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            // Finally create the list menu presenter
53646dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            mListMenuPresenter = new ListMenuPresenter(context, R.layout.abc_list_menu_item_layout);
53746dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            mListMenuPresenter.setCallback(new PanelMenuPresenterCallback());
53846dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes            mb.addMenuPresenter(mListMenuPresenter);
53946dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes        }
54046dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes    }
54146dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes
5420b216f2263135782c361e122892a12156d5d2ce1Chris Banes    private class ToolbarCallbackWrapper extends WindowCallbackWrapper {
5430b216f2263135782c361e122892a12156d5d2ce1Chris Banes        public ToolbarCallbackWrapper(WindowCallback wrapped) {
5440b216f2263135782c361e122892a12156d5d2ce1Chris Banes            super(wrapped);
5450b216f2263135782c361e122892a12156d5d2ce1Chris Banes        }
5460b216f2263135782c361e122892a12156d5d2ce1Chris Banes
5470b216f2263135782c361e122892a12156d5d2ce1Chris Banes        @Override
5480b216f2263135782c361e122892a12156d5d2ce1Chris Banes        public boolean onPreparePanel(int featureId, View view, Menu menu) {
5490b216f2263135782c361e122892a12156d5d2ce1Chris Banes            final boolean result = super.onPreparePanel(featureId, view, menu);
5500b216f2263135782c361e122892a12156d5d2ce1Chris Banes            if (result && !mToolbarMenuPrepared) {
5510b216f2263135782c361e122892a12156d5d2ce1Chris Banes                mDecorToolbar.setMenuPrepared();
5520b216f2263135782c361e122892a12156d5d2ce1Chris Banes                mToolbarMenuPrepared = true;
5530b216f2263135782c361e122892a12156d5d2ce1Chris Banes            }
5540b216f2263135782c361e122892a12156d5d2ce1Chris Banes            return result;
5550b216f2263135782c361e122892a12156d5d2ce1Chris Banes        }
55657c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes
55757c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        @Override
55857c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        public View onCreatePanelView(int featureId) {
55957c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes            switch (featureId) {
56057c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes                case Window.FEATURE_OPTIONS_PANEL:
56146dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes                    final Menu menu = mDecorToolbar.getMenu();
56246dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes                    if (mWindowCallback != null &&
56346dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes                            mWindowCallback.onPreparePanel(featureId, null, menu) &&
56446dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes                            mWindowCallback.onMenuOpened(featureId, menu)) {
56546dfe0c53492ef0cb59873123ca141906fbb7dccChris Banes                        return getListMenuView(menu);
56657c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes                    }
56757c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes                    break;
56857c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes            }
56957c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes            return super.onCreatePanelView(featureId);
57057c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        }
5710b216f2263135782c361e122892a12156d5d2ce1Chris Banes    }
572c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
5730b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes    private Menu getMenu() {
5740b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes        if (!mMenuCallbackSet) {
5756aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            mDecorToolbar.setMenuCallbacks(new ActionMenuPresenterCallback(),
5766aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar                    new MenuBuilderCallback());
5770b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes            mMenuCallbackSet = true;
5780b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes        }
5796aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getMenu();
5800b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes    }
5810b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes
582c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes    private final class ActionMenuPresenterCallback implements MenuPresenter.Callback {
583c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        private boolean mClosingActionMenu;
584c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
585c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        @Override
586c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        public boolean onOpenSubMenu(MenuBuilder subMenu) {
587c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            if (mWindowCallback != null) {
588c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                mWindowCallback.onMenuOpened(WindowCompat.FEATURE_ACTION_BAR, subMenu);
589c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                return true;
590c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            }
591c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            return false;
592c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        }
593c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
594c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        @Override
595c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
596c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            if (mClosingActionMenu) {
597c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                return;
598c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            }
599c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
600c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            mClosingActionMenu = true;
6016aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            mDecorToolbar.dismissPopupMenus();
602c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            if (mWindowCallback != null) {
603c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                mWindowCallback.onPanelClosed(WindowCompat.FEATURE_ACTION_BAR, menu);
604c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            }
605c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            mClosingActionMenu = false;
606c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        }
607c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes    }
608c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
60957c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes    private final class PanelMenuPresenterCallback implements MenuPresenter.Callback {
61057c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        @Override
61157c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
61257c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes            if (mWindowCallback != null) {
61357c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes                mWindowCallback.onPanelClosed(Window.FEATURE_OPTIONS_PANEL, menu);
61457c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes            }
615da0b9d63d6f940cbfd5b526c3f81858aeadcb7e8Chris Banes
616da0b9d63d6f940cbfd5b526c3f81858aeadcb7e8Chris Banes            // Close the options panel
617da0b9d63d6f940cbfd5b526c3f81858aeadcb7e8Chris Banes            mWindow.closePanel(Window.FEATURE_OPTIONS_PANEL);
61857c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        }
61957c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes
62057c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        @Override
62157c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        public boolean onOpenSubMenu(MenuBuilder subMenu) {
62257c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes            if (subMenu == null && mWindowCallback != null) {
62357c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes                mWindowCallback.onMenuOpened(Window.FEATURE_OPTIONS_PANEL, subMenu);
62457c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes            }
62557c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes            return true;
62657c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        }
62757c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes    }
62857c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes
629c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes    private final class MenuBuilderCallback implements MenuBuilder.Callback {
630c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
631c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        @Override
632c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
633c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            return false;
634c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        }
635c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
636c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        @Override
637c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        public void onMenuModeChange(MenuBuilder menu) {
638c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            if (mWindowCallback != null) {
6396aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar                if (mDecorToolbar.isOverflowMenuShowing()) {
640c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                    mWindowCallback.onPanelClosed(WindowCompat.FEATURE_ACTION_BAR, menu);
641c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                } else if (mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL,
642c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                        null, menu)) {
643c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                    mWindowCallback.onMenuOpened(WindowCompat.FEATURE_ACTION_BAR, menu);
644c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                }
645c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            }
646c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        }
647c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes    }
6480b216f2263135782c361e122892a12156d5d2ce1Chris Banes}
649