Toolbar.java revision e43340c80dc66c45edc793ecd0343774aa34d108
1e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell/*
2e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Copyright (C) 2014 The Android Open Source Project
3e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *
4e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Licensed under the Apache License, Version 2.0 (the "License");
5e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * you may not use this file except in compliance with the License.
6e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * You may obtain a copy of the License at
7e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *
8e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *      http://www.apache.org/licenses/LICENSE-2.0
9e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *
10e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Unless required by applicable law or agreed to in writing, software
11e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * distributed under the License is distributed on an "AS IS" BASIS,
12e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * See the License for the specific language governing permissions and
14e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * limitations under the License.
15e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */
16e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
17e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
18e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellpackage android.widget;
19e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
20e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.annotation.NonNull;
21e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.content.Context;
22e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.content.res.TypedArray;
23e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.graphics.drawable.Drawable;
24e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.os.Parcel;
25e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.os.Parcelable;
26e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.text.TextUtils;
27e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.util.AttributeSet;
28e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.Gravity;
29e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.Menu;
30e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.MenuInflater;
31e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.MenuItem;
32e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.View;
33e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.ViewDebug;
34e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.ViewGroup;
35e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport com.android.internal.R;
36e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
37e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport java.util.ArrayList;
38e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport java.util.List;
39e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
40e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell/**
41e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * A standard toolbar for use within application content.
42e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *
43e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>A Toolbar is a generalization of {@link android.app.ActionBar action bars} for use
44e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * within application layouts. While an action bar is traditionally part of an
45e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * {@link android.app.Activity Activity's} opaque window decor controlled by the framework,
46e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * a Toolbar may be placed at any arbitrary level of nesting within a view hierarchy.
47e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * An application may choose to designate a Toolbar as the action bar for an Activity
48e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * using the {@link android.app.Activity#setActionBar(Toolbar) setActionBar()} method.</p>
49e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *
50e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>Toolbar supports a more focused feature set than ActionBar. From start to end, a toolbar
51e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * may contain a combination of the following optional elements:
52e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *
53e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <ul>
54e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     <li><em>A navigation button.</em> This may be an Up arrow, navigation menu toggle, close,
55e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     collapse, done or another glyph of the app's choosing. This button should always be used
56e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     to access other navigational destinations within the container of the Toolbar and
57e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     its signified content or otherwise leave the current context signified by the Toolbar.</li>
58e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     <li><em>A branded logo image.</em> This may extend to the height of the bar and can be
59e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     arbitrarily wide.</li>
60e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     <li><em>A title and subtitle.</em> The title should be a signpost for the Toolbar's current
61e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     position in the navigation hierarchy and the content contained there. The subtitle,
62e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     if present should indicate any extended information about the current content.
63e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     If an app uses a logo image it should strongly consider omitting a title and subtitle.</li>
64e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     <li><em>One or more custom views.</em> The application may add arbitrary child views
65e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     to the Toolbar. They will appear at this position within the layout. If a child view's
66e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     {@link LayoutParams} indicates a {@link Gravity} value of
67e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     {@link Gravity#CENTER_HORIZONTAL CENTER_HORIZONTAL} the view will attempt to center
68e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     within the available space remaining in the Toolbar after all other elements have been
69e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     measured.</li>
70e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     <li><em>An {@link ActionMenuView action menu}.</em> The menu of actions will pin to the
71e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     end of the Toolbar offering a few
72e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *     <a href="http://developer.android.com/design/patterns/actionbar.html#ActionButtons">
73e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *         frequent, important or typical</a> actions along with an optional overflow menu for
74e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *         additional actions.</li>
75e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * </ul>
76e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * </p>
77e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell *
78e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>In modern Android UIs developers should lean more on a visually distinct color scheme for
79e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * toolbars than on their application icon. The use of application icon plus title as a standard
80e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * layout is discouraged on API 21 devices and newer.</p>
81e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */
82e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellpublic class Toolbar extends ViewGroup {
83e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private ActionMenuView mMenuView;
84e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private TextView mTitleTextView;
85e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private TextView mSubtitleTextView;
86e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private ImageButton mNavButtonView;
87e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private ImageView mLogoView;
88e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
89e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int mTitleTextAppearance;
90e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int mSubtitleTextAppearance;
91e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int mTitleMarginStart;
92e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int mTitleMarginEnd;
93e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int mTitleMarginTop;
94e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int mTitleMarginBottom;
95e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
96e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int mGravity = Gravity.START | Gravity.CENTER_VERTICAL;
97e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
98e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private CharSequence mTitleText;
99e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private CharSequence mSubtitleText;
100e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
101e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    // Clear me after use.
102e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private final ArrayList<View> mTempViews = new ArrayList<View>();
103e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
104e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private OnMenuItemClickListener mOnMenuItemClickListener;
105e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
106e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private final ActionMenuView.OnMenuItemClickListener mMenuViewItemClickListener =
107e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            new ActionMenuView.OnMenuItemClickListener() {
108e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @Override
109e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                public boolean onMenuItemClick(MenuItem item) {
110e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    if (mOnMenuItemClickListener != null) {
111e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                        return mOnMenuItemClickListener.onMenuItemClick(item);
112e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    }
113e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    return false;
114e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                }
115e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            };
116e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
117e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public Toolbar(Context context) {
118e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        this(context, null);
119e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
120e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
121e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public Toolbar(Context context, AttributeSet attrs) {
122e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        this(context, attrs, com.android.internal.R.attr.toolbarStyle);
123e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
124e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
125e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public Toolbar(Context context, AttributeSet attrs, int defStyleAttr) {
126e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        this(context, attrs, defStyleAttr, 0);
127e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
128e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
129e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public Toolbar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
130e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        super(context, attrs, defStyleAttr, defStyleRes);
131e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
132e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Toolbar,
133e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                defStyleAttr, defStyleRes);
134e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
135e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mTitleTextAppearance = a.getResourceId(R.styleable.Toolbar_titleTextAppearance, 0);
136e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mSubtitleTextAppearance = a.getResourceId(R.styleable.Toolbar_subtitleTextAppearance, 0);
137e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mGravity = a.getInteger(R.styleable.Toolbar_gravity, mGravity);
138e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mTitleMarginStart = mTitleMarginEnd = Math.max(0, a.getDimensionPixelOffset(
139e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                R.styleable.Toolbar_titleMargins, -1));
140e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
141e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int marginStart = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginStart, -1);
142e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (marginStart >= 0) {
143e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mTitleMarginStart = marginStart;
144e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
145e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
146e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int marginEnd = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginEnd, -1);
147e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (marginEnd >= 0) {
148e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mTitleMarginEnd = marginEnd;
149e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
150e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
151e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int marginTop = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginTop, -1);
152e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (marginTop >= 0) {
153e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mTitleMarginTop = marginTop;
154e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
155e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
156e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int marginBottom = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginBottom,
157e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                -1);
158e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (marginBottom >= 0) {
159e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mTitleMarginBottom = marginBottom;
160e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
161e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
162e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final CharSequence title = a.getText(R.styleable.Toolbar_title);
163e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (!TextUtils.isEmpty(title)) {
164e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            setTitle(title);
165e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
166e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
167e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final CharSequence subtitle = a.getText(R.styleable.Toolbar_subtitle);
168e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (!TextUtils.isEmpty(subtitle)) {
169e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            setSubtitle(title);
170e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
171e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        a.recycle();
172e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
173e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
174e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
175e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set a logo drawable from a resource id.
176e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
177e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>This drawable should generally take the place of title text. The logo cannot be
178e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * clicked. Apps using a logo should also supply a description using
179e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * {@link #setLogoDescription(int)}.</p>
180e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
181e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param resId ID of a drawable resource
182e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
183e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setLogo(int resId) {
184e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setLogo(getContext().getDrawable(resId));
185e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
186e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
187e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
188e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set a logo drawable.
189e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
190e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>This drawable should generally take the place of title text. The logo cannot be
191e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * clicked. Apps using a logo should also supply a description using
192e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * {@link #setLogoDescription(int)}.</p>
193e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
194e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param drawable Drawable to use as a logo
195e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
196e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setLogo(Drawable drawable) {
197e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (drawable != null) {
198e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (mLogoView == null) {
199e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                mLogoView = new ImageView(getContext());
200e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
201e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (mLogoView.getParent() == null) {
202e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                addSystemView(mLogoView);
203e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
204e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        } else if (mLogoView != null && mLogoView.getParent() != null) {
205e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            removeView(mLogoView);
206e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
207e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (mLogoView != null) {
208e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mLogoView.setImageDrawable(drawable);
209e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
210e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
211e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
212e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
213e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Return the current logo drawable.
214e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
215e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @return The current logo drawable
216e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @see #setLogo(int)
217e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @see #setLogo(android.graphics.drawable.Drawable)
218e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
219e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public Drawable getLogo() {
220e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return mLogoView != null ? mLogoView.getDrawable() : null;
221e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
222e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
223e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
224e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set a description of the toolbar's logo.
225e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
226e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>This description will be used for accessibility or other similar descriptions
227e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * of the UI.</p>
228e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
229e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param resId String resource id
230e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
231e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setLogoDescription(int resId) {
232e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setLogoDescription(getContext().getText(resId));
233e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
234e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
235e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
236e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set a description of the toolbar's logo.
237e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
238e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>This description will be used for accessibility or other similar descriptions
239e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * of the UI.</p>
240e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
241e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param description Description to set
242e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
243e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setLogoDescription(CharSequence description) {
244e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (!TextUtils.isEmpty(description) && mLogoView == null) {
245e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mLogoView = new ImageView(getContext());
246e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
247e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (mLogoView != null) {
248e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mLogoView.setContentDescription(description);
249e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
250e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
251e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
252e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
253e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Return the description of the toolbar's logo.
254e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
255e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @return A description of the logo
256e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
257e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public CharSequence getLogoDescription() {
258e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return mLogoView != null ? mLogoView.getContentDescription() : null;
259e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
260e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
261e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
262e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Return the current title displayed in the toolbar.
263e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
264e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @return The current title
265e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
266e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public CharSequence getTitle() {
267e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return mTitleText;
268e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
269e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
270e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
271e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set the title of this toolbar.
272e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
273e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>A title should be used as the anchor for a section of content. It should
274e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * describe or name the content being viewed.</p>
275e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
276e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param resId Resource ID of a string to set as the title
277e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
278e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setTitle(int resId) {
279e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setTitle(getContext().getText(resId));
280e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
281e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
282e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
283e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set the title of this toolbar.
284e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
285e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>A title should be used as the anchor for a section of content. It should
286e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * describe or name the content being viewed.</p>
287e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
288e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param title Title to set
289e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
290e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setTitle(CharSequence title) {
291e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (!TextUtils.isEmpty(title)) {
292e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (mTitleTextView == null) {
293e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                final Context context = getContext();
294e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                mTitleTextView = new TextView(context);
295e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                mTitleTextView.setTextAppearance(context, mTitleTextAppearance);
296e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
297e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (mTitleTextView.getParent() == null) {
298e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                addSystemView(mTitleTextView);
299e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
300e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        } else if (mTitleTextView != null && mTitleTextView.getParent() != null) {
301e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            removeView(mTitleTextView);
302e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
303e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (mTitleTextView != null) {
304e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mTitleTextView.setText(title);
305e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
306e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mTitleText = title;
307e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
308e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
309e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
310e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Return the subtitle of this toolbar.
311e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
312e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @return The current subtitle
313e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
314e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public CharSequence getSubtitle() {
315e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return mSubtitleText;
316e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
317e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
318e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
319e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set the subtitle of this toolbar.
320e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
321e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>Subtitles should express extended information about the current content.</p>
322e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
323e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param resId String resource ID
324e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
325e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setSubtitle(int resId) {
326e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setSubtitle(getContext().getText(resId));
327e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
328e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
329e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
330e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set the subtitle of this toolbar.
331e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
332e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>Subtitles should express extended information about the current content.</p>
333e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
334e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param subtitle Subtitle to set
335e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
336e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setSubtitle(CharSequence subtitle) {
337e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (!TextUtils.isEmpty(subtitle)) {
338e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (mSubtitleTextView == null) {
339e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                final Context context = getContext();
340e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                mSubtitleTextView = new TextView(context);
341e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                mSubtitleTextView.setTextAppearance(context, mSubtitleTextAppearance);
342e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
343e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (mSubtitleTextView.getParent() == null) {
344e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                addSystemView(mSubtitleTextView);
345e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
346e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        } else if (mSubtitleTextView != null && mSubtitleTextView.getParent() != null) {
347e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            removeView(mSubtitleTextView);
348e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
349e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (mSubtitleTextView != null) {
350e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mSubtitleTextView.setText(subtitle);
351e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
352e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mSubtitleText = subtitle;
353e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
354e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
355e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
356e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set the icon to use for the toolbar's navigation button.
357e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
358e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>The navigation button appears at the start of the toolbar if present. Setting an icon
359e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * will make the navigation button visible.</p>
360e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
361e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>If you use a navigation icon you should also set a description for its action using
362e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * {@link #setNavigationDescription(int)}. This is used for accessibility and tooltips.</p>
363e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
364e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param resId Resource ID of a drawable to set
365e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
366e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setNavigationIcon(int resId) {
367e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setNavigationIcon(getContext().getDrawable(resId));
368e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
369e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
370e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
371e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set the icon to use for the toolbar's navigation button.
372e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
373e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>The navigation button appears at the start of the toolbar if present. Setting an icon
374e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * will make the navigation button visible.</p>
375e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
376e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>If you use a navigation icon you should also set a description for its action using
377e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * {@link #setNavigationDescription(int)}. This is used for accessibility and tooltips.</p>
378e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
379e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param icon Drawable to set
380e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
381e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setNavigationIcon(Drawable icon) {
382e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (icon != null) {
383e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            ensureNavButtonView();
384e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (mNavButtonView.getParent() == null) {
385e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                addSystemView(mNavButtonView);
386e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
387e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        } else if (mNavButtonView != null && mNavButtonView.getParent() != null) {
388e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            removeView(mNavButtonView);
389e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
390e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (mNavButtonView != null) {
391e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mNavButtonView.setImageDrawable(icon);
392e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
393e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
394e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
395e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
396e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Return the current drawable used as the navigation icon.
397e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
398e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @return The navigation icon drawable
399e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
400e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public Drawable getNavigationIcon() {
401e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return mNavButtonView != null ? mNavButtonView.getDrawable() : null;
402e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
403e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
404e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
405e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set a description for the navigation button.
406e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
407e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>This description string is used for accessibility, tooltips and other facilities
408e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * to improve discoverability.</p>
409e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
410e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param resId Resource ID of a string to set
411e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
412e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setNavigationDescription(int resId) {
413e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setNavigationDescription(getContext().getText(resId));
414e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
415e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
416e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
417e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set a description for the navigation button.
418e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
419e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>This description string is used for accessibility, tooltips and other facilities
420e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * to improve discoverability.</p>
421e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
422e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param description String to set as the description
423e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
424e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setNavigationDescription(CharSequence description) {
425e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (!TextUtils.isEmpty(description)) {
426e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            ensureNavButtonView();
427e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
428e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (mNavButtonView != null) {
429e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mNavButtonView.setContentDescription(description);
430e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
431e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
432e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
433e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
434e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set a listener to respond to navigation events.
435e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
436e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>This listener will be called whenever the user clicks the navigation button
437e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * at the start of the toolbar. An icon must be set for the navigation button to appear.</p>
438e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
439e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param listener Listener to set
440e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @see #setNavigationIcon(android.graphics.drawable.Drawable)
441e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
442e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setNavigationOnClickListener(OnClickListener listener) {
443e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        ensureNavButtonView();
444e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mNavButtonView.setOnClickListener(listener);
445e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
446e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
447e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
448e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Return the Menu shown in the toolbar.
449e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
450e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>Applications that wish to populate the toolbar's menu can do so from here. To use
451e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * an XML menu resource, use {@link #inflateMenu(int)}.</p>
452e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
453e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @return The toolbar's Menu
454e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
455e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public Menu getMenu() {
456e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (mMenuView == null) {
457e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mMenuView = new ActionMenuView(getContext());
458e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mMenuView.setOnMenuItemClickListener(mMenuViewItemClickListener);
459e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            addSystemView(mMenuView);
460e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
461e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return mMenuView.getMenu();
462e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
463e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
464e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private MenuInflater getMenuInflater() {
465e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return new MenuInflater(getContext());
466e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
467e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
468e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
469e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Inflate a menu resource into this toolbar.
470e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
471e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>Inflate an XML menu resource into this toolbar. Existing items in the menu will not
472e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * be modified or removed.</p>
473e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
474e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param resId ID of a menu resource to inflate
475e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
476e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void inflateMenu(int resId) {
477e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        getMenuInflater().inflate(resId, getMenu());
478e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
479e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
480e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
481e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Set a listener to respond to menu item click events.
482e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
483e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * <p>This listener will be invoked whenever a user selects a menu item from
484e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * the action buttons presented at the end of the toolbar or the associated overflow.</p>
485e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
486e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param listener Listener to set
487e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
488e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public void setOnMenuItemClickListener(OnMenuItemClickListener listener) {
489e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mOnMenuItemClickListener = listener;
490e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
491e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
492e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private void ensureNavButtonView() {
493e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (mNavButtonView == null) {
494e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            mNavButtonView = new ImageButton(getContext(), null, R.attr.borderlessButtonStyle);
495e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
496e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
497e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
498e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private void addSystemView(View v) {
499e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
500e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                LayoutParams.WRAP_CONTENT);
501e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        lp.mViewType = LayoutParams.SYSTEM;
502e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        addView(v, lp);
503e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
504e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
505e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
506e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    protected Parcelable onSaveInstanceState() {
507e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        SavedState state = new SavedState(super.onSaveInstanceState());
508e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return state;
509e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
510e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
511e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
512e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    protected void onRestoreInstanceState(Parcelable state) {
513e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final SavedState ss = (SavedState) state;
514e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        super.onRestoreInstanceState(ss.getSuperState());
515e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
516e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
517e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
518e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
519e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int width = 0;
520e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int height = 0;
521e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int childState = 0;
522e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
523e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // System views measure first.
524e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
525e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (shouldLayout(mNavButtonView)) {
526e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            measureChildWithMargins(mNavButtonView, widthMeasureSpec, width, heightMeasureSpec, 0);
527e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            width += mNavButtonView.getMeasuredWidth() + getHorizontalMargins(mNavButtonView);
528e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            height = Math.max(height, mNavButtonView.getMeasuredHeight() +
529e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    getVerticalMargins(mNavButtonView));
530e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            childState = combineMeasuredStates(childState, mNavButtonView.getMeasuredState());
531e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
532e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
533e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (shouldLayout(mMenuView)) {
534e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            measureChildWithMargins(mMenuView, widthMeasureSpec, width, heightMeasureSpec, 0);
535e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            width += mMenuView.getMeasuredWidth() + getHorizontalMargins(mMenuView);
536e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            height = Math.max(height, mMenuView.getMeasuredHeight() +
537e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    getVerticalMargins(mMenuView));
538e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            childState = combineMeasuredStates(childState, mMenuView.getMeasuredState());
539e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
540e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
541e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (shouldLayout(mLogoView)) {
542e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            measureChildWithMargins(mLogoView, widthMeasureSpec, width, heightMeasureSpec, 0);
543e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            width += mLogoView.getMeasuredWidth() + getHorizontalMargins(mLogoView);
544e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            height = Math.max(height, mLogoView.getMeasuredHeight() +
545e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    getVerticalMargins(mLogoView));
546e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            childState = combineMeasuredStates(childState, mLogoView.getMeasuredState());
547e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
548e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
549e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int titleWidth = 0;
550e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int titleHeight = 0;
551e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int titleVertMargins = mTitleMarginTop + mTitleMarginBottom;
552e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int titleHorizMargins = mTitleMarginStart + mTitleMarginEnd;
553e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (shouldLayout(mTitleTextView)) {
554e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            measureChildWithMargins(mTitleTextView, widthMeasureSpec, width + titleHorizMargins,
555e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    heightMeasureSpec, titleVertMargins);
556e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            titleWidth = mTitleTextView.getMeasuredWidth() + getHorizontalMargins(mTitleTextView);
557e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            titleHeight = mTitleTextView.getMeasuredHeight() + getVerticalMargins(mTitleTextView);
558e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            childState = combineMeasuredStates(childState, mTitleTextView.getMeasuredState());
559e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
560e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (shouldLayout(mSubtitleTextView)) {
561e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            measureChildWithMargins(mSubtitleTextView, widthMeasureSpec, width + titleHorizMargins,
562e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    heightMeasureSpec, titleHeight + titleVertMargins);
563e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            titleWidth = Math.max(titleWidth, mSubtitleTextView.getMeasuredWidth() +
564e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    getHorizontalMargins(mSubtitleTextView));
565e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            titleHeight += mSubtitleTextView.getMeasuredHeight() +
566e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    getVerticalMargins(mSubtitleTextView);
567e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            childState = combineMeasuredStates(childState, mSubtitleTextView.getMeasuredState());
568e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
569e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
570e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        width += titleWidth;
571e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        height = Math.max(height, titleHeight);
572e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
573e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int childCount = getChildCount();
574e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        for (int i = 0; i < childCount; i++) {
575e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            final View child = getChildAt(i);
576e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
577e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (lp.mViewType == LayoutParams.SYSTEM || !shouldLayout(child)) {
578e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                // We already got all system views above. Skip them and GONE views.
579e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                continue;
580e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
581e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
582e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            measureChildWithMargins(child, widthMeasureSpec, width, heightMeasureSpec, 0);
583e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            width += child.getMeasuredWidth() + getHorizontalMargins(child);
584e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            height = Math.max(height, child.getMeasuredHeight() + getVerticalMargins(child));
585e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            childState = combineMeasuredStates(childState, child.getMeasuredState());
586e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
587e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
588e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // Measurement already took padding into account for available space for the children,
589e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // add it in for the final size.
590e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        width += getPaddingLeft() + getPaddingRight();
591e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        height += getPaddingTop() + getPaddingBottom();
592e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
593e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int measuredWidth = resolveSizeAndState(
594e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                Math.max(width, getSuggestedMinimumWidth()),
595e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                widthMeasureSpec, childState & MEASURED_STATE_MASK);
596e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int measuredHeight = resolveSizeAndState(
597e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                Math.max(height, getSuggestedMinimumHeight()),
598e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                heightMeasureSpec, childState << MEASURED_HEIGHT_STATE_SHIFT);
599e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        setMeasuredDimension(measuredWidth, measuredHeight);
600e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
601e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
602e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
603e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    protected void onLayout(boolean changed, int l, int t, int r, int b) {
604e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
605e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int width = getWidth();
606e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int height = getHeight();
607e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int paddingLeft = getPaddingLeft();
608e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int paddingRight = getPaddingRight();
609e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int paddingTop = getPaddingTop();
610e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int paddingBottom = getPaddingBottom();
611e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int left = paddingLeft;
612e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int right = width - paddingRight;
613e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
614e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (shouldLayout(mNavButtonView)) {
615e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (isRtl) {
616e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                right = layoutChildRight(mNavButtonView, right);
617e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            } else {
618e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                left = layoutChildLeft(mNavButtonView, left);
619e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
620e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
621e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
622e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (shouldLayout(mMenuView)) {
623e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (isRtl) {
624e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                left = layoutChildLeft(mMenuView, left);
625e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            } else {
626e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                right = layoutChildRight(mMenuView, right);
627e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
628e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
629e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
630e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (shouldLayout(mLogoView)) {
631e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (isRtl) {
632e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                right = layoutChildRight(mLogoView, right);
633e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            } else {
634e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                left = layoutChildLeft(mLogoView, left);
635e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
636e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
637e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
638e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final boolean layoutTitle = shouldLayout(mTitleTextView);
639e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final boolean layoutSubtitle = shouldLayout(mSubtitleTextView);
640e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int titleHeight = 0;
641e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (layoutTitle) {
642e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams();
643e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            titleHeight += lp.topMargin + mTitleTextView.getMeasuredHeight() + lp.bottomMargin;
644e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
645e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (layoutSubtitle) {
646e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams();
647e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            titleHeight += lp.bottomMargin + mTitleTextView.getMeasuredHeight() + lp.bottomMargin;
648e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
649e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
650e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (layoutTitle || layoutSubtitle) {
651e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            int titleTop;
652e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            switch (mGravity & Gravity.VERTICAL_GRAVITY_MASK) {
653e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                case Gravity.TOP:
654e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleTop = getPaddingTop();
655e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    break;
656e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                default:
657e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                case Gravity.CENTER_VERTICAL:
658e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final View child = layoutTitle ? mTitleTextView : mSubtitleTextView;
659e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final LayoutParams lp = (LayoutParams) child.getLayoutParams();
660e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final int space = height - paddingTop - paddingBottom;
661e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    int spaceAbove = (space - titleHeight) / 2;
662e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    if (spaceAbove < lp.topMargin + mTitleMarginTop) {
663e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                        spaceAbove = lp.topMargin + mTitleMarginTop;
664e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    } else {
665e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                        final int spaceBelow = height - paddingBottom - titleHeight -
666e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                                spaceAbove - paddingTop;
667e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                        if (spaceBelow < lp.bottomMargin + mTitleMarginBottom) {
668e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                            spaceAbove = Math.max(0, spaceAbove -
669e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                                    (lp.bottomMargin + mTitleMarginBottom - spaceBelow));
670e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                        }
671e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    }
672e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleTop = paddingTop + spaceAbove;
673e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    break;
674e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                case Gravity.BOTTOM:
675e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleTop = height - paddingBottom - titleHeight;
676e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    break;
677e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
678e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (isRtl) {
679e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                int titleRight = right;
680e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                int subtitleRight = right;
681e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                titleTop += mTitleMarginTop;
682e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                if (layoutTitle) {
683e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams();
684e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleRight -= lp.rightMargin + mTitleMarginStart;
685e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleTop += lp.topMargin;
686e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final int titleLeft = titleRight - mTitleTextView.getMeasuredWidth();
687e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final int titleBottom = titleTop + mTitleTextView.getMeasuredHeight();
688e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    mTitleTextView.layout(titleLeft, titleTop, titleRight, titleBottom);
689e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleRight = titleLeft - lp.leftMargin - mTitleMarginEnd;
690e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleTop = titleBottom + lp.bottomMargin;
691e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                }
692e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                if (layoutSubtitle) {
693e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams();
694e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    subtitleRight -= lp.rightMargin + mTitleMarginStart;
695e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleTop += lp.topMargin;
696e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final int subtitleLeft = subtitleRight - mSubtitleTextView.getMeasuredWidth();
697e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final int subtitleBottom = titleTop + mSubtitleTextView.getMeasuredHeight();
698e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    mSubtitleTextView.layout(subtitleLeft, titleTop, subtitleRight, subtitleBottom);
699e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    subtitleRight = subtitleRight - lp.leftMargin - mTitleMarginEnd;
700e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleTop = subtitleBottom + lp.bottomMargin;
701e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                }
702e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                right = Math.max(titleRight, subtitleRight);
703e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            } else {
704e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                int titleLeft = left;
705e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                int subtitleLeft = left;
706e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                titleTop += mTitleMarginTop;
707e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                if (layoutTitle) {
708e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams();
709e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleLeft += lp.leftMargin + mTitleMarginStart;
710e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleTop += lp.topMargin;
711e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final int titleRight = titleLeft + mTitleTextView.getMeasuredWidth();
712e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final int titleBottom = titleTop + mTitleTextView.getMeasuredHeight();
713e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    mTitleTextView.layout(titleLeft, titleTop, titleRight, titleBottom);
714e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleLeft = titleRight + lp.rightMargin + mTitleMarginEnd;
715e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleTop = titleBottom + lp.bottomMargin;
716e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                }
717e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                if (layoutSubtitle) {
718e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams();
719e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    subtitleLeft += lp.leftMargin + mTitleMarginStart;
720e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleTop += lp.topMargin;
721e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final int subtitleRight = subtitleLeft + mSubtitleTextView.getMeasuredWidth();
722e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final int subtitleBottom = titleTop + mSubtitleTextView.getMeasuredHeight();
723e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    mSubtitleTextView.layout(subtitleLeft, titleTop, subtitleRight, subtitleBottom);
724e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    subtitleLeft = subtitleRight + lp.rightMargin + mTitleMarginEnd;
725e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    titleTop = subtitleBottom + lp.bottomMargin;
726e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                }
727e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                left = Math.max(titleLeft, subtitleLeft);
728e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
729e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
730e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
731e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // Get all remaining children sorted for layout. This is all prepared
732e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // such that absolute layout direction can be used below.
733e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
734e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        addCustomViewsWithGravity(mTempViews, Gravity.LEFT);
735e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int leftViewsCount = mTempViews.size();
736e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        for (int i = 0; i < leftViewsCount; i++) {
737e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            left = layoutChildLeft(getChildAt(i), left);
738e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
739e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
740e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        addCustomViewsWithGravity(mTempViews, Gravity.RIGHT);
741e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int rightViewsCount = mTempViews.size();
742e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        for (int i = 0; i < rightViewsCount; i++) {
743e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            right = layoutChildRight(getChildAt(i), right);
744e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
745e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
746e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // Centered views try to center with respect to the whole bar, but views pinned
747e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        // to the left or right can push the mass of centered views to one side or the other.
748e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        addCustomViewsWithGravity(mTempViews, Gravity.CENTER);
749e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int centerViewsWidth = getViewListMeasuredWidth(mTempViews);
750e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int parentCenter = paddingLeft + (width - paddingLeft - paddingRight) / 2;
751e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int halfCenterViewsWidth = centerViewsWidth / 2;
752e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int centerLeft = parentCenter - halfCenterViewsWidth;
753e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int centerRight = centerLeft + centerViewsWidth;
754e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (centerLeft < left) {
755e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            centerLeft = left;
756e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        } else if (centerRight > right) {
757e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            centerLeft -= centerRight - right;
758e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
759e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
760e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int centerViewsCount = mTempViews.size();
761e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        for (int i = 0; i < centerViewsCount; i++) {
762e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            centerLeft = layoutChildLeft(getChildAt(i), centerLeft);
763e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
764e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        mTempViews.clear();
765e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
766e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
767e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int getViewListMeasuredWidth(List<View> views) {
768e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int width = 0;
769e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int count = views.size();
770e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        for (int i = 0; i < count; i++) {
771e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            final View v = views.get(i);
772e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            final LayoutParams lp = (LayoutParams) v.getLayoutParams();
773e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            width += lp.leftMargin + v.getMeasuredWidth() + lp.rightMargin;
774e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
775e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return width;
776e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
777e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
778e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int layoutChildLeft(View child, int left) {
779e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
780e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        left += lp.leftMargin;
781e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int top = getChildTop(child);
782e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        child.layout(left, top, left + child.getMeasuredWidth(), top + child.getMeasuredHeight());
783e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        left += lp.rightMargin;
784e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return left;
785e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
786e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
787e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int layoutChildRight(View child, int right) {
788e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
789e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        right -= lp.rightMargin;
790e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int top = getChildTop(child);
791e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        child.layout(right - child.getMeasuredWidth(), top, right, top + child.getMeasuredHeight());
792e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        right -= lp.leftMargin;
793e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return right;
794e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
795e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
796e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int getChildTop(View child) {
797e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
798e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        switch (getChildVerticalGravity(lp.gravity)) {
799e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            case Gravity.TOP:
800e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                return getPaddingTop();
801e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
802e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            case Gravity.BOTTOM:
803e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                return getPaddingBottom() - child.getMeasuredHeight() - lp.bottomMargin;
804e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
805e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            default:
806e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            case Gravity.CENTER_VERTICAL:
807e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                final int paddingTop = getPaddingTop();
808e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                final int paddingBottom = getPaddingBottom();
809e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                final int height = getHeight();
810e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                final int childHeight = child.getMeasuredHeight();
811e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                final int space = height - paddingTop - paddingBottom;
812e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                int spaceAbove = (space - childHeight) / 2;
813e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                if (spaceAbove < lp.topMargin) {
814e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    spaceAbove = lp.topMargin;
815e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                } else {
816e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    final int spaceBelow = height - paddingBottom - childHeight -
817e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                            spaceAbove - paddingTop;
818e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    if (spaceBelow < lp.bottomMargin) {
819e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                        spaceAbove = Math.max(0, spaceAbove - (lp.bottomMargin - spaceBelow));
820e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    }
821e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                }
822e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                return paddingTop + spaceAbove;
823e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
824e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
825e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
826e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int getChildVerticalGravity(int gravity) {
827e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int vgrav = gravity & Gravity.VERTICAL_GRAVITY_MASK;
828e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        switch (vgrav) {
829e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            case Gravity.TOP:
830e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            case Gravity.BOTTOM:
831e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            case Gravity.CENTER_VERTICAL:
832e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                return vgrav;
833e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            default:
834e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                return mGravity & Gravity.VERTICAL_GRAVITY_MASK;
835e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
836e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
837e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
838e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
839e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Prepare a list of non-SYSTEM child views. If the layout direction is RTL
840e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * this will be in reverse child order.
841e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
842e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param views List to populate. It will be cleared before use.
843e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @param gravity Horizontal gravity to match against
844e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
845e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private void addCustomViewsWithGravity(List<View> views, int gravity) {
846e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
847e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int childCount = getChildCount();
848e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int absGrav = Gravity.getAbsoluteGravity(gravity, getLayoutDirection());
849e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
850e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        views.clear();
851e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
852e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (isRtl) {
853e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            for (int i = childCount - 1; i >= 0; i--) {
854e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                final View child = getChildAt(i);
855e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
856e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                if (lp.mViewType != LayoutParams.SYSTEM && shouldLayout(child) &&
857e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                        getChildHorizontalGravity(lp.gravity) == absGrav) {
858e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    views.add(child);
859e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                }
860e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
861e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
862e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        } else {
863e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            for (int i = 0; i < childCount; i++) {
864e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                final View child = getChildAt(i);
865e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
866e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                if (lp.mViewType != LayoutParams.SYSTEM && shouldLayout(child) &&
867e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                        getChildHorizontalGravity(lp.gravity) == absGrav) {
868e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    views.add(child);
869e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                }
870e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
871e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
872e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
873e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
874e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int getChildHorizontalGravity(int gravity) {
875e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int ld = getLayoutDirection();
876e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int absGrav = Gravity.getAbsoluteGravity(gravity, ld);
877e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final int hGrav = absGrav & Gravity.HORIZONTAL_GRAVITY_MASK;
878e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        switch (hGrav) {
879e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            case Gravity.LEFT:
880e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            case Gravity.RIGHT:
881e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            case Gravity.CENTER_HORIZONTAL:
882e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                return hGrav;
883e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            default:
884e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                return ld == LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT;
885e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
886e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
887e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
888e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private boolean shouldLayout(View view) {
889e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return view != null && view.getParent() == this && view.getVisibility() != GONE;
890e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
891e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
892e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int getHorizontalMargins(View v) {
893e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final MarginLayoutParams mlp = (MarginLayoutParams) v.getLayoutParams();
894e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return mlp.getMarginStart() + mlp.getMarginEnd();
895e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
896e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
897e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private int getVerticalMargins(View v) {
898e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        final MarginLayoutParams mlp = (MarginLayoutParams) v.getLayoutParams();
899e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return mlp.topMargin + mlp.bottomMargin;
900e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
901e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
902e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
903e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
904e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return super.generateLayoutParams(attrs);
905e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
906e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
907e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
908e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
909e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        if (p instanceof LayoutParams) {
910e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            return new LayoutParams((LayoutParams) p);
911e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        } else if (p instanceof MarginLayoutParams) {
912e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            return new LayoutParams((MarginLayoutParams) p);
913e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        } else {
914e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            return new LayoutParams(p);
915e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
916e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
917e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
918e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
919e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
920e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
921e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
922e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
923e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    @Override
924e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
925e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return super.checkLayoutParams(p) && p instanceof LayoutParams;
926e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
927e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
928e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    private static boolean isCustomView(View child) {
929e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        return ((LayoutParams) child.getLayoutParams()).mViewType == LayoutParams.CUSTOM;
930e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
931e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
932e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
933e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Interface responsible for receiving menu item click events if the items themselves
934e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * do not have individual item click listeners.
935e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
936e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public interface OnMenuItemClickListener {
937e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        /**
938e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell         * This method will be invoked when a menu item is clicked if the item itself did
939e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell         * not already handle the event.
940e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell         *
941e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell         * @param item {@link MenuItem} that was clicked
942e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell         * @return <code>true</code> if the event was handled, <code>false</code> otherwise.
943e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell         */
944e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public boolean onMenuItemClick(MenuItem item);
945e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
946e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
947e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /**
948e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * Layout information for child views of Toolbars.
949e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     *
950e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     * @attr ref android.R.styleable#Toolbar_LayoutParams_layout_gravity
951e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell     */
952e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    public static class LayoutParams extends MarginLayoutParams {
953e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        /**
954e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell         * Gravity for the view associated with these LayoutParams.
955e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell         *
956e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell         * @see android.view.Gravity
957e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell         */
958e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        @ViewDebug.ExportedProperty(category = "layout", mapping = {
959e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from =  -1,                       to = "NONE"),
960e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.NO_GRAVITY,        to = "NONE"),
961e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.TOP,               to = "TOP"),
962e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.BOTTOM,            to = "BOTTOM"),
963e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.LEFT,              to = "LEFT"),
964e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.RIGHT,             to = "RIGHT"),
965e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.START,             to = "START"),
966e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.END,               to = "END"),
967e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.CENTER_VERTICAL,   to = "CENTER_VERTICAL"),
968e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.FILL_VERTICAL,     to = "FILL_VERTICAL"),
969e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.CENTER_HORIZONTAL, to = "CENTER_HORIZONTAL"),
970e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.FILL_HORIZONTAL,   to = "FILL_HORIZONTAL"),
971e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.CENTER,            to = "CENTER"),
972e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                @ViewDebug.IntToString(from = Gravity.FILL,              to = "FILL")
973e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        })
974e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public int gravity = Gravity.NO_GRAVITY;
975e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
976e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        static final int CUSTOM = 0;
977e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        static final int SYSTEM = 1;
978e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
979e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        int mViewType = CUSTOM;
980e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
981e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public LayoutParams(@NonNull Context c, AttributeSet attrs) {
982e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            super(c, attrs);
983e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
984e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            TypedArray a = c.obtainStyledAttributes(attrs,
985e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    com.android.internal.R.styleable.Toolbar_LayoutParams);
986e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            gravity = a.getInt(
987e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    com.android.internal.R.styleable.Toolbar_LayoutParams_layout_gravity,
988e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    Gravity.NO_GRAVITY);
989e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            a.recycle();
990e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
991e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
992e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public LayoutParams(int width, int height) {
993e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            super(width, height);
994e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            this.gravity = Gravity.CENTER_VERTICAL | Gravity.START;
995e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
996e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
997e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public LayoutParams(int width, int height, int gravity) {
998e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            super(width, height);
999e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            this.gravity = gravity;
1000e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
1001e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
1002e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public LayoutParams(int gravity) {
1003e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            this(WRAP_CONTENT, MATCH_PARENT, gravity);
1004e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
1005e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
1006e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public LayoutParams(LayoutParams source) {
1007e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            super(source);
1008e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
1009e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            this.gravity = source.gravity;
1010e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
1011e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
1012e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public LayoutParams(MarginLayoutParams source) {
1013e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            super(source);
1014e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
1015e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
1016e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public LayoutParams(ViewGroup.LayoutParams source) {
1017e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            super(source);
1018e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
1019e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
1020e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
1021e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    static class SavedState extends BaseSavedState {
1022e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public SavedState(Parcel source) {
1023e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            super(source);
1024e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
1025e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
1026e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public SavedState(Parcelable superState) {
1027e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            super(superState);
1028e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
1029e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
1030e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        @Override
1031e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public void writeToParcel(Parcel out, int flags) {
1032e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            super.writeToParcel(out, flags);
1033e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
1034e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
1035e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {
1036e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
1037e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            @Override
1038e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            public SavedState createFromParcel(Parcel source) {
1039e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                return new SavedState(source);
1040e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
1041e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
1042e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            @Override
1043e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            public SavedState[] newArray(int size) {
1044e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                return new SavedState[size];
1045e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
1046e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        };
1047e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
1048e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell}
1049