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
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.appcompat.app;
1849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
1995ada0d979d626a4631cae1b3b09334e1f0f992dAurimas Liutikasimport android.annotation.SuppressLint;
2049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.Context;
2149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.res.Configuration;
2249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.graphics.drawable.Drawable;
239d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banesimport android.view.KeyCharacterMap;
2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.KeyEvent;
2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.LayoutInflater;
2649c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Menu;
2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.MenuItem;
2849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.View;
29a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mountimport android.view.ViewGroup;
3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Window;
3149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.widget.SpinnerAdapter;
3249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
333de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasimport androidx.annotation.Nullable;
343de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasimport androidx.appcompat.view.WindowCallbackWrapper;
353de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasimport androidx.appcompat.view.menu.MenuBuilder;
363de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasimport androidx.appcompat.view.menu.MenuPresenter;
373de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasimport androidx.appcompat.widget.DecorToolbar;
383de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasimport androidx.appcompat.widget.Toolbar;
393de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasimport androidx.appcompat.widget.ToolbarWidgetWrapper;
403de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasimport androidx.core.view.ViewCompat;
413de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikas
4249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport java.util.ArrayList;
4349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
4466698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesclass ToolbarActionBar extends ActionBar {
452c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    DecorToolbar mDecorToolbar;
462c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    boolean mToolbarMenuPrepared;
472c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas    Window.Callback mWindowCallback;
48c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes    private boolean mMenuCallbackSet;
4949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
5049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private boolean mLastMenuVisibility;
518d4765883ff24f0f79bf64fea23d4687d50cec85Chris Banes    private ArrayList<OnMenuVisibilityListener> mMenuVisibilityListeners = new ArrayList<>();
5249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
5349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private final Runnable mMenuInvalidator = new Runnable() {
5449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
5549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void run() {
5649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            populateOptionsMenu();
5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    };
5949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
6049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    private final Toolbar.OnMenuItemClickListener mMenuClicker =
6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            new Toolbar.OnMenuItemClickListener() {
6249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                @Override
6349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                public boolean onMenuItemClick(MenuItem item) {
6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    return mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item);
6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                }
6649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            };
6749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
680dbe090bba314e72d65d5404c9fb15b7550a698dAndrei Stingaceanu    ToolbarActionBar(Toolbar toolbar, CharSequence title, Window.Callback windowCallback) {
69a2c72b87007d10202c25e78e904938f770c6337dChris Banes        mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false);
700dbe090bba314e72d65d5404c9fb15b7550a698dAndrei Stingaceanu        mWindowCallback = new ToolbarCallbackWrapper(windowCallback);
7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setWindowCallback(mWindowCallback);
7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        toolbar.setOnMenuItemClickListener(mMenuClicker);
7349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setWindowTitle(title);
7449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
7549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
76f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes    public Window.Callback getWrappedWindowCallback() {
770b216f2263135782c361e122892a12156d5d2ce1Chris Banes        return mWindowCallback;
780b216f2263135782c361e122892a12156d5d2ce1Chris Banes    }
790b216f2263135782c361e122892a12156d5d2ce1Chris Banes
8049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
8149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(View view) {
8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setCustomView(view, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
8349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
8449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
8549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
8649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(View view, LayoutParams layoutParams) {
8700374d6956602a63c2d57b1962131b175e20d811Adam Powell        if (view != null) {
8800374d6956602a63c2d57b1962131b175e20d811Adam Powell            view.setLayoutParams(layoutParams);
8900374d6956602a63c2d57b1962131b175e20d811Adam Powell        }
9049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setCustomView(view);
9149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
9249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
9349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
9449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setCustomView(int resId) {
956aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        final LayoutInflater inflater = LayoutInflater.from(mDecorToolbar.getContext());
966aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        setCustomView(inflater.inflate(resId, mDecorToolbar.getViewGroup(), false));
9749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
9949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
10049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(int resId) {
10149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setIcon(resId);
10249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
10349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
10449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
10549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setIcon(Drawable icon) {
10649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setIcon(icon);
10749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
10849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
10949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
11049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(int resId) {
11149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setLogo(resId);
11249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
11349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
11449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
11549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setLogo(Drawable logo) {
11649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setLogo(logo);
11749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
11849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
11949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
12049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setStackedBackgroundDrawable(Drawable d) {
12149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // This space for rent (do nothing)
12249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
12349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
12449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
12549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSplitBackgroundDrawable(Drawable d) {
12649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // This space for rent (do nothing)
12749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
12849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
12949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
13049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeButtonEnabled(boolean enabled) {
13149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // If the nav button on a Toolbar is present, it's enabled. No-op.
13249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
13349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
13449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
13549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setElevation(float elevation) {
1366aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        ViewCompat.setElevation(mDecorToolbar.getViewGroup(), elevation);
13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
13849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
13949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
14049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public float getElevation() {
1416aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return ViewCompat.getElevation(mDecorToolbar.getViewGroup());
14249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
14349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
14449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Context getThemedContext() {
1466aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getContext();
14749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
14849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
14949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
15049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isTitleTruncated() {
15149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return super.isTitleTruncated();
15249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
15349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
15449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
15549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeAsUpIndicator(Drawable indicator) {
1566aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mDecorToolbar.setNavigationIcon(indicator);
15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
15849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
15949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeAsUpIndicator(int resId) {
1616aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mDecorToolbar.setNavigationIcon(resId);
16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
16349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
16449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
16549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeActionContentDescription(CharSequence description) {
166b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        mDecorToolbar.setNavigationContentDescription(description);
16749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
16849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
16949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
17049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDefaultDisplayHomeAsUpEnabled(boolean enabled) {
17149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Do nothing
17249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
17349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
17449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
17549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setHomeActionContentDescription(int resId) {
176b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar        mDecorToolbar.setNavigationContentDescription(resId);
17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
17849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
17949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setShowHideAnimationEnabled(boolean enabled) {
18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // This space for rent; no-op.
18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void onConfigurationChanged(Configuration config) {
18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        super.onConfigurationChanged(config);
18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
18849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
18949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
19049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) {
19149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setDropdownParams(adapter, new NavItemSelectedListener(callback));
19249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
19349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
19449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
19549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSelectedNavigationItem(int position) {
19649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        switch (mDecorToolbar.getNavigationMode()) {
19749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            case NAVIGATION_MODE_LIST:
19849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mDecorToolbar.setDropdownSelectedPosition(position);
19949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                break;
20049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            default:
20149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                throw new IllegalStateException(
20249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                        "setSelectedNavigationIndex not valid for current navigation mode");
20349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
20449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
20549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
20649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
20749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getSelectedNavigationIndex() {
20849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return -1;
20949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
21049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
21149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
21249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getNavigationItemCount() {
21349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return 0;
21449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
21549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
21649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setTitle(CharSequence title) {
21849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setTitle(title);
21949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
22049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
22149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setTitle(int resId) {
22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setTitle(resId != 0 ? mDecorToolbar.getContext().getText(resId) : null);
22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
227ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    public void setWindowTitle(CharSequence title) {
228ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes        mDecorToolbar.setWindowTitle(title);
229ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    }
230ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes
231ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes    @Override
232a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount    public boolean requestFocus() {
233a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount        final ViewGroup viewGroup = mDecorToolbar.getViewGroup();
234a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount        if (viewGroup != null && !viewGroup.hasFocus()) {
235a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount            viewGroup.requestFocus();
236a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount            return true;
237a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount        }
238a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount        return false;
239a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount    }
240a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount
241a6d085f83e2aec7ebda1fbbc69a5fd63c5f2e235George Mount    @Override
24249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSubtitle(CharSequence subtitle) {
24349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setSubtitle(subtitle);
24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setSubtitle(int resId) {
24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setSubtitle(resId != 0 ? mDecorToolbar.getContext().getText(resId) : null);
24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
25195ada0d979d626a4631cae1b3b09334e1f0f992dAurimas Liutikas    @SuppressLint("WrongConstant")
25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
25349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayOptions(@DisplayOptions int options) {
25449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(options, 0xffffffff);
25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
25649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
25849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayOptions(@DisplayOptions int options, @DisplayOptions int mask) {
259ac00a989afc2f1c559fc33174f481a0a0ef5b3d8Chris Banes        final int currentOptions = mDecorToolbar.getDisplayOptions();
260ad1b0e82100ee31e70040d77bfa4d847b2bf0864Aurimas Liutikas        mDecorToolbar.setDisplayOptions((options & mask) | (currentOptions & ~mask));
26149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
26249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
26349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayUseLogoEnabled(boolean useLogo) {
26549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(useLogo ? DISPLAY_USE_LOGO : 0, DISPLAY_USE_LOGO);
26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
26749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
26949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowHomeEnabled(boolean showHome) {
27049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME);
27149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
27249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
27349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
27449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) {
27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP);
27649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowTitleEnabled(boolean showTitle) {
28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE);
28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
28249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
28349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setDisplayShowCustomEnabled(boolean showCustom) {
28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM);
28649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setBackgroundDrawable(@Nullable Drawable d) {
2906aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mDecorToolbar.setBackgroundDrawable(d);
29149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public View getCustomView() {
29549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getCustomView();
29649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
29749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
29849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
29949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public CharSequence getTitle() {
3006aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getTitle();
30149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
30249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
30349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
30449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public CharSequence getSubtitle() {
3056aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getSubtitle();
30649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
30749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
30849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
30949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getNavigationMode() {
31049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return NAVIGATION_MODE_STANDARD;
31149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
31249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
31349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
31449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void setNavigationMode(@NavigationMode int mode) {
31549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mode == ActionBar.NAVIGATION_MODE_TABS) {
31649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            throw new IllegalArgumentException("Tabs not supported in this configuration");
31749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
31849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mDecorToolbar.setNavigationMode(mode);
31949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
32049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getDisplayOptions() {
32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return mDecorToolbar.getDisplayOptions();
32449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
32549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
32649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
32749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Tab newTab() {
32849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
32949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
33049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
33149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
33249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
33349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addTab(Tab tab) {
33449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
33549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
33649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
33749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
33849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
33949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addTab(Tab tab, boolean setSelected) {
34049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
34149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
34249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
34349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
34449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addTab(Tab tab, int position) {
34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
34849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
34949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
35049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
35149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addTab(Tab tab, int position, boolean setSelected) {
35249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
35349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
35449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
35549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
35649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
35749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeTab(Tab tab) {
35849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
35949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
36049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
36149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
36249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
36349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeTabAt(int position) {
36449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
36549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
36649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
36749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
36849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
36949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeAllTabs() {
37049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
37149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
37249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
37349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
37449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
37549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void selectTab(Tab tab) {
37649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
37749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
37849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
37949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
38049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
38149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Tab getSelectedTab() {
38249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
38349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
38449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
38549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
38649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
38749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public Tab getTabAt(int index) {
38849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        throw new UnsupportedOperationException(
38949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                "Tabs are not supported in toolbar action bars");
39049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
39149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
39249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
39349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getTabCount() {
39449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return 0;
39549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
39649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
39749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
39849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public int getHeight() {
3996aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getHeight();
40049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
40149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
40249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
40349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void show() {
40449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // TODO: Consider a better transition for this.
40549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        // Right now use no automatic transition so that the app can supply one if desired.
4066aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mDecorToolbar.setVisibility(View.VISIBLE);
40749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
40849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
40949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
41049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void hide() {
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.GONE);
41449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
41549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
41649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
41749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean isShowing() {
4186aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getVisibility() == View.VISIBLE;
41949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
42049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
42149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
42249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean openOptionsMenu() {
4236aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.showOverflowMenu();
42449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
42549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
42749b39d17068f2d6ff09378827b2a7d56163b6ffdEvan Rosky    public boolean closeOptionsMenu() {
42849b39d17068f2d6ff09378827b2a7d56163b6ffdEvan Rosky        return mDecorToolbar.hideOverflowMenu();
42949b39d17068f2d6ff09378827b2a7d56163b6ffdEvan Rosky    }
43049b39d17068f2d6ff09378827b2a7d56163b6ffdEvan Rosky
43149b39d17068f2d6ff09378827b2a7d56163b6ffdEvan Rosky    @Override
43249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean invalidateOptionsMenu() {
4336aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        mDecorToolbar.getViewGroup().removeCallbacks(mMenuInvalidator);
4346aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        ViewCompat.postOnAnimation(mDecorToolbar.getViewGroup(), mMenuInvalidator);
43549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return true;
43649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
43749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
43849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
43949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean collapseActionView() {
4406aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        if (mDecorToolbar.hasExpandedActionView()) {
4416aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            mDecorToolbar.collapseActionView();
44249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return true;
44349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
44449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return false;
44549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
44649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
44749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    void populateOptionsMenu() {
4480b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes        final Menu menu = getMenu();
44949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final MenuBuilder mb = menu instanceof MenuBuilder ? (MenuBuilder) menu : null;
45049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (mb != null) {
45149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mb.stopDispatchingItemsChanged();
45249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
45349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        try {
45449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            menu.clear();
45549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (!mWindowCallback.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu) ||
45649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                    !mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu)) {
45749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                menu.clear();
45849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
45949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } finally {
46049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mb != null) {
46149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mb.startDispatchingItemsChanged();
46249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
46349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
46449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
46549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
46649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    @Override
46749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public boolean onMenuKeyEvent(KeyEvent event) {
46849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (event.getAction() == KeyEvent.ACTION_UP) {
46949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            openOptionsMenu();
47049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
47149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return true;
47249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
47349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
474d15ee7df01f2f48b536a610c4739f33b226d3f81Chris Banes    @Override
475d15ee7df01f2f48b536a610c4739f33b226d3f81Chris Banes    public boolean onKeyShortcut(int keyCode, KeyEvent ev) {
476d15ee7df01f2f48b536a610c4739f33b226d3f81Chris Banes        Menu menu = getMenu();
4779efaee2e7e3a147405847736eacdb5e1c66ae1c2Chris Banes        if (menu != null) {
4789d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes            final KeyCharacterMap kmap = KeyCharacterMap.load(
4799d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes                    ev != null ? ev.getDeviceId() : KeyCharacterMap.VIRTUAL_KEYBOARD);
4809d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes            menu.setQwertyMode(kmap.getKeyboardType() != KeyCharacterMap.NUMERIC);
481113d68e595334184b9795437af894309f25040ffEvan Rosky            return menu.performShortcut(keyCode, ev, 0);
4829efaee2e7e3a147405847736eacdb5e1c66ae1c2Chris Banes        }
483113d68e595334184b9795437af894309f25040ffEvan Rosky        return false;
484d15ee7df01f2f48b536a610c4739f33b226d3f81Chris Banes    }
485d15ee7df01f2f48b536a610c4739f33b226d3f81Chris Banes
486733d0b2acb07ede7455b9d020901a10586053923Chris Banes    @Override
487733d0b2acb07ede7455b9d020901a10586053923Chris Banes    void onDestroy() {
488733d0b2acb07ede7455b9d020901a10586053923Chris Banes        // Remove any invalidation callbacks
489733d0b2acb07ede7455b9d020901a10586053923Chris Banes        mDecorToolbar.getViewGroup().removeCallbacks(mMenuInvalidator);
490733d0b2acb07ede7455b9d020901a10586053923Chris Banes    }
491733d0b2acb07ede7455b9d020901a10586053923Chris Banes
492e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas    @Override
49349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
49449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mMenuVisibilityListeners.add(listener);
49549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
49649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
497e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas    @Override
49849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
49949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mMenuVisibilityListeners.remove(listener);
50049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
50149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
502e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas    @Override
50349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public void dispatchMenuVisibilityChanged(boolean isVisible) {
50449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (isVisible == mLastMenuVisibility) {
50549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            return;
50649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
50749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        mLastMenuVisibility = isVisible;
50849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
50949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        final int count = mMenuVisibilityListeners.size();
51049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        for (int i = 0; i < count; i++) {
51149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible);
51249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
51349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
5140b216f2263135782c361e122892a12156d5d2ce1Chris Banes
5150b216f2263135782c361e122892a12156d5d2ce1Chris Banes    private class ToolbarCallbackWrapper extends WindowCallbackWrapper {
516f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes        public ToolbarCallbackWrapper(Window.Callback wrapped) {
5170b216f2263135782c361e122892a12156d5d2ce1Chris Banes            super(wrapped);
5180b216f2263135782c361e122892a12156d5d2ce1Chris Banes        }
5190b216f2263135782c361e122892a12156d5d2ce1Chris Banes
5200b216f2263135782c361e122892a12156d5d2ce1Chris Banes        @Override
5210b216f2263135782c361e122892a12156d5d2ce1Chris Banes        public boolean onPreparePanel(int featureId, View view, Menu menu) {
5220b216f2263135782c361e122892a12156d5d2ce1Chris Banes            final boolean result = super.onPreparePanel(featureId, view, menu);
5230b216f2263135782c361e122892a12156d5d2ce1Chris Banes            if (result && !mToolbarMenuPrepared) {
5240b216f2263135782c361e122892a12156d5d2ce1Chris Banes                mDecorToolbar.setMenuPrepared();
5250b216f2263135782c361e122892a12156d5d2ce1Chris Banes                mToolbarMenuPrepared = true;
5260b216f2263135782c361e122892a12156d5d2ce1Chris Banes            }
5270b216f2263135782c361e122892a12156d5d2ce1Chris Banes            return result;
5280b216f2263135782c361e122892a12156d5d2ce1Chris Banes        }
52957c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes
53057c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        @Override
53157c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        public View onCreatePanelView(int featureId) {
532113d68e595334184b9795437af894309f25040ffEvan Rosky            if (featureId == Window.FEATURE_OPTIONS_PANEL) {
533113d68e595334184b9795437af894309f25040ffEvan Rosky                // This gets called by PhoneWindow.preparePanel. Since this already manages
534113d68e595334184b9795437af894309f25040ffEvan Rosky                // its own panel, we return a dummy view here to prevent PhoneWindow from
535113d68e595334184b9795437af894309f25040ffEvan Rosky                // preparing a default one.
536113d68e595334184b9795437af894309f25040ffEvan Rosky                return new View(mDecorToolbar.getContext());
53757c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes            }
53857c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes            return super.onCreatePanelView(featureId);
53957c6de90985a63358129b99b9f0cd4d6afe887d6Chris Banes        }
5400b216f2263135782c361e122892a12156d5d2ce1Chris Banes    }
541c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
5420b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes    private Menu getMenu() {
5430b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes        if (!mMenuCallbackSet) {
5446aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            mDecorToolbar.setMenuCallbacks(new ActionMenuPresenterCallback(),
5456aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar                    new MenuBuilderCallback());
5460b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes            mMenuCallbackSet = true;
5470b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes        }
5486aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar        return mDecorToolbar.getMenu();
5490b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes    }
5500b7aedbbe43b9d4af60cc4ebd4994c74ebe6bc5fChris Banes
551c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes    private final class ActionMenuPresenterCallback implements MenuPresenter.Callback {
552c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        private boolean mClosingActionMenu;
553c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
5542c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas        ActionMenuPresenterCallback() {
5552c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas        }
5562c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas
557c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        @Override
558c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        public boolean onOpenSubMenu(MenuBuilder subMenu) {
559c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            if (mWindowCallback != null) {
560d25af35061a9f20d59b25329d613c62c20184dadChris Banes                mWindowCallback.onMenuOpened(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, subMenu);
561c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                return true;
562c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            }
563c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            return false;
564c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        }
565c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
566c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        @Override
567c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
568c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            if (mClosingActionMenu) {
569c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                return;
570c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            }
571c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
572c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            mClosingActionMenu = true;
5736aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar            mDecorToolbar.dismissPopupMenus();
574c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            if (mWindowCallback != null) {
575d25af35061a9f20d59b25329d613c62c20184dadChris Banes                mWindowCallback.onPanelClosed(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, menu);
576c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            }
577c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            mClosingActionMenu = false;
578c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        }
579c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes    }
580c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
581c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes    private final class MenuBuilderCallback implements MenuBuilder.Callback {
582c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
5832c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas        MenuBuilderCallback() {
5842c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas        }
5852c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas
586c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        @Override
587c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
588c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            return false;
589c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        }
590c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes
591c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        @Override
592c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        public void onMenuModeChange(MenuBuilder menu) {
593c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            if (mWindowCallback != null) {
5946aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar                if (mDecorToolbar.isOverflowMenuShowing()) {
595d25af35061a9f20d59b25329d613c62c20184dadChris Banes                    mWindowCallback.onPanelClosed(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, menu);
596c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                } else if (mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL,
597c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                        null, menu)) {
598d25af35061a9f20d59b25329d613c62c20184dadChris Banes                    mWindowCallback.onMenuOpened(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, menu);
599c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes                }
600c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes            }
601c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes        }
602c4b9e0cb716a4caff218b27d86f37ef8117d257bChris Banes    }
6030b216f2263135782c361e122892a12156d5d2ce1Chris Banes}
604