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