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