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 1866698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banespackage android.support.v7.widget; 1949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 2049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.app.ActionBar; 2149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.Context; 2249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.graphics.drawable.Drawable; 2349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.os.Parcelable; 24c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo; 2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewCompat; 26acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banesimport android.support.v4.view.ViewPropertyAnimatorCompat; 2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListenerAdapter; 2866698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.app.WindowDecorActionBar; 2949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.appcompat.R; 304c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banesimport android.support.v7.content.res.AppCompatResources; 3166698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.ActionMenuItem; 3266698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuBuilder; 3366698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuPresenter; 3449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.text.TextUtils; 3549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.util.Log; 3649c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.util.SparseArray; 3749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Gravity; 3849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.LayoutInflater; 3949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Menu; 4049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.View; 4149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.ViewGroup; 4249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.Window; 43f933672168f6deff5e3636584bec735416b5a93bChris Banesimport android.widget.AdapterView; 44f933672168f6deff5e3636584bec735416b5a93bChris Banesimport android.widget.Spinner; 4549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.widget.SpinnerAdapter; 4649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 47c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport static android.support.annotation.RestrictTo.Scope.GROUP_ID; 48c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette 4949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/** 5049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Internal class used to interact with the Toolbar widget without 5149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * exposing interface methods to the public API. 5249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * 5349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * <p>ToolbarWidgetWrapper manages the differences between Toolbar and ActionBarView 5449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * so that either variant acting as a 5566698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banes * {@link WindowDecorActionBar WindowDecorActionBar} can behave 5649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * in the same way.</p> 5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * 5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide 5949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */ 60c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette@RestrictTo(GROUP_ID) 6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banespublic class ToolbarWidgetWrapper implements DecorToolbar { 6249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private static final String TAG = "ToolbarWidgetWrapper"; 6349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private static final int AFFECTS_LOGO_MASK = 6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO; 66acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes // Default fade duration for fading in/out tool bar. 67acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes private static final long DEFAULT_FADE_DURATION_MS = 200; 6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 692c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas Toolbar mToolbar; 7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mDisplayOpts; 7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private View mTabView; 73f933672168f6deff5e3636584bec735416b5a93bChris Banes private Spinner mSpinner; 7449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private View mCustomView; 7549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Drawable mIcon; 7749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Drawable mLogo; 7849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Drawable mNavIcon; 7949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mTitleSet; 812c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas CharSequence mTitle; 8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private CharSequence mSubtitle; 83b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar private CharSequence mHomeDescription; 8449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 852c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas Window.Callback mWindowCallback; 862c1bad7ecd5879bf0f29ce2ce1bc5bd67a3f4682Aurimas Liutikas boolean mMenuPrepared; 8749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ActionMenuPresenter mActionMenuPresenter; 8849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD; 9049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 91b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar private int mDefaultNavigationContentDescription = 0; 92acf94897e0924ff5fcd3c5b371ab1aa620cb1dc6Chris Banes private Drawable mDefaultNavigationIcon; 93469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 94a2c72b87007d10202c25e78e904938f770c6337dChris Banes public ToolbarWidgetWrapper(Toolbar toolbar, boolean style) { 95acf94897e0924ff5fcd3c5b371ab1aa620cb1dc6Chris Banes this(toolbar, style, R.string.abc_action_bar_up_description, 96eb648620b291eabbb5523f649baef5abb2e4687bAlan Viverette R.drawable.abc_ic_ab_back_material); 97b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar } 9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 99b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar public ToolbarWidgetWrapper(Toolbar toolbar, boolean style, 100acf94897e0924ff5fcd3c5b371ab1aa620cb1dc6Chris Banes int defaultNavigationContentDescription, int defaultNavigationIcon) { 101b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar mToolbar = toolbar; 10249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTitle = toolbar.getTitle(); 10349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSubtitle = toolbar.getSubtitle(); 1045b84d15b2f5fb9b10532298c57eaebed32e3740aAdam Powell mTitleSet = mTitle != null; 105a8780d0cb9eb258569d7fc70749c08b5ce9a8c93Chris Banes mNavIcon = toolbar.getNavigationIcon(); 106d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes final TintTypedArray a = TintTypedArray.obtainStyledAttributes(toolbar.getContext(), 107469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes null, R.styleable.ActionBar, R.attr.actionBarStyle, 0); 108d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes mDefaultNavigationIcon = a.getDrawable(R.styleable.ActionBar_homeAsUpIndicator); 109d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes if (style) { 110a2c72b87007d10202c25e78e904938f770c6337dChris Banes final CharSequence title = a.getText(R.styleable.ActionBar_title); 111a2c72b87007d10202c25e78e904938f770c6337dChris Banes if (!TextUtils.isEmpty(title)) { 112a2c72b87007d10202c25e78e904938f770c6337dChris Banes setTitle(title); 113a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 11449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 115a2c72b87007d10202c25e78e904938f770c6337dChris Banes final CharSequence subtitle = a.getText(R.styleable.ActionBar_subtitle); 116a2c72b87007d10202c25e78e904938f770c6337dChris Banes if (!TextUtils.isEmpty(subtitle)) { 117a2c72b87007d10202c25e78e904938f770c6337dChris Banes setSubtitle(subtitle); 118a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 11949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 120a2c72b87007d10202c25e78e904938f770c6337dChris Banes final Drawable logo = a.getDrawable(R.styleable.ActionBar_logo); 121a2c72b87007d10202c25e78e904938f770c6337dChris Banes if (logo != null) { 122a2c72b87007d10202c25e78e904938f770c6337dChris Banes setLogo(logo); 123a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 12449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 125a2c72b87007d10202c25e78e904938f770c6337dChris Banes final Drawable icon = a.getDrawable(R.styleable.ActionBar_icon); 126d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes if (icon != null) { 127a2c72b87007d10202c25e78e904938f770c6337dChris Banes setIcon(icon); 128a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 129d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes if (mNavIcon == null && mDefaultNavigationIcon != null) { 130d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes setNavigationIcon(mDefaultNavigationIcon); 131a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 132a2c72b87007d10202c25e78e904938f770c6337dChris Banes setDisplayOptions(a.getInt(R.styleable.ActionBar_displayOptions, 0)); 13349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 134a2c72b87007d10202c25e78e904938f770c6337dChris Banes final int customNavId = a.getResourceId( 135a2c72b87007d10202c25e78e904938f770c6337dChris Banes R.styleable.ActionBar_customNavigationLayout, 0); 136a2c72b87007d10202c25e78e904938f770c6337dChris Banes if (customNavId != 0) { 137a2c72b87007d10202c25e78e904938f770c6337dChris Banes setCustomView(LayoutInflater.from(mToolbar.getContext()).inflate(customNavId, 138a2c72b87007d10202c25e78e904938f770c6337dChris Banes mToolbar, false)); 139a2c72b87007d10202c25e78e904938f770c6337dChris Banes setDisplayOptions(mDisplayOpts | ActionBar.DISPLAY_SHOW_CUSTOM); 140a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 14149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 142a2c72b87007d10202c25e78e904938f770c6337dChris Banes final int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0); 143a2c72b87007d10202c25e78e904938f770c6337dChris Banes if (height > 0) { 144a2c72b87007d10202c25e78e904938f770c6337dChris Banes final ViewGroup.LayoutParams lp = mToolbar.getLayoutParams(); 145a2c72b87007d10202c25e78e904938f770c6337dChris Banes lp.height = height; 146a2c72b87007d10202c25e78e904938f770c6337dChris Banes mToolbar.setLayoutParams(lp); 147a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 14849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 149a2c72b87007d10202c25e78e904938f770c6337dChris Banes final int contentInsetStart = a.getDimensionPixelOffset( 150a2c72b87007d10202c25e78e904938f770c6337dChris Banes R.styleable.ActionBar_contentInsetStart, -1); 151a2c72b87007d10202c25e78e904938f770c6337dChris Banes final int contentInsetEnd = a.getDimensionPixelOffset( 152a2c72b87007d10202c25e78e904938f770c6337dChris Banes R.styleable.ActionBar_contentInsetEnd, -1); 153a2c72b87007d10202c25e78e904938f770c6337dChris Banes if (contentInsetStart >= 0 || contentInsetEnd >= 0) { 154a2c72b87007d10202c25e78e904938f770c6337dChris Banes mToolbar.setContentInsetsRelative(Math.max(contentInsetStart, 0), 155a2c72b87007d10202c25e78e904938f770c6337dChris Banes Math.max(contentInsetEnd, 0)); 156a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 158a2c72b87007d10202c25e78e904938f770c6337dChris Banes final int titleTextStyle = a.getResourceId(R.styleable.ActionBar_titleTextStyle, 0); 159a2c72b87007d10202c25e78e904938f770c6337dChris Banes if (titleTextStyle != 0) { 160a2c72b87007d10202c25e78e904938f770c6337dChris Banes mToolbar.setTitleTextAppearance(mToolbar.getContext(), titleTextStyle); 161a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 163a2c72b87007d10202c25e78e904938f770c6337dChris Banes final int subtitleTextStyle = a.getResourceId( 164a2c72b87007d10202c25e78e904938f770c6337dChris Banes R.styleable.ActionBar_subtitleTextStyle, 0); 165a2c72b87007d10202c25e78e904938f770c6337dChris Banes if (subtitleTextStyle != 0) { 166a2c72b87007d10202c25e78e904938f770c6337dChris Banes mToolbar.setSubtitleTextAppearance(mToolbar.getContext(), subtitleTextStyle); 167a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 16849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 169a2c72b87007d10202c25e78e904938f770c6337dChris Banes final int popupTheme = a.getResourceId(R.styleable.ActionBar_popupTheme, 0); 170a2c72b87007d10202c25e78e904938f770c6337dChris Banes if (popupTheme != 0) { 171a2c72b87007d10202c25e78e904938f770c6337dChris Banes mToolbar.setPopupTheme(popupTheme); 172a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 173ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes } else { 174ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes mDisplayOpts = detectDisplayOptions(); 175a2c72b87007d10202c25e78e904938f770c6337dChris Banes } 176d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes a.recycle(); 17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 178b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar setDefaultNavigationContentDescription(defaultNavigationContentDescription); 179b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar mHomeDescription = mToolbar.getNavigationContentDescription(); 18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setNavigationOnClickListener(new View.OnClickListener() { 18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final ActionMenuItem mNavItem = new ActionMenuItem(mToolbar.getContext(), 18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 0, android.R.id.home, 0, 0, mTitle); 18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onClick(View v) { 18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mWindowCallback != null && mMenuPrepared) { 18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mNavItem); 18849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 18949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 19049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }); 19149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 19249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 193b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar @Override 194b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar public void setDefaultNavigationContentDescription(int defaultNavigationContentDescription) { 195b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar if (defaultNavigationContentDescription == mDefaultNavigationContentDescription) { 196b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar return; 197b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar } 198b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar mDefaultNavigationContentDescription = defaultNavigationContentDescription; 199b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar if (TextUtils.isEmpty(mToolbar.getNavigationContentDescription())) { 200b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar setNavigationContentDescription(mDefaultNavigationContentDescription); 201b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar } 202b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar } 203b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar 204ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes private int detectDisplayOptions() { 205ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes int opts = ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME | 206ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes ActionBar.DISPLAY_USE_LOGO; 207ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes if (mToolbar.getNavigationIcon() != null) { 208ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes opts |= ActionBar.DISPLAY_HOME_AS_UP; 209d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes mDefaultNavigationIcon = mToolbar.getNavigationIcon(); 210ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes } 211ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes return opts; 212ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes } 213ca58f2ce7cd9f0e0f2c4a46c3bcc98013209f6b3Chris Banes 21449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 21549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public ViewGroup getViewGroup() { 21649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar; 21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 21849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 21949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 22049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Context getContext() { 22149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.getContext(); 22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasExpandedActionView() { 22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.hasExpandedActionView(); 22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void collapseActionView() { 23149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.collapseActionView(); 23249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 235f3ad1351d8b40ec5defe35e79d3430ad3c384b6dChris Banes public void setWindowCallback(Window.Callback cb) { 23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowCallback = cb; 23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 23949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 24049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setWindowTitle(CharSequence title) { 24149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // "Real" title always trumps window title. 24249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mTitleSet) { 24349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setTitleInt(title); 24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public CharSequence getTitle() { 24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.getTitle(); 25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 25349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setTitle(CharSequence title) { 25449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTitleSet = true; 25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setTitleInt(title); 25649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 25849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void setTitleInt(CharSequence title) { 25949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTitle = title; 26049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { 26149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setTitle(title); 26249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 26349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 26549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public CharSequence getSubtitle() { 26749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.getSubtitle(); 26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 26949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 27049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 27149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setSubtitle(CharSequence subtitle) { 27249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSubtitle = subtitle; 27349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { 27449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setSubtitle(subtitle); 27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 27649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void initProgress() { 28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Log.i(TAG, "Progress display unsupported"); 28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 28349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void initIndeterminateProgress() { 28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Log.i(TAG, "Progress display unsupported"); 28649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasIcon() { 29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mIcon != null; 29149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 29349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasLogo() { 29549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mLogo != null; 29649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 29749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 29849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 29949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setIcon(int resId) { 3004c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banes setIcon(resId != 0 ? AppCompatResources.getDrawable(getContext(), resId) : null); 30149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 30249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 30349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 30449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setIcon(Drawable d) { 30549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mIcon = d; 30649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes updateToolbarLogo(); 30749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 30849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 30949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 31049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setLogo(int resId) { 3114c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banes setLogo(resId != 0 ? AppCompatResources.getDrawable(getContext(), resId) : null); 31249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 31349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 31449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 31549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setLogo(Drawable d) { 31649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mLogo = d; 31749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes updateToolbarLogo(); 31849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 31949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 32049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void updateToolbarLogo() { 32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Drawable logo = null; 32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_HOME) != 0) { 32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((mDisplayOpts & ActionBar.DISPLAY_USE_LOGO) != 0) { 32449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes logo = mLogo != null ? mLogo : mIcon; 32549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 32649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes logo = mIcon; 32749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 32849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 32949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setLogo(logo); 33049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 33149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 33249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 33349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean canShowOverflowMenu() { 33449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.canShowOverflowMenu(); 33549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 33649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 33749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 33849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isOverflowMenuShowing() { 33949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.isOverflowMenuShowing(); 34049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 34149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 34249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 34349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isOverflowMenuShowPending() { 34449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.isOverflowMenuShowPending(); 34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 34849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean showOverflowMenu() { 34949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.showOverflowMenu(); 35049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 35149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 35249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 35349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hideOverflowMenu() { 35449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.hideOverflowMenu(); 35549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 35649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 35749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 35849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setMenuPrepared() { 35949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mMenuPrepared = true; 36049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 36149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 36249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 36349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setMenu(Menu menu, MenuPresenter.Callback cb) { 36449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionMenuPresenter == null) { 36549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionMenuPresenter = new ActionMenuPresenter(mToolbar.getContext()); 36649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionMenuPresenter.setId(R.id.action_menu_presenter); 36749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 36849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionMenuPresenter.setCallback(cb); 36949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setMenu((MenuBuilder) menu, mActionMenuPresenter); 37049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 37149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 37249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 37349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void dismissPopupMenus() { 37449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.dismissPopupMenus(); 37549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 37649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 37749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 37849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getDisplayOptions() { 37949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDisplayOpts; 38049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 38149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 38249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 38349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDisplayOptions(int newOpts) { 38449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int oldOpts = mDisplayOpts; 38549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int changed = oldOpts ^ newOpts; 38649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDisplayOpts = newOpts; 38749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (changed != 0) { 38849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((changed & ActionBar.DISPLAY_HOME_AS_UP) != 0) { 38949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((newOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) { 390b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar updateHomeAccessibility(); 39149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 392d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes updateNavigationIcon(); 39349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 39449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 39549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((changed & AFFECTS_LOGO_MASK) != 0) { 39649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes updateToolbarLogo(); 39749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 39849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 39949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((changed & ActionBar.DISPLAY_SHOW_TITLE) != 0) { 40049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((newOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { 40149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setTitle(mTitle); 40249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setSubtitle(mSubtitle); 40349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 40449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setTitle(null); 40549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setSubtitle(null); 40649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 40749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 40849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 40949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((changed & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomView != null) { 41049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((newOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { 41149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.addView(mCustomView); 41249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 41349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.removeView(mCustomView); 41449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 41549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 41649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 41749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 41849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 41949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 42049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setEmbeddedTabView(ScrollingTabContainerView tabView) { 42149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mTabView != null && mTabView.getParent() == mToolbar) { 42249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.removeView(mTabView); 42349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 42449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabView = tabView; 42549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (tabView != null && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) { 42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.addView(mTabView, 0); 42749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams(); 42849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; 42949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; 43049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.gravity = Gravity.START | Gravity.BOTTOM; 43149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes tabView.setAllowCollapse(true); 43249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 43349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 43449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 43549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 43649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasEmbeddedTabs() { 43749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mTabView != null; 43849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 43949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 44049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 44149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isTitleTruncated() { 44249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.isTitleTruncated(); 44349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 44449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 44549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 44649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setCollapsible(boolean collapsible) { 44749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setCollapsible(collapsible); 44849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 44949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 45049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 45149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHomeButtonEnabled(boolean enable) { 45249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Ignore 45349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 45449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 45549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 45649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getNavigationMode() { 45749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mNavigationMode; 45849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 45949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 46049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 46149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setNavigationMode(int mode) { 46249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int oldMode = mNavigationMode; 46349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mode != oldMode) { 46449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes switch (oldMode) { 46549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case ActionBar.NAVIGATION_MODE_LIST: 46649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSpinner != null && mSpinner.getParent() == mToolbar) { 46749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.removeView(mSpinner); 46849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 46949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 47049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case ActionBar.NAVIGATION_MODE_TABS: 47149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mTabView != null && mTabView.getParent() == mToolbar) { 47249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.removeView(mTabView); 47349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 47449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 47549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 47649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 47749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mNavigationMode = mode; 47849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 47949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes switch (mode) { 48049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case ActionBar.NAVIGATION_MODE_STANDARD: 48149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 48249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case ActionBar.NAVIGATION_MODE_LIST: 48349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ensureSpinner(); 48449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.addView(mSpinner, 0); 48549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 48649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case ActionBar.NAVIGATION_MODE_TABS: 48749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mTabView != null) { 48849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.addView(mTabView, 0); 48949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams(); 49049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; 49149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; 49249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.gravity = Gravity.START | Gravity.BOTTOM; 49349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 49449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 49549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes default: 49649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new IllegalArgumentException("Invalid navigation mode " + mode); 49749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 49849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 49949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 50049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 50149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void ensureSpinner() { 50249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSpinner == null) { 503f933672168f6deff5e3636584bec735416b5a93bChris Banes mSpinner = new AppCompatSpinner(getContext(), null, R.attr.actionDropDownStyle); 50449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Toolbar.LayoutParams lp = new Toolbar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 50549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL); 50649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSpinner.setLayoutParams(lp); 50749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 50849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 50949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 51049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 51149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDropdownParams(SpinnerAdapter adapter, 512f933672168f6deff5e3636584bec735416b5a93bChris Banes AdapterView.OnItemSelectedListener listener) { 51349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ensureSpinner(); 51449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSpinner.setAdapter(adapter); 51549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSpinner.setOnItemSelectedListener(listener); 51649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 51749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 51849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 51949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDropdownSelectedPosition(int position) { 52049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSpinner == null) { 52149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new IllegalStateException( 52249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes "Can't set dropdown selected position without an adapter"); 52349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 52449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSpinner.setSelection(position); 52549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 52649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 52749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 52849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getDropdownSelectedPosition() { 52949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mSpinner != null ? mSpinner.getSelectedItemPosition() : 0; 53049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 53149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 53249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 53349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getDropdownItemCount() { 53449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mSpinner != null ? mSpinner.getCount() : 0; 53549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 53649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 53749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 53849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setCustomView(View view) { 53949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mCustomView != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { 54049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.removeView(mCustomView); 54149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 54249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCustomView = view; 54349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (view != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { 54449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.addView(mCustomView); 54549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 54649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 54749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 54849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 54949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public View getCustomView() { 55049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mCustomView; 55149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 55249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 55349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 55449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void animateToVisibility(int visibility) { 555acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes ViewPropertyAnimatorCompat anim = setupAnimatorToVisibility(visibility, 556acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes DEFAULT_FADE_DURATION_MS); 557acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes if (anim != null) { 558acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes anim.start(); 559acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes } 560acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes } 561acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 562acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes @Override 5635e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes public ViewPropertyAnimatorCompat setupAnimatorToVisibility(final int visibility, 5645e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes final long duration) { 5655e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes return ViewCompat.animate(mToolbar) 5665e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes .alpha(visibility == View.VISIBLE ? 1f : 0f) 5675e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes .setDuration(duration) 5685e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes .setListener(new ViewPropertyAnimatorListenerAdapter() { 5695e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes private boolean mCanceled = false; 5705e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes 5715e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes @Override 5725e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes public void onAnimationStart(View view) { 5735e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes mToolbar.setVisibility(View.VISIBLE); 574acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes } 575acce58688e2c3e5abd0b13e78dcf2c26710eabd0Chris Banes 5765e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes @Override 5775e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes public void onAnimationEnd(View view) { 5785e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes if (!mCanceled) { 5795e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes mToolbar.setVisibility(visibility); 5805e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes } 5815e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes } 5825e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes 5835e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes @Override 5845e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes public void onAnimationCancel(View view) { 5855e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes mCanceled = true; 5865e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes } 5875e0e35f9bc3989fdbe378264cf026486088137c1Chris Banes }); 58849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 58949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 59049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 59149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setNavigationIcon(Drawable icon) { 59249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mNavIcon = icon; 593acf94897e0924ff5fcd3c5b371ab1aa620cb1dc6Chris Banes updateNavigationIcon(); 59449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 59549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 59649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 59749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setNavigationIcon(int resId) { 5984c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banes setNavigationIcon(resId != 0 ? AppCompatResources.getDrawable(getContext(), resId) : null); 599d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes } 600d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes 601d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes @Override 602d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes public void setDefaultNavigationIcon(Drawable defaultNavigationIcon) { 603d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes if (mDefaultNavigationIcon != defaultNavigationIcon) { 604d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes mDefaultNavigationIcon = defaultNavigationIcon; 605d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes updateNavigationIcon(); 606d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes } 607d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes } 608d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes 609d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes private void updateNavigationIcon() { 610d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) { 611d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes mToolbar.setNavigationIcon(mNavIcon != null ? mNavIcon : mDefaultNavigationIcon); 612d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes } else { 613d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes mToolbar.setNavigationIcon(null); 614d6e47228c44aaadb0d4518da6db5c3f5dffda1abChris Banes } 61549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 61649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 61749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 61849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setNavigationContentDescription(CharSequence description) { 619b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar mHomeDescription = description; 620b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar updateHomeAccessibility(); 62149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 62249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 62349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 62449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setNavigationContentDescription(int resId) { 625b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar setNavigationContentDescription(resId == 0 ? null : getContext().getString(resId)); 626b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar } 627b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar 628b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar private void updateHomeAccessibility() { 629b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) { 630b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar if (TextUtils.isEmpty(mHomeDescription)) { 631b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar mToolbar.setNavigationContentDescription(mDefaultNavigationContentDescription); 632b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar } else { 633b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar mToolbar.setNavigationContentDescription(mHomeDescription); 634b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar } 635b3813e08451b31c599f47ebaf14c9467043cedbcYigit Boyar } 63649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 63749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 63849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 63949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void saveHierarchyState(SparseArray<Parcelable> toolbarStates) { 64049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.saveHierarchyState(toolbarStates); 64149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 64249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 64349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 64449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void restoreHierarchyState(SparseArray<Parcelable> toolbarStates) { 64549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.restoreHierarchyState(toolbarStates); 64649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 64749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6486aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar @Override 6496aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar public void setBackgroundDrawable(Drawable d) { 65047082c30c630c34829439a9eecd1cf7e8d255a86Aurimas Liutikas ViewCompat.setBackground(mToolbar, d); 6516aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar } 6526aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar 6536aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar @Override 6546aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar public int getHeight() { 6556aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar return mToolbar.getHeight(); 6566aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar } 6576aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar 6586aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar @Override 6596aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar public void setVisibility(int visible) { 6606aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar mToolbar.setVisibility(visible); 6616aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar } 6626aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar 6636aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar @Override 6646aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar public int getVisibility() { 6656aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar return mToolbar.getVisibility(); 6666aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar } 6676aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar 6686aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar @Override 6696aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar public void setMenuCallbacks(MenuPresenter.Callback actionMenuPresenterCallback, 6706aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar MenuBuilder.Callback menuBuilderCallback) { 6716aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar mToolbar.setMenuCallbacks(actionMenuPresenterCallback, menuBuilderCallback); 6726aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar } 6736aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar 6746aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar @Override 6756aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar public Menu getMenu() { 6766aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar return mToolbar.getMenu(); 6776aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar } 6786aadbd39814a5ae41e1fadfab06657cdf901e625Yigit Boyar 67949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes}