ToolbarWidgetWrapper.java revision 49c78900da0d43140fb602431fb93212bd7f6c70
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.widget; 1949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 2049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.app.ActionBar; 2149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.Context; 2249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.content.res.TypedArray; 2349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.graphics.drawable.Drawable; 2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.os.Parcelable; 2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewCompat; 2649c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListenerAdapter; 2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.appcompat.R; 2849c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.app.WindowCallback; 2949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.view.menu.ActionMenuItem; 3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.ActionMenuPresenter; 3149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.view.menu.MenuBuilder; 3249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.internal.view.menu.MenuPresenter; 3349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v7.widget.Toolbar; 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; 4349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.widget.SpinnerAdapter; 4449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 4549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/** 4649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Internal class used to interact with the Toolbar widget without 4749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * exposing interface methods to the public API. 4849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * 4949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * <p>ToolbarWidgetWrapper manages the differences between Toolbar and ActionBarView 5049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * so that either variant acting as a 5149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * {@link android.support.v7.internal.app.WindowDecorActionBar WindowDecorActionBar} can behave 5249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * in the same way.</p> 5349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * 5449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide 5549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */ 5649c78900da0d43140fb602431fb93212bd7f6c70Chris Banespublic class ToolbarWidgetWrapper implements DecorToolbar { 5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private static final String TAG = "ToolbarWidgetWrapper"; 5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 5949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private static final int AFFECTS_LOGO_MASK = 6049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO; 6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Toolbar mToolbar; 6349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mDisplayOpts; 6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private View mTabView; 6649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private SpinnerCompat mSpinner; 6749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private View mCustomView; 6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Drawable mIcon; 7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Drawable mLogo; 7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Drawable mNavIcon; 7249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 7349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mTitleSet; 7449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private CharSequence mTitle; 7549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private CharSequence mSubtitle; 7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 7749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private WindowCallback mWindowCallback; 7849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mMenuPrepared; 7949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ActionMenuPresenter mActionMenuPresenter; 8049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private int mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD; 8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public ToolbarWidgetWrapper(Toolbar toolbar) { 8449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar = toolbar; 8549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTitle = toolbar.getTitle(); 8749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSubtitle = toolbar.getSubtitle(); 8849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTitleSet = !TextUtils.isEmpty(mTitle); 8949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 9049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final TypedArray a = toolbar.getContext().obtainStyledAttributes(null, 9149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes R.styleable.ActionBar, R.attr.actionBarStyle, 0); 9249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 9349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final CharSequence title = a.getText(R.styleable.ActionBar_title); 9449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!TextUtils.isEmpty(title)) { 9549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setTitle(title); 9649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 9749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final CharSequence subtitle = a.getText(R.styleable.ActionBar_subtitle); 9949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!TextUtils.isEmpty(subtitle)) { 10049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setSubtitle(subtitle); 10149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 10249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 10349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final Drawable logo = a.getDrawable(R.styleable.ActionBar_logo); 10449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (logo != null) { 10549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setLogo(logo); 10649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 10749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 10849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final Drawable icon = a.getDrawable(R.styleable.ActionBar_icon); 10949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (icon != null) { 11049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setIcon(icon); 11149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 11249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 11349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final Drawable navIcon = a.getDrawable(R.styleable.ActionBar_homeAsUpIndicator); 11449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (navIcon != null) { 11549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setNavigationIcon(navIcon); 11649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 11749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 11849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setDisplayOptions(a.getInt(R.styleable.ActionBar_displayOptions, 0)); 11949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 12049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int customNavId = a.getResourceId(R.styleable.ActionBar_customNavigationLayout, 0); 12149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (customNavId != 0) { 12249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setCustomView(LayoutInflater.from(mToolbar.getContext()).inflate(customNavId, 12349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar, false)); 12449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setDisplayOptions(mDisplayOpts | ActionBar.DISPLAY_SHOW_CUSTOM); 12549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 12649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 12749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0); 12849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (height > 0) { 12949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final ViewGroup.LayoutParams lp = mToolbar.getLayoutParams(); 13049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.height = height; 13149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setLayoutParams(lp); 13249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 13349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 13449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int contentInsetStart = a.getDimensionPixelOffset( 13549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes R.styleable.ActionBar_contentInsetStart, -1); 13649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int contentInsetEnd = a.getDimensionPixelOffset( 13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes R.styleable.ActionBar_contentInsetEnd, -1); 13849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (contentInsetStart >= 0 || contentInsetEnd >= 0) { 13949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setContentInsetsRelative(Math.max(contentInsetStart, 0), 14049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Math.max(contentInsetEnd, 0)); 14149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 14249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 14349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int titleTextStyle = a.getResourceId(R.styleable.ActionBar_titleTextStyle, 0); 14449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (titleTextStyle != 0) { 14549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setTitleTextAppearance(mToolbar.getContext(), titleTextStyle); 14649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 14749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 14849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int subtitleTextStyle = a.getResourceId(R.styleable.ActionBar_subtitleTextStyle, 0); 14949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (subtitleTextStyle != 0) { 15049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setSubtitleTextAppearance(mToolbar.getContext(), subtitleTextStyle); 15149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 15249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 15349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes a.recycle(); 15449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 15549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (TextUtils.isEmpty(mToolbar.getNavigationContentDescription())) { 15649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setNavigationContentDescription( 15749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes getContext().getResources().getText(R.string.abc_action_bar_up_description)); 15849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 15949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 16049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setNavigationOnClickListener(new View.OnClickListener() { 16149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final ActionMenuItem mNavItem = new ActionMenuItem(mToolbar.getContext(), 16249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 0, android.R.id.home, 0, 0, mTitle); 16349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 16449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onClick(View v) { 16549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mWindowCallback != null && mMenuPrepared) { 16649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mNavItem); 16749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 16849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 16949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }); 17049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 17149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 17249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 17349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public ViewGroup getViewGroup() { 17449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar; 17549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 17649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 17749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 17849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public Context getContext() { 17949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.getContext(); 18049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 18149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 18249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 18349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isSplit() { 18449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return false; 18549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 18649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 18749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 18849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasExpandedActionView() { 18949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.hasExpandedActionView(); 19049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 19149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 19249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 19349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void collapseActionView() { 19449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.collapseActionView(); 19549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 19649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 19749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 19849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setWindowCallback(WindowCallback cb) { 19949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mWindowCallback = cb; 20049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 20149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 20249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 20349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setWindowTitle(CharSequence title) { 20449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // "Real" title always trumps window title. 20549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mTitleSet) { 20649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setTitleInt(title); 20749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 20849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 20949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 21049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 21149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public CharSequence getTitle() { 21249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.getTitle(); 21349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 21449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 21549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 21649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setTitle(CharSequence title) { 21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTitleSet = true; 21849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setTitleInt(title); 21949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 22149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void setTitleInt(CharSequence title) { 22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTitle = title; 22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { 22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setTitle(title); 22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 22749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 22849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 22949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public CharSequence getSubtitle() { 23049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.getSubtitle(); 23149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 23249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setSubtitle(CharSequence subtitle) { 23549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSubtitle = subtitle; 23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { 23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setSubtitle(subtitle); 23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 23949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 24149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 24249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void initProgress() { 24349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Log.i(TAG, "Progress display unsupported"); 24449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 24549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 24649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 24749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void initIndeterminateProgress() { 24849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Log.i(TAG, "Progress display unsupported"); 24949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 25049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 25149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 25249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean canSplit() { 25349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return false; 25449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 25549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 25649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 25749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setSplitView(ViewGroup splitView) { 25849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 25949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 26049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 26149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setSplitToolbar(boolean split) { 26249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (split) { 26349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new UnsupportedOperationException("Cannot split an android.widget.Toolbar"); 26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 26549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 26749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 26849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setSplitWhenNarrow(boolean splitWhenNarrow) { 26949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Ignore. 27049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 27149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 27249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 27349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasIcon() { 27449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mIcon != null; 27549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 27649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 27749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 27849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasLogo() { 27949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mLogo != null; 28049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 28249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 28349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setIcon(int resId) { 28449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setIcon(resId != 0 ? getContext().getResources().getDrawable(resId) : null); 28549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 28649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 28749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 28849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setIcon(Drawable d) { 28949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mIcon = d; 29049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes updateToolbarLogo(); 29149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 29249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 29349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 29449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setLogo(int resId) { 29549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setLogo(resId != 0 ? getContext().getResources().getDrawable(resId) : null); 29649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 29749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 29849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 29949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setLogo(Drawable d) { 30049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mLogo = d; 30149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes updateToolbarLogo(); 30249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 30349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 30449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void updateToolbarLogo() { 30549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Drawable logo = null; 30649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((mDisplayOpts & ActionBar.DISPLAY_SHOW_HOME) != 0) { 30749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((mDisplayOpts & ActionBar.DISPLAY_USE_LOGO) != 0) { 30849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes logo = mLogo != null ? mLogo : mIcon; 30949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 31049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes logo = mIcon; 31149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 31249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 31349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setLogo(logo); 31449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 31549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 31649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 31749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean canShowOverflowMenu() { 31849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.canShowOverflowMenu(); 31949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 32049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 32149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 32249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isOverflowMenuShowing() { 32349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.isOverflowMenuShowing(); 32449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 32549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 32649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 32749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isOverflowMenuShowPending() { 32849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.isOverflowMenuShowPending(); 32949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 33049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 33149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 33249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean showOverflowMenu() { 33349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.showOverflowMenu(); 33449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 33549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 33649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 33749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hideOverflowMenu() { 33849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.hideOverflowMenu(); 33949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 34049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 34149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 34249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setMenuPrepared() { 34349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mMenuPrepared = true; 34449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 34549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 34649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 34749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setMenu(Menu menu, MenuPresenter.Callback cb) { 34849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mActionMenuPresenter == null) { 34949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionMenuPresenter = new ActionMenuPresenter(mToolbar.getContext()); 35049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionMenuPresenter.setId(R.id.action_menu_presenter); 35149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 35249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mActionMenuPresenter.setCallback(cb); 35349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setMenu((MenuBuilder) menu, mActionMenuPresenter); 35449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 35549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 35649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 35749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void dismissPopupMenus() { 35849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.dismissPopupMenus(); 35949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 36049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 36149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 36249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getDisplayOptions() { 36349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mDisplayOpts; 36449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 36549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 36649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 36749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDisplayOptions(int newOpts) { 36849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int oldOpts = mDisplayOpts; 36949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int changed = oldOpts ^ newOpts; 37049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mDisplayOpts = newOpts; 37149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (changed != 0) { 37249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((changed & ActionBar.DISPLAY_HOME_AS_UP) != 0) { 37349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((newOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) { 37449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setNavigationIcon(mNavIcon); 37549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 37649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setNavigationIcon(null); 37749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 37849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 37949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 38049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((changed & AFFECTS_LOGO_MASK) != 0) { 38149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes updateToolbarLogo(); 38249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 38349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 38449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((changed & ActionBar.DISPLAY_SHOW_TITLE) != 0) { 38549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((newOpts & ActionBar.DISPLAY_SHOW_TITLE) != 0) { 38649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setTitle(mTitle); 38749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setSubtitle(mSubtitle); 38849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 38949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setTitle(null); 39049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setSubtitle(null); 39149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 39249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 39349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 39449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((changed & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomView != null) { 39549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((newOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { 39649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.addView(mCustomView); 39749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else { 39849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.removeView(mCustomView); 39949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 40049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 40149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 40249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 40349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 40449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 40549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setEmbeddedTabView(ScrollingTabContainerView tabView) { 40649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mTabView != null && mTabView.getParent() == mToolbar) { 40749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.removeView(mTabView); 40849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 40949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mTabView = tabView; 41049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (tabView != null && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) { 41149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.addView(mTabView, 0); 41249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams(); 41349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; 41449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; 41549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.gravity = Gravity.START | Gravity.BOTTOM; 41649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes tabView.setAllowCollapse(true); 41749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 41849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 41949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 42049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 42149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean hasEmbeddedTabs() { 42249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mTabView != null; 42349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 42449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 42549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 42649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public boolean isTitleTruncated() { 42749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mToolbar.isTitleTruncated(); 42849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 42949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 43049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 43149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setCollapsible(boolean collapsible) { 43249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setCollapsible(collapsible); 43349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 43449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 43549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 43649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setHomeButtonEnabled(boolean enable) { 43749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes // Ignore 43849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 43949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 44049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 44149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getNavigationMode() { 44249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mNavigationMode; 44349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 44449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 44549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 44649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setNavigationMode(int mode) { 44749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes final int oldMode = mNavigationMode; 44849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mode != oldMode) { 44949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes switch (oldMode) { 45049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case ActionBar.NAVIGATION_MODE_LIST: 45149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSpinner != null && mSpinner.getParent() == mToolbar) { 45249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.removeView(mSpinner); 45349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 45449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 45549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case ActionBar.NAVIGATION_MODE_TABS: 45649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mTabView != null && mTabView.getParent() == mToolbar) { 45749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.removeView(mTabView); 45849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 45949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 46049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 46149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 46249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mNavigationMode = mode; 46349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 46449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes switch (mode) { 46549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case ActionBar.NAVIGATION_MODE_STANDARD: 46649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 46749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case ActionBar.NAVIGATION_MODE_LIST: 46849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ensureSpinner(); 46949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.addView(mSpinner, 0); 47049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 47149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes case ActionBar.NAVIGATION_MODE_TABS: 47249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mTabView != null) { 47349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.addView(mTabView, 0); 47449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Toolbar.LayoutParams lp = (Toolbar.LayoutParams) mTabView.getLayoutParams(); 47549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; 47649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; 47749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes lp.gravity = Gravity.START | Gravity.BOTTOM; 47849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 47949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes break; 48049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes default: 48149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new IllegalArgumentException("Invalid navigation mode " + mode); 48249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 48349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 48449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 48549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 48649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private void ensureSpinner() { 48749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSpinner == null) { 48849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSpinner = new SpinnerCompat(getContext(), null, R.attr.actionDropDownStyle); 48949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes Toolbar.LayoutParams lp = new Toolbar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 49049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL); 49149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSpinner.setLayoutParams(lp); 49249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 49349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 49449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 49549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 49649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDropdownParams(SpinnerAdapter adapter, 49749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes AdapterViewCompat.OnItemSelectedListener listener) { 49849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ensureSpinner(); 49949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSpinner.setAdapter(adapter); 50049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSpinner.setOnItemSelectedListener(listener); 50149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 50249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 50349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 50449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setDropdownSelectedPosition(int position) { 50549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mSpinner == null) { 50649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes throw new IllegalStateException( 50749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes "Can't set dropdown selected position without an adapter"); 50849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 50949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mSpinner.setSelection(position); 51049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 51149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 51249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 51349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getDropdownSelectedPosition() { 51449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mSpinner != null ? mSpinner.getSelectedItemPosition() : 0; 51549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 51649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 51749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 51849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public int getDropdownItemCount() { 51949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mSpinner != null ? mSpinner.getCount() : 0; 52049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 52149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 52249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 52349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setCustomView(View view) { 52449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mCustomView != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { 52549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.removeView(mCustomView); 52649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 52749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCustomView = view; 52849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (view != null && (mDisplayOpts & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { 52949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.addView(mCustomView); 53049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 53149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 53249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 53349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 53449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public View getCustomView() { 53549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes return mCustomView; 53649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 53749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 53849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 53949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void animateToVisibility(int visibility) { 54049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (visibility == View.GONE) { 54149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.animate(mToolbar).translationY(mToolbar.getHeight()).alpha(0) 54249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .setListener(new ViewPropertyAnimatorListenerAdapter() { 54349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mCanceled = false; 54449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 54549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationEnd(View view) { 54649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (!mCanceled) { 54749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setVisibility(View.GONE); 54849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 54949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 55049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 55149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 55249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationCancel(View view) { 55349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mCanceled = true; 55449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 55549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }); 55649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } else if (visibility == View.VISIBLE) { 55749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes ViewCompat.animate(mToolbar).translationY(0).alpha(1) 55849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes .setListener(new ViewPropertyAnimatorListenerAdapter() { 55949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 56049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationStart(View view) { 56149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setVisibility(View.VISIBLE); 56249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 56349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }); 56449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 56549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 56649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 56749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 56849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setNavigationIcon(Drawable icon) { 56949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mNavIcon = icon; 57049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) { 57149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setNavigationIcon(icon); 57249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 57349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 57449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 57549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 57649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setNavigationIcon(int resId) { 57749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes setNavigationIcon(resId != 0 ? mToolbar.getContext().getResources().getDrawable(resId) : null); 57849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 57949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 58049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 58149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setNavigationContentDescription(CharSequence description) { 58249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setNavigationContentDescription(description); 58349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 58449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 58549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 58649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void setNavigationContentDescription(int resId) { 58749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.setNavigationContentDescription(resId); 58849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 58949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 59049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 59149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void saveHierarchyState(SparseArray<Parcelable> toolbarStates) { 59249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.saveHierarchyState(toolbarStates); 59349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 59449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 59549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 59649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void restoreHierarchyState(SparseArray<Parcelable> toolbarStates) { 59749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mToolbar.restoreHierarchyState(toolbarStates); 59849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 59949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 60049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes}