131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki/*
231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * Copyright (C) 2015 The Android Open Source Project
331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *
431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * you may not use this file except in compliance with the License.
631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * You may obtain a copy of the License at
731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *
831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *
1031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * Unless required by applicable law or agreed to in writing, software
1131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
1231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * See the License for the specific language governing permissions and
1431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * limitations under the License.
1531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */
1631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
1731a49efe2adb59e31611f6871895a3243d835127Yuichi Arakipackage android.support.design.widget;
1831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
1931a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.content.Context;
20d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.content.res.ColorStateList;
2131a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.content.res.TypedArray;
2230d42dc19655e637644adc3846025027240bf0afYuichi Arakiimport android.graphics.Rect;
23a63940ca14cd3ad9620e94f709930bb968525c57Chris Banesimport android.graphics.drawable.Drawable;
2401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Bundle;
2501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Parcel;
2601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Parcelable;
27d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.support.annotation.DrawableRes;
28f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Arakiimport android.support.annotation.IdRes;
2901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.support.annotation.LayoutRes;
3001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.support.annotation.NonNull;
31d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.support.annotation.Nullable;
32153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banesimport android.support.annotation.StyleRes;
3331a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.design.R;
346c72ea0134a3309ff8197f0862aad8d7bc712b55Yuichi Arakiimport android.support.design.internal.NavigationMenu;
3531a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.design.internal.NavigationMenuPresenter;
3631a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.design.internal.ScrimInsetsFrameLayout;
37a63940ca14cd3ad9620e94f709930bb968525c57Chris Banesimport android.support.v4.content.ContextCompat;
3862ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banesimport android.support.v4.os.ParcelableCompat;
3962ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banesimport android.support.v4.os.ParcelableCompatCreatorCallbacks;
4005f5ba020fa6caa658c75b6d77436aa980ca0fccChris Banesimport android.support.v4.view.AbsSavedState;
4131a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.v4.view.ViewCompat;
4266698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.SupportMenuInflater;
4366698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuBuilder;
4466698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuItemImpl;
4531a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.util.AttributeSet;
46a63940ca14cd3ad9620e94f709930bb968525c57Chris Banesimport android.util.TypedValue;
4731a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.Menu;
483a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banesimport android.view.MenuInflater;
4931a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.MenuItem;
5031a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.View;
5131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
5231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki/**
53a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * Represents a standard navigation menu for application. The menu contents can be populated
54a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * by a menu resource file.
55a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * <p>NavigationView is typically placed inside a {@link android.support.v4.widget.DrawerLayout}.
5631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * </p>
5731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * <pre>
5831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * &lt;android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
5931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     xmlns:app="http://schemas.android.com/apk/res-auto"
6031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     android:id="@+id/drawer_layout"
6131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     android:layout_width="match_parent"
6231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     android:layout_height="match_parent"
6331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     android:fitsSystemWindows="true"&gt;
6431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *
6531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     &lt;!-- Your contents --&gt;
6631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *
67a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki *     &lt;android.support.design.widget.NavigationView
68a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki *         android:id="@+id/navigation"
6931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *         android:layout_width="wrap_content"
7031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *         android:layout_height="match_parent"
713a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes *         android:layout_gravity="start"
723a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes *         app:menu="@menu/my_navigation_items" /&gt;
7331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * &lt;/android.support.v4.widget.DrawerLayout&gt;
7431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * </pre>
7531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */
76a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Arakipublic class NavigationView extends ScrimInsetsFrameLayout {
7731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
78a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
79a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    private static final int[] DISABLED_STATE_SET = {-android.R.attr.state_enabled};
80a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes
813a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    private static final int PRESENTER_NAVIGATION_VIEW_ID = 1;
8201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
836c72ea0134a3309ff8197f0862aad8d7bc712b55Yuichi Araki    private final NavigationMenu mMenu;
849d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki    private final NavigationMenuPresenter mPresenter = new NavigationMenuPresenter();
8501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
863a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    private OnNavigationItemSelectedListener mListener;
8731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    private int mMaxWidth;
8831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
893a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    private MenuInflater mMenuInflater;
903a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
91a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki    public NavigationView(Context context) {
9231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        this(context, null);
9331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
9431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
95a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki    public NavigationView(Context context, AttributeSet attrs) {
9631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        this(context, attrs, 0);
9731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
9831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
99a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki    public NavigationView(Context context, AttributeSet attrs, int defStyleAttr) {
10031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        super(context, attrs, defStyleAttr);
10131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
102809bb62055ad42b88f3a69308be222801b89fbd9Chris Banes        ThemeUtils.checkAppCompatTheme(context);
103809bb62055ad42b88f3a69308be222801b89fbd9Chris Banes
1043a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        // Create the menu
1056c72ea0134a3309ff8197f0862aad8d7bc712b55Yuichi Araki        mMenu = new NavigationMenu(context);
1063a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
10731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        // Custom attributes
10831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        TypedArray a = context.obtainStyledAttributes(attrs,
109a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                R.styleable.NavigationView, defStyleAttr,
110a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                R.style.Widget_Design_NavigationView);
11131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
11231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        //noinspection deprecation
113a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki        setBackgroundDrawable(a.getDrawable(R.styleable.NavigationView_android_background));
1143a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        if (a.hasValue(R.styleable.NavigationView_elevation)) {
1153a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            ViewCompat.setElevation(this, a.getDimensionPixelSize(
1163a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    R.styleable.NavigationView_elevation, 0));
1173a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
11831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        ViewCompat.setFitsSystemWindows(this,
119a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                a.getBoolean(R.styleable.NavigationView_android_fitsSystemWindows, false));
1203a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
121a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki        mMaxWidth = a.getDimensionPixelSize(R.styleable.NavigationView_android_maxWidth, 0);
1223a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
123a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        final ColorStateList itemIconTint;
124a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        if (a.hasValue(R.styleable.NavigationView_itemIconTint)) {
125a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes            itemIconTint = a.getColorStateList(R.styleable.NavigationView_itemIconTint);
126a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        } else {
127a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes            itemIconTint = createDefaultColorStateList(android.R.attr.textColorSecondary);
128a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        }
1293a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
130153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        boolean textAppearanceSet = false;
131153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        int textAppearance = 0;
132153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        if (a.hasValue(R.styleable.NavigationView_itemTextAppearance)) {
133153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes            textAppearance = a.getResourceId(R.styleable.NavigationView_itemTextAppearance, 0);
134153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes            textAppearanceSet = true;
135153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        }
136153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes
137153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        ColorStateList itemTextColor = null;
138a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        if (a.hasValue(R.styleable.NavigationView_itemTextColor)) {
139a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes            itemTextColor = a.getColorStateList(R.styleable.NavigationView_itemTextColor);
140153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        }
141153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes
142153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        if (!textAppearanceSet && itemTextColor == null) {
143153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes            // If there isn't a text appearance set, we'll use a default text color
144a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes            itemTextColor = createDefaultColorStateList(android.R.attr.textColorPrimary);
145a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        }
146a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes
147a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        final Drawable itemBackground = a.getDrawable(R.styleable.NavigationView_itemBackground);
14831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
14901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mMenu.setCallback(new MenuBuilder.Callback() {
15031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            @Override
15131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
15231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                return mListener != null && mListener.onNavigationItemSelected(item);
15331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            }
15431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
15531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            @Override
1563a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            public void onMenuModeChange(MenuBuilder menu) {}
15701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        });
1583a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        mPresenter.setId(PRESENTER_NAVIGATION_VIEW_ID);
15901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mPresenter.initForMenu(context, mMenu);
160a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        mPresenter.setItemIconTintList(itemIconTint);
161153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        if (textAppearanceSet) {
162153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes            mPresenter.setItemTextAppearance(textAppearance);
163153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        }
164a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        mPresenter.setItemTextColor(itemTextColor);
165a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        mPresenter.setItemBackground(itemBackground);
16601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mMenu.addMenuPresenter(mPresenter);
1677c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        addView((View) mPresenter.getMenuView(this));
1683a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
1699d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki        if (a.hasValue(R.styleable.NavigationView_menu)) {
1709d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki            inflateMenu(a.getResourceId(R.styleable.NavigationView_menu, 0));
1719d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki        }
1729d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki
1730cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes        if (a.hasValue(R.styleable.NavigationView_headerLayout)) {
1740cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes            inflateHeaderView(a.getResourceId(R.styleable.NavigationView_headerLayout, 0));
1750cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes        }
1760cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes
1773a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        a.recycle();
17801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
17901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
18001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    @Override
18101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    protected Parcelable onSaveInstanceState() {
18201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        Parcelable superState = super.onSaveInstanceState();
18301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        SavedState state = new SavedState(superState);
18401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        state.menuState = new Bundle();
18501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mMenu.savePresenterStates(state.menuState);
18601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        return state;
18701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
18801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
18901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    @Override
19001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    protected void onRestoreInstanceState(Parcelable savedState) {
191bb58a82daf11bf3c056d1cd5887aa26435d37b69Aurimas Liutikas        if (!(savedState instanceof SavedState)) {
192bb58a82daf11bf3c056d1cd5887aa26435d37b69Aurimas Liutikas            super.onRestoreInstanceState(savedState);
193bb58a82daf11bf3c056d1cd5887aa26435d37b69Aurimas Liutikas            return;
194bb58a82daf11bf3c056d1cd5887aa26435d37b69Aurimas Liutikas        }
19501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        SavedState state = (SavedState) savedState;
19601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        super.onRestoreInstanceState(state.getSuperState());
19701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mMenu.restorePresenterStates(state.menuState);
19831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
19931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
20031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    /**
20131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     * Set a listener that will be notified when a menu item is clicked.
20231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     *
20331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     * @param listener The listener to notify
20431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     */
20531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void setNavigationItemSelectedListener(OnNavigationItemSelectedListener listener) {
20631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        mListener = listener;
20731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
20831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
20931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
21031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    protected void onMeasure(int widthSpec, int heightSpec) {
21131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        switch (MeasureSpec.getMode(widthSpec)) {
21231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            case MeasureSpec.EXACTLY:
21331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                // Nothing to do
21431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                break;
21531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            case MeasureSpec.AT_MOST:
21631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                widthSpec = MeasureSpec.makeMeasureSpec(
21731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                        Math.min(MeasureSpec.getSize(widthSpec), mMaxWidth), MeasureSpec.EXACTLY);
21831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                break;
21931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            case MeasureSpec.UNSPECIFIED:
22031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                widthSpec = MeasureSpec.makeMeasureSpec(mMaxWidth, MeasureSpec.EXACTLY);
22131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                break;
22231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
22331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        // Let super sort out the height
22431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        super.onMeasure(widthSpec, heightSpec);
22531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
22631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
22730d42dc19655e637644adc3846025027240bf0afYuichi Araki    /**
22830d42dc19655e637644adc3846025027240bf0afYuichi Araki     * @hide
22930d42dc19655e637644adc3846025027240bf0afYuichi Araki     */
23030d42dc19655e637644adc3846025027240bf0afYuichi Araki    @Override
23130d42dc19655e637644adc3846025027240bf0afYuichi Araki    protected void onInsetsChanged(Rect insets) {
23230d42dc19655e637644adc3846025027240bf0afYuichi Araki        mPresenter.setPaddingTopDefault(insets.top);
23330d42dc19655e637644adc3846025027240bf0afYuichi Araki    }
2343a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
2353a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    /**
2363a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     * Inflate a menu resource into this navigation view.
2373a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     *
2383a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     * <p>Existing items in the menu will not be modified or removed.</p>
2393a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     *
2403a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     * @param resId ID of a menu resource to inflate
2413a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     */
2423a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    public void inflateMenu(int resId) {
2439d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki        mPresenter.setUpdateSuspended(true);
2443a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        getMenuInflater().inflate(resId, mMenu);
2459d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki        mPresenter.setUpdateSuspended(false);
2469d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki        mPresenter.updateMenuView(false);
2473a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    }
2483a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
24931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    /**
2503a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     * Returns the {@link Menu} instance associated with this navigation view.
25131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     */
25231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public Menu getMenu() {
25331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return mMenu;
25431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
25531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
25631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    /**
25701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * Inflates a View and add it as a header of the navigation menu.
25801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     *
25901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * @param res The layout resource ID.
26001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * @return a newly inflated View.
26101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     */
26201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public View inflateHeaderView(@LayoutRes int res) {
2637c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        return mPresenter.inflateHeaderView(res);
26401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
26501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
26601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
26701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * Adds a View as a header of the navigation menu.
26801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     *
26901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * @param view The view to be added as a header of the navigation menu.
27001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     */
27101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public void addHeaderView(@NonNull View view) {
27201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mPresenter.addHeaderView(view);
27301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
27401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
27501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
27601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * Removes a previously-added header view.
27701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     *
27801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * @param view The view to remove
27901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     */
28001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public void removeHeaderView(@NonNull View view) {
2817c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        mPresenter.removeHeaderView(view);
28201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
28301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
28401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
285cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki     * Gets the number of headers in this NavigationView.
286cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki     *
287cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki     * @return A positive integer representing the number of headers.
288cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki     */
289cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki    public int getHeaderCount() {
290cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki        return mPresenter.getHeaderCount();
291cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki    }
292cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki
293cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki    /**
294cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki     * Gets the header view at the specified position.
295cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki     *
296cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki     * @param index The position at which to get the view from.
297cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki     * @return The header view the specified position or null if the position does not exist in this
298cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki     * NavigationView.
299cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki     */
300cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki    public View getHeaderView(int index) {
301cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki        return mPresenter.getHeaderView(index);
302cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki    }
303cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki
304cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki    /**
3058ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov     * Returns the tint which is applied to our menu items' icons.
306a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     *
307a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     * @see #setItemIconTintList(ColorStateList)
308d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     *
309a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     * @attr ref R.styleable#NavigationView_itemIconTint
310d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     */
311d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    @Nullable
312a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    public ColorStateList getItemIconTintList() {
313d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki        return mPresenter.getItemTintList();
314d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
315d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
316d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    /**
3178ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov     * Set the tint which is applied to our menu items' icons.
318a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     *
319a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     * @param tint the tint to apply.
320a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     *
321a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     * @attr ref R.styleable#NavigationView_itemIconTint
322a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     */
323a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    public void setItemIconTintList(@Nullable ColorStateList tint) {
324a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        mPresenter.setItemIconTintList(tint);
325a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    }
326a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes
327a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    /**
3288ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov     * Returns the tint which is applied to our menu items' icons.
329a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     *
330a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     * @see #setItemTextColor(ColorStateList)
331a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     *
332a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     * @attr ref R.styleable#NavigationView_itemTextColor
333a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     */
334a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    @Nullable
335a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    public ColorStateList getItemTextColor() {
336a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        return mPresenter.getItemTextColor();
337a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    }
338a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes
339a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    /**
3408ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov     * Set the text color to be used on our menu items.
341a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     *
342a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     * @see #getItemTextColor()
343d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     *
344a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     * @attr ref R.styleable#NavigationView_itemTextColor
345d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     */
346a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    public void setItemTextColor(@Nullable ColorStateList textColor) {
347a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        mPresenter.setItemTextColor(textColor);
348d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
349d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
350d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    /**
3518ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov     * Returns the background drawable for our menu items.
352d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     *
353d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * @see #setItemBackgroundResource(int)
354a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     *
355a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki     * @attr ref R.styleable#NavigationView_itemBackground
356d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     */
3578ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov    @Nullable
358a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    public Drawable getItemBackground() {
359a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        return mPresenter.getItemBackground();
360a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    }
361a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes
362a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    /**
3638ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov     * Set the background of our menu items to the given resource.
364a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     *
365a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     * @param resId The identifier of the resource.
366a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     *
367a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     * @attr ref R.styleable#NavigationView_itemBackground
368a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes     */
369a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    public void setItemBackgroundResource(@DrawableRes int resId) {
370a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        setItemBackground(ContextCompat.getDrawable(getContext(), resId));
371d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
372d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
373d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    /**
3748ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov     * Set the background of our menu items to a given resource. The resource should refer to
3758ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov     * a Drawable object or null to use the default background set on this navigation menu.
376d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     *
377a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki     * @attr ref R.styleable#NavigationView_itemBackground
378d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     */
3798ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov    public void setItemBackground(@Nullable Drawable itemBackground) {
380a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        mPresenter.setItemBackground(itemBackground);
381d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
382d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
383f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki    /**
384f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki     * Sets the currently checked item in this navigation menu.
385f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki     *
386f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki     * @param id The item ID of the currently checked item.
387f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki     */
388f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki    public void setCheckedItem(@IdRes int id) {
389f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki        MenuItem item = mMenu.findItem(id);
390f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki        if (item != null) {
391f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki            mPresenter.setCheckedItem((MenuItemImpl) item);
392f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki        }
393f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki    }
394f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki
395153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes    /**
396153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes     * Set the text appearance of the menu items to a given resource.
397153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes     *
398153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes     * @attr ref R.styleable#NavigationView_itemTextAppearance
399153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes     */
400153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes    public void setItemTextAppearance(@StyleRes int resId) {
401153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        mPresenter.setItemTextAppearance(resId);
402153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes    }
403153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes
4043a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    private MenuInflater getMenuInflater() {
4053a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        if (mMenuInflater == null) {
4063a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            mMenuInflater = new SupportMenuInflater(getContext());
4073a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
4083a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        return mMenuInflater;
4093a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    }
4103a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
411a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    private ColorStateList createDefaultColorStateList(int baseColorThemeAttr) {
412a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        TypedValue value = new TypedValue();
413a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        if (!getContext().getTheme().resolveAttribute(baseColorThemeAttr, value, true)) {
414a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes            return null;
415a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        }
416a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        ColorStateList baseColor = getResources().getColorStateList(value.resourceId);
4176759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski        if (!getContext().getTheme().resolveAttribute(
4186759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski                    android.support.v7.appcompat.R.attr.colorPrimary, value, true)) {
419a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes            return null;
420a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        }
4210eda28cff720158c50d0b455663b599830f78992Chris Banes        int colorPrimary = value.data;
422a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        int defaultColor = baseColor.getDefaultColor();
423a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        return new ColorStateList(new int[][]{
424a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes                DISABLED_STATE_SET,
425a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes                CHECKED_STATE_SET,
426a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes                EMPTY_STATE_SET
427a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        }, new int[]{
428a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes                baseColor.getColorForState(DISABLED_STATE_SET, defaultColor),
4290eda28cff720158c50d0b455663b599830f78992Chris Banes                colorPrimary,
430a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes                defaultColor
431a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        });
432a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    }
433a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes
434d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    /**
435a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki     * Listener for handling events on navigation items.
43631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     */
43731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public interface OnNavigationItemSelectedListener {
43831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
43931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        /**
440a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki         * Called when an item in the navigation menu is selected.
44131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki         *
44231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki         * @param item The selected item
443a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes         *
444a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes         * @return true to display the item as the selected item
44531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki         */
44631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        public boolean onNavigationItemSelected(MenuItem item);
44731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
44831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
44901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
450a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki     * User interface state that is stored by NavigationView for implementing
45101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * onSaveInstanceState().
45201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     */
45305f5ba020fa6caa658c75b6d77436aa980ca0fccChris Banes    public static class SavedState extends AbsSavedState {
45401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public Bundle menuState;
45501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
45662ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes        public SavedState(Parcel in, ClassLoader loader) {
45705f5ba020fa6caa658c75b6d77436aa980ca0fccChris Banes            super(in, loader);
45862ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes            menuState = in.readBundle(loader);
45901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
46001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
46101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public SavedState(Parcelable superState) {
46201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            super(superState);
46301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
46401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
46501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        @Override
46601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public void writeToParcel(@NonNull Parcel dest, int flags) {
46701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            super.writeToParcel(dest, flags);
46801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            dest.writeBundle(menuState);
46901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
47001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
47101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public static final Parcelable.Creator<SavedState> CREATOR
47262ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes                = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks<SavedState>() {
47301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            @Override
47462ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes            public SavedState createFromParcel(Parcel parcel, ClassLoader loader) {
47562ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes                return new SavedState(parcel, loader);
47601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            }
47701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
47801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            @Override
47901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            public SavedState[] newArray(int size) {
48001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                return new SavedState[size];
48101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            }
48262ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes        });
48301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
48401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
48531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki}
486