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.internal;
1831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
198e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikasimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
209a2ea21c22dab29fd8f807052f13091036929c48Yuichi Araki
2131a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.content.Context;
22d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.content.res.ColorStateList;
2360abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Arakiimport android.content.res.Resources;
24a63940ca14cd3ad9620e94f709930bb968525c57Chris Banesimport android.graphics.drawable.Drawable;
2590059dad8167895396f244b357dbd2992d66d668Chris Banesimport android.os.Build;
2601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Bundle;
2731a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.os.Parcelable;
287c89489dcb1e7cc454da4375c387caf20201acb7Chris Banesimport android.support.annotation.LayoutRes;
2901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.support.annotation.NonNull;
30d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.support.annotation.Nullable;
31c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo;
32153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banesimport android.support.annotation.StyleRes;
3331a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.design.R;
34e57300cbdb4247da95e95059ad27a348a56477c6Yuichi Arakiimport android.support.v4.view.ViewCompat;
35e57300cbdb4247da95e95059ad27a348a56477c6Yuichi Arakiimport android.support.v4.view.WindowInsetsCompat;
3666698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuBuilder;
3766698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuItemImpl;
3866698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuPresenter;
3966698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuView;
4066698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.SubMenuBuilder;
4164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Arakiimport android.support.v7.widget.RecyclerView;
4201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.util.SparseArray;
4331a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.LayoutInflater;
4401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.view.SubMenu;
4531a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.View;
4631a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.ViewGroup;
477c89489dcb1e7cc454da4375c387caf20201acb7Chris Banesimport android.widget.LinearLayout;
4801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.widget.TextView;
4901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
5001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport java.util.ArrayList;
5131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
5231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki/**
5331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * @hide
5431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */
558e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas@RestrictTo(LIBRARY_GROUP)
5664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Arakipublic class NavigationMenuPresenter implements MenuPresenter {
5731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
5801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    private static final String STATE_HIERARCHY = "android:menu:list";
5976bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki    private static final String STATE_ADAPTER = "android:menu:adapter";
609a2ea21c22dab29fd8f807052f13091036929c48Yuichi Araki    private static final String STATE_HEADER = "android:menu:header";
6101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
6231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    private NavigationMenuView mMenuView;
63657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas    LinearLayout mHeaderLayout;
6431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
6531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    private Callback mCallback;
66657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas    MenuBuilder mMenu;
6731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    private int mId;
6831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
69657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas    NavigationMenuAdapter mAdapter;
70657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas    LayoutInflater mLayoutInflater;
7131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
72657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas    int mTextAppearance;
73657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas    boolean mTextAppearanceSet;
74657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas    ColorStateList mTextColor;
75657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas    ColorStateList mIconTintList;
76657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas    Drawable mItemBackground;
77d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
7801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
7901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * Padding to be inserted at the top of the list to avoid the first menu item
8001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * from being placed underneath the status bar.
8101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     */
8201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    private int mPaddingTopDefault;
8301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
8460abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki    /**
8560abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki     * Padding for separators between items
8660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki     */
87657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas    int mPaddingSeparator;
8860abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki
8931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
9031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void initForMenu(Context context, MenuBuilder menu) {
9131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        mLayoutInflater = LayoutInflater.from(context);
9231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        mMenu = menu;
9360abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        Resources res = context.getResources();
9460abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        mPaddingSeparator = res.getDimensionPixelOffset(
95a577676a64e5353b8ec927117151aa6be84adf66Chris Banes                R.dimen.design_navigation_separator_vertical_padding);
9631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
9731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
9831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
9931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public MenuView getMenuView(ViewGroup root) {
10031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        if (mMenuView == null) {
10131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            mMenuView = (NavigationMenuView) mLayoutInflater.inflate(
102a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                    R.layout.design_navigation_menu, root, false);
10331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            if (mAdapter == null) {
10431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                mAdapter = new NavigationMenuAdapter();
10531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            }
1067c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes            mHeaderLayout = (LinearLayout) mLayoutInflater
1077c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes                    .inflate(R.layout.design_navigation_item_header,
1087c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes                            mMenuView, false);
10931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            mMenuView.setAdapter(mAdapter);
11031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
11131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return mMenuView;
11231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
11331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
11431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
11531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void updateMenuView(boolean cleared) {
11631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        if (mAdapter != null) {
11764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            mAdapter.update();
11831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
11931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
12031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
12131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
12231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void setCallback(Callback cb) {
12331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        mCallback = cb;
12431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
12531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
12631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
12731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
12831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return false;
12931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
13031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
13131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
13231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
13331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        if (mCallback != null) {
13431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            mCallback.onCloseMenu(menu, allMenusAreClosing);
13531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
13631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
13731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
13831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
13931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public boolean flagActionItems() {
14031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return false;
14131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
14231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
14331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
14431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) {
14531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return false;
14631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
14731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
14831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
14931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) {
15031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return false;
15131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
15231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
15331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
15431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public int getId() {
15531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return mId;
15631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
15731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
15831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void setId(int id) {
15931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        mId = id;
16031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
16131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
16231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
16331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public Parcelable onSaveInstanceState() {
16490059dad8167895396f244b357dbd2992d66d668Chris Banes        if (Build.VERSION.SDK_INT >= 11) {
16590059dad8167895396f244b357dbd2992d66d668Chris Banes            // API 9-10 does not support ClassLoaderCreator, therefore things can crash if they're
16690059dad8167895396f244b357dbd2992d66d668Chris Banes            // loaded via different loaders. Rather than crash we just won't save state on those
16790059dad8167895396f244b357dbd2992d66d668Chris Banes            // platforms
16890059dad8167895396f244b357dbd2992d66d668Chris Banes            final Bundle state = new Bundle();
16990059dad8167895396f244b357dbd2992d66d668Chris Banes            if (mMenuView != null) {
17090059dad8167895396f244b357dbd2992d66d668Chris Banes                SparseArray<Parcelable> hierarchy = new SparseArray<>();
17190059dad8167895396f244b357dbd2992d66d668Chris Banes                mMenuView.saveHierarchyState(hierarchy);
17290059dad8167895396f244b357dbd2992d66d668Chris Banes                state.putSparseParcelableArray(STATE_HIERARCHY, hierarchy);
17390059dad8167895396f244b357dbd2992d66d668Chris Banes            }
17490059dad8167895396f244b357dbd2992d66d668Chris Banes            if (mAdapter != null) {
17590059dad8167895396f244b357dbd2992d66d668Chris Banes                state.putBundle(STATE_ADAPTER, mAdapter.createInstanceState());
17690059dad8167895396f244b357dbd2992d66d668Chris Banes            }
1779a2ea21c22dab29fd8f807052f13091036929c48Yuichi Araki            if (mHeaderLayout != null) {
1789a2ea21c22dab29fd8f807052f13091036929c48Yuichi Araki                SparseArray<Parcelable> header = new SparseArray<>();
1799a2ea21c22dab29fd8f807052f13091036929c48Yuichi Araki                mHeaderLayout.saveHierarchyState(header);
1809a2ea21c22dab29fd8f807052f13091036929c48Yuichi Araki                state.putSparseParcelableArray(STATE_HEADER, header);
1819a2ea21c22dab29fd8f807052f13091036929c48Yuichi Araki            }
18290059dad8167895396f244b357dbd2992d66d668Chris Banes            return state;
18301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
18490059dad8167895396f244b357dbd2992d66d668Chris Banes        return null;
18531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
18631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
18731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
18890059dad8167895396f244b357dbd2992d66d668Chris Banes    public void onRestoreInstanceState(final Parcelable parcelable) {
18990059dad8167895396f244b357dbd2992d66d668Chris Banes        if (parcelable instanceof Bundle) {
19090059dad8167895396f244b357dbd2992d66d668Chris Banes            Bundle state = (Bundle) parcelable;
19190059dad8167895396f244b357dbd2992d66d668Chris Banes            SparseArray<Parcelable> hierarchy = state.getSparseParcelableArray(STATE_HIERARCHY);
19290059dad8167895396f244b357dbd2992d66d668Chris Banes            if (hierarchy != null) {
19390059dad8167895396f244b357dbd2992d66d668Chris Banes                mMenuView.restoreHierarchyState(hierarchy);
19490059dad8167895396f244b357dbd2992d66d668Chris Banes            }
19590059dad8167895396f244b357dbd2992d66d668Chris Banes            Bundle adapterState = state.getBundle(STATE_ADAPTER);
19690059dad8167895396f244b357dbd2992d66d668Chris Banes            if (adapterState != null) {
19790059dad8167895396f244b357dbd2992d66d668Chris Banes                mAdapter.restoreInstanceState(adapterState);
19890059dad8167895396f244b357dbd2992d66d668Chris Banes            }
1999a2ea21c22dab29fd8f807052f13091036929c48Yuichi Araki            SparseArray<Parcelable> header = state.getSparseParcelableArray(STATE_HEADER);
2009a2ea21c22dab29fd8f807052f13091036929c48Yuichi Araki            if (header != null) {
2019a2ea21c22dab29fd8f807052f13091036929c48Yuichi Araki                mHeaderLayout.restoreHierarchyState(header);
2029a2ea21c22dab29fd8f807052f13091036929c48Yuichi Araki            }
20376bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki        }
20431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
20531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
206f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki    public void setCheckedItem(MenuItemImpl item) {
207f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki        mAdapter.setCheckedItem(item);
208f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki    }
209f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki
2107c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes    public View inflateHeaderView(@LayoutRes int res) {
2117c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        View view = mLayoutInflater.inflate(res, mHeaderLayout, false);
2127c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        addHeaderView(view);
2137c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        return view;
2147c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes    }
2157c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes
21601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public void addHeaderView(@NonNull View view) {
2177c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        mHeaderLayout.addView(view);
2187c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        // The padding on top should be cleared.
21960abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        mMenuView.setPadding(0, 0, 0, mMenuView.getPaddingBottom());
22001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
22101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
2227c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes    public void removeHeaderView(@NonNull View view) {
2237c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        mHeaderLayout.removeView(view);
2247c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        if (mHeaderLayout.getChildCount() == 0) {
22572fa50f289d462aae5038e8dd78e134a0fffcf12Yuichi Araki            mMenuView.setPadding(0, mPaddingTopDefault, 0, mMenuView.getPaddingBottom());
22601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
22731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
22831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
229cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki    public int getHeaderCount() {
230cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki        return mHeaderLayout.getChildCount();
231cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki    }
232cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki
233cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki    public View getHeaderView(int index) {
234cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki        return mHeaderLayout.getChildAt(index);
235cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki    }
236cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki
237d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    @Nullable
238d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    public ColorStateList getItemTintList() {
239a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        return mIconTintList;
240d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
241d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
242a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    public void setItemIconTintList(@Nullable ColorStateList tint) {
243a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        mIconTintList = tint;
244153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        updateMenuView(false);
245d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
246d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
247a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    @Nullable
248a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    public ColorStateList getItemTextColor() {
249a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        return mTextColor;
250a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    }
251a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes
252a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    public void setItemTextColor(@Nullable ColorStateList textColor) {
253a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        mTextColor = textColor;
254153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        updateMenuView(false);
255153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes    }
256153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes
257153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes    public void setItemTextAppearance(@StyleRes int resId) {
258153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        mTextAppearance = resId;
259153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        mTextAppearanceSet = true;
260153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes        updateMenuView(false);
261a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    }
262a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes
2638ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov    @Nullable
264a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes    public Drawable getItemBackground() {
265a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        return mItemBackground;
266d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
267d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
2688ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov    public void setItemBackground(@Nullable Drawable itemBackground) {
269a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes        mItemBackground = itemBackground;
2708ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov        updateMenuView(false);
271d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
272d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
273cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki    public void setUpdateSuspended(boolean updateSuspended) {
274cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki        if (mAdapter != null) {
275cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki            mAdapter.setUpdateSuspended(updateSuspended);
276cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki        }
277cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki    }
278cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki
279e57300cbdb4247da95e95059ad27a348a56477c6Yuichi Araki    public void dispatchApplyWindowInsets(WindowInsetsCompat insets) {
280e57300cbdb4247da95e95059ad27a348a56477c6Yuichi Araki        int top = insets.getSystemWindowInsetTop();
281e57300cbdb4247da95e95059ad27a348a56477c6Yuichi Araki        if (mPaddingTopDefault != top) {
282e57300cbdb4247da95e95059ad27a348a56477c6Yuichi Araki            mPaddingTopDefault = top;
28330d42dc19655e637644adc3846025027240bf0afYuichi Araki            if (mHeaderLayout.getChildCount() == 0) {
28430d42dc19655e637644adc3846025027240bf0afYuichi Araki                mMenuView.setPadding(0, mPaddingTopDefault, 0, mMenuView.getPaddingBottom());
28530d42dc19655e637644adc3846025027240bf0afYuichi Araki            }
28630d42dc19655e637644adc3846025027240bf0afYuichi Araki        }
287e57300cbdb4247da95e95059ad27a348a56477c6Yuichi Araki        ViewCompat.dispatchApplyWindowInsets(mHeaderLayout, insets);
28830d42dc19655e637644adc3846025027240bf0afYuichi Araki    }
28930d42dc19655e637644adc3846025027240bf0afYuichi Araki
29064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    private abstract static class ViewHolder extends RecyclerView.ViewHolder {
29164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
29264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public ViewHolder(View itemView) {
29364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            super(itemView);
29464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        }
29564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
29664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    }
29764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
29864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    private static class NormalViewHolder extends ViewHolder {
29964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
30064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public NormalViewHolder(LayoutInflater inflater, ViewGroup parent,
30164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                View.OnClickListener listener) {
30264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            super(inflater.inflate(R.layout.design_navigation_item, parent, false));
30364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            itemView.setOnClickListener(listener);
30464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        }
30564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
30664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    }
30764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
30864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    private static class SubheaderViewHolder extends ViewHolder {
30964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
31064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public SubheaderViewHolder(LayoutInflater inflater, ViewGroup parent) {
31164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            super(inflater.inflate(R.layout.design_navigation_item_subheader, parent, false));
31264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        }
31364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
31464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    }
31564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
31664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    private static class SeparatorViewHolder extends ViewHolder {
31764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
31864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public SeparatorViewHolder(LayoutInflater inflater, ViewGroup parent) {
31964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            super(inflater.inflate(R.layout.design_navigation_item_separator, parent, false));
32064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        }
32164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
32264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    }
32364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
3247c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes    private static class HeaderViewHolder extends ViewHolder {
3257c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes
3267c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        public HeaderViewHolder(View itemView) {
3277c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes            super(itemView);
3287c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        }
3297c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes
3307c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes    }
3317c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes
33264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    /**
33364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki     * Handles click events for the menu items. The items has to be {@link NavigationMenuItemView}.
33464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki     */
335657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas    final View.OnClickListener mOnClickListener = new View.OnClickListener() {
33664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
33764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        @Override
33864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public void onClick(View v) {
33964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            NavigationMenuItemView itemView = (NavigationMenuItemView) v;
34064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            setUpdateSuspended(true);
34164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            MenuItemImpl item = itemView.getItemData();
34264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            boolean result = mMenu.performItemAction(item, NavigationMenuPresenter.this, 0);
34364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            if (item != null && item.isCheckable() && result) {
34464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                mAdapter.setCheckedItem(item);
34564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            }
34664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            setUpdateSuspended(false);
34764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            updateMenuView(false);
34864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        }
34964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
35064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    };
35164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
35264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    private class NavigationMenuAdapter extends RecyclerView.Adapter<ViewHolder> {
35376bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki
354f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki        private static final String STATE_CHECKED_ITEM = "android:menu:checked";
35576bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki
35636d347c02fa8da71ccd69634484be8156fa0085bYuichi Araki        private static final String STATE_ACTION_VIEWS = "android:menu:action_views";
35701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        private static final int VIEW_TYPE_NORMAL = 0;
35801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        private static final int VIEW_TYPE_SUBHEADER = 1;
35901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        private static final int VIEW_TYPE_SEPARATOR = 2;
3607c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        private static final int VIEW_TYPE_HEADER = 3;
36101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
3623a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        private final ArrayList<NavigationMenuItem> mItems = new ArrayList<>();
363f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki        private MenuItemImpl mCheckedItem;
36476bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki        private boolean mUpdateSuspended;
3653a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
3663a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        NavigationMenuAdapter() {
3673a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            prepareMenuItems();
3683a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
3693a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
37031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        @Override
37131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        public long getItemId(int position) {
37231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            return position;
37331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
37431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
37531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        @Override
37664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public int getItemCount() {
37764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            return mItems.size();
37801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
37901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
38001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        @Override
38101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public int getItemViewType(int position) {
38264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            NavigationMenuItem item = mItems.get(position);
38364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            if (item instanceof NavigationMenuSeparatorItem) {
38401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                return VIEW_TYPE_SEPARATOR;
3857c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes            } else if (item instanceof NavigationMenuHeaderItem) {
3867c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes                return VIEW_TYPE_HEADER;
38764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            } else if (item instanceof NavigationMenuTextItem) {
38864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                NavigationMenuTextItem textItem = (NavigationMenuTextItem) item;
38964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                if (textItem.getMenuItem().hasSubMenu()) {
39064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    return VIEW_TYPE_SUBHEADER;
39164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                } else {
39264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    return VIEW_TYPE_NORMAL;
39364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                }
39401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            }
39564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            throw new RuntimeException("Unknown item type.");
39601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
39701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
39801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        @Override
39964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
40001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            switch (viewType) {
40101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                case VIEW_TYPE_NORMAL:
40264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    return new NormalViewHolder(mLayoutInflater, parent, mOnClickListener);
40364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                case VIEW_TYPE_SUBHEADER:
40464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    return new SubheaderViewHolder(mLayoutInflater, parent);
40564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                case VIEW_TYPE_SEPARATOR:
40664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    return new SeparatorViewHolder(mLayoutInflater, parent);
4077c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes                case VIEW_TYPE_HEADER:
4087c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes                    return new HeaderViewHolder(mHeaderLayout);
40964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            }
41064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            return null;
41164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        }
41264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
41364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        @Override
41464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public void onBindViewHolder(ViewHolder holder, int position) {
41564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            switch (getItemViewType(position)) {
41664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                case VIEW_TYPE_NORMAL: {
41764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    NavigationMenuItemView itemView = (NavigationMenuItemView) holder.itemView;
418a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes                    itemView.setIconTintList(mIconTintList);
419153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes                    if (mTextAppearanceSet) {
4207b75d53b8e5584895595f801256a3d63bb68148aAurimas Liutikas                        itemView.setTextAppearance(mTextAppearance);
421153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes                    }
422153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes                    if (mTextColor != null) {
423153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes                        itemView.setTextColor(mTextColor);
424153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes                    }
42547082c30c630c34829439a9eecd1cf7e8d255a86Aurimas Liutikas                    ViewCompat.setBackground(itemView, mItemBackground != null ?
4261a542ba7235ec038f7ec1ac0ed65f35d29f5c952Yuichi Araki                            mItemBackground.getConstantState().newDrawable() : null);
42764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    NavigationMenuTextItem item = (NavigationMenuTextItem) mItems.get(position);
428f3865fbd67715b07d43da357dea742edf3bf9913Yuichi Araki                    itemView.setNeedsEmptyIcon(item.needsEmptyIcon);
42901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    itemView.initialize(item.getMenuItem(), 0);
43001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    break;
43164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                }
43264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                case VIEW_TYPE_SUBHEADER: {
43364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    TextView subHeader = (TextView) holder.itemView;
43464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    NavigationMenuTextItem item = (NavigationMenuTextItem) mItems.get(position);
43501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    subHeader.setText(item.getMenuItem().getTitle());
43601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    break;
43764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                }
43864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                case VIEW_TYPE_SEPARATOR: {
43964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    NavigationMenuSeparatorItem item =
44064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                            (NavigationMenuSeparatorItem) mItems.get(position);
44164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    holder.itemView.setPadding(0, item.getPaddingTop(), 0,
44260abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki                            item.getPaddingBottom());
44301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    break;
44464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                }
4457c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes                case VIEW_TYPE_HEADER: {
4467c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes                    break;
4477c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes                }
44831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            }
44901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
45001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
45101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
45201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        @Override
45364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public void onViewRecycled(ViewHolder holder) {
45464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            if (holder instanceof NormalViewHolder) {
45564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                ((NavigationMenuItemView) holder.itemView).recycle();
45664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            }
45701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
45801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
45964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public void update() {
4603a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            prepareMenuItems();
46164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            notifyDataSetChanged();
4623a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
4633a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
4643a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        /**
4653a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes         * Flattens the visible menu items of {@link #mMenu} into {@link #mItems},
4663a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes         * while inserting separators between items when necessary.
4673a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes         */
4683a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        private void prepareMenuItems() {
46976bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki            if (mUpdateSuspended) {
47076bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki                return;
47176bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki            }
47242db3143bed767c8e826e69f214672be358078ebYuichi Araki            mUpdateSuspended = true;
4733a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            mItems.clear();
4747c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes            mItems.add(new NavigationMenuHeaderItem());
47564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
4763a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            int currentGroupId = -1;
4773a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            int currentGroupStart = 0;
4783a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            boolean currentGroupHasIcon = false;
4793a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            for (int i = 0, totalSize = mMenu.getVisibleItems().size(); i < totalSize; i++) {
4803a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                MenuItemImpl item = mMenu.getVisibleItems().get(i);
481f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                if (item.isChecked()) {
482f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                    setCheckedItem(item);
483f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                }
484f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                if (item.isCheckable()) {
485f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                    item.setExclusiveCheckable(false);
486f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                }
4873a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                if (item.hasSubMenu()) {
4883a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    SubMenu subMenu = item.getSubMenu();
4893a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    if (subMenu.hasVisibleItems()) {
4903a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        if (i != 0) {
49164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                            mItems.add(new NavigationMenuSeparatorItem(mPaddingSeparator, 0));
4923a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        }
49364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                        mItems.add(new NavigationMenuTextItem(item));
4943a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        boolean subMenuHasIcon = false;
4953a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        int subMenuStart = mItems.size();
4963a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        for (int j = 0, size = subMenu.size(); j < size; j++) {
497f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                            MenuItemImpl subMenuItem = (MenuItemImpl) subMenu.getItem(j);
4983a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                            if (subMenuItem.isVisible()) {
4993a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                                if (!subMenuHasIcon && subMenuItem.getIcon() != null) {
5003a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                                    subMenuHasIcon = true;
5013a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                                }
502f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                                if (subMenuItem.isCheckable()) {
503f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                                    subMenuItem.setExclusiveCheckable(false);
504f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                                }
505f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                                if (item.isChecked()) {
506f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                                    setCheckedItem(item);
507f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                                }
50864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                                mItems.add(new NavigationMenuTextItem(subMenuItem));
5093a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                            }
5103a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        }
5113a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        if (subMenuHasIcon) {
5123a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                            appendTransparentIconIfMissing(subMenuStart, mItems.size());
5133a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        }
5143a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    }
5153a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                } else {
5163a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    int groupId = item.getGroupId();
5173a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    if (groupId != currentGroupId) { // first item in group
5183a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        currentGroupStart = mItems.size();
5193a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        currentGroupHasIcon = item.getIcon() != null;
5203a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        if (i != 0) {
5213a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                            currentGroupStart++;
52264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                            mItems.add(new NavigationMenuSeparatorItem(
52360abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki                                    mPaddingSeparator, mPaddingSeparator));
5243a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        }
5253a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    } else if (!currentGroupHasIcon && item.getIcon() != null) {
5263a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        currentGroupHasIcon = true;
5273a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        appendTransparentIconIfMissing(currentGroupStart, mItems.size());
5283a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    }
529f3865fbd67715b07d43da357dea742edf3bf9913Yuichi Araki                    NavigationMenuTextItem textItem = new NavigationMenuTextItem(item);
530f3865fbd67715b07d43da357dea742edf3bf9913Yuichi Araki                    textItem.needsEmptyIcon = currentGroupHasIcon;
531f3865fbd67715b07d43da357dea742edf3bf9913Yuichi Araki                    mItems.add(textItem);
5323a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    currentGroupId = groupId;
5333a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                }
5343a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            }
53542db3143bed767c8e826e69f214672be358078ebYuichi Araki            mUpdateSuspended = false;
5363a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
5373a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
5383a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        private void appendTransparentIconIfMissing(int startIndex, int endIndex) {
5393a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            for (int i = startIndex; i < endIndex; i++) {
54064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                NavigationMenuTextItem textItem = (NavigationMenuTextItem) mItems.get(i);
541f3865fbd67715b07d43da357dea742edf3bf9913Yuichi Araki                textItem.needsEmptyIcon = true;
5423a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            }
5433a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
54476bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki
545f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki        public void setCheckedItem(MenuItemImpl checkedItem) {
546f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki            if (mCheckedItem == checkedItem || !checkedItem.isCheckable()) {
547f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                return;
548f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki            }
549f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki            if (mCheckedItem != null) {
550f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki                mCheckedItem.setChecked(false);
551f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki            }
552f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki            mCheckedItem = checkedItem;
553f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki            checkedItem.setChecked(true);
554f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki        }
555f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki
55676bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki        public Bundle createInstanceState() {
55776bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki            Bundle state = new Bundle();
558024b36390fce843107b0916f0c3468e5a67a212aYuichi Araki            if (mCheckedItem != null) {
559024b36390fce843107b0916f0c3468e5a67a212aYuichi Araki                state.putInt(STATE_CHECKED_ITEM, mCheckedItem.getItemId());
560024b36390fce843107b0916f0c3468e5a67a212aYuichi Araki            }
56136d347c02fa8da71ccd69634484be8156fa0085bYuichi Araki            // Store the states of the action views.
56236d347c02fa8da71ccd69634484be8156fa0085bYuichi Araki            SparseArray<ParcelableSparseArray> actionViewStates = new SparseArray<>();
56324e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki            for (int i = 0, size = mItems.size(); i < size; i++) {
56424e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                NavigationMenuItem navigationMenuItem = mItems.get(i);
56564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                if (navigationMenuItem instanceof NavigationMenuTextItem) {
56664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    MenuItemImpl item = ((NavigationMenuTextItem) navigationMenuItem).getMenuItem();
56764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    View actionView = item != null ? item.getActionView() : null;
56864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    if (actionView != null) {
56964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                        ParcelableSparseArray container = new ParcelableSparseArray();
57064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                        actionView.saveHierarchyState(container);
57164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                        actionViewStates.put(item.getItemId(), container);
57264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    }
57336d347c02fa8da71ccd69634484be8156fa0085bYuichi Araki                }
57436d347c02fa8da71ccd69634484be8156fa0085bYuichi Araki            }
57536d347c02fa8da71ccd69634484be8156fa0085bYuichi Araki            state.putSparseParcelableArray(STATE_ACTION_VIEWS, actionViewStates);
57676bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki            return state;
57776bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki        }
57876bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki
57976bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki        public void restoreInstanceState(Bundle state) {
580f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki            int checkedItem = state.getInt(STATE_CHECKED_ITEM, 0);
581f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki            if (checkedItem != 0) {
58276bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki                mUpdateSuspended = true;
58324e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                for (int i = 0, size = mItems.size(); i < size; i++) {
58424e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    NavigationMenuItem item = mItems.get(i);
58564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    if (item instanceof NavigationMenuTextItem) {
58664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                        MenuItemImpl menuItem = ((NavigationMenuTextItem) item).getMenuItem();
58764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                        if (menuItem != null && menuItem.getItemId() == checkedItem) {
58864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                            setCheckedItem(menuItem);
58964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                            break;
59064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                        }
59176bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki                    }
59276bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki                }
59376bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki                mUpdateSuspended = false;
59476bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki                prepareMenuItems();
59576bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki            }
59636d347c02fa8da71ccd69634484be8156fa0085bYuichi Araki            // Restore the states of the action views.
59736d347c02fa8da71ccd69634484be8156fa0085bYuichi Araki            SparseArray<ParcelableSparseArray> actionViewStates = state
59836d347c02fa8da71ccd69634484be8156fa0085bYuichi Araki                    .getSparseParcelableArray(STATE_ACTION_VIEWS);
59924e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki            if (actionViewStates != null) {
60024e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                for (int i = 0, size = mItems.size(); i < size; i++) {
60124e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    NavigationMenuItem navigationMenuItem = mItems.get(i);
60224e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    if (!(navigationMenuItem instanceof NavigationMenuTextItem)) {
60324e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                        continue;
60424e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    }
60564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    MenuItemImpl item = ((NavigationMenuTextItem) navigationMenuItem).getMenuItem();
60624e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    if (item == null) {
60724e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                        continue;
60824e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    }
60924e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    View actionView = item.getActionView();
61024e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    if (actionView == null) {
61124e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                        continue;
61224e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    }
61324e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    ParcelableSparseArray container = actionViewStates.get(item.getItemId());
61424e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    if (container == null) {
61524e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                        continue;
61664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki                    }
61724e362dd19caffb820011c08125c1a301ba819f8Yuichi Araki                    actionView.restoreHierarchyState(container);
61836d347c02fa8da71ccd69634484be8156fa0085bYuichi Araki                }
61936d347c02fa8da71ccd69634484be8156fa0085bYuichi Araki            }
62076bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki        }
62176bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki
622cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki        public void setUpdateSuspended(boolean updateSuspended) {
623cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki            mUpdateSuspended = updateSuspended;
624cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki        }
625cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki
62601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
62701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
62801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
62964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki     * Unified data model for all sorts of navigation menu items.
630e7b2c26d2ffadc94dc6ee043ab12e03201e1bf95Yuichi Araki     */
63164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    private interface NavigationMenuItem {
63264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    }
63360abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki
63464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    /**
63564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki     * Normal or subheader items.
63664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki     */
63764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    private static class NavigationMenuTextItem implements NavigationMenuItem {
638e7b2c26d2ffadc94dc6ee043ab12e03201e1bf95Yuichi Araki
63964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        private final MenuItemImpl mMenuItem;
640e7b2c26d2ffadc94dc6ee043ab12e03201e1bf95Yuichi Araki
641f3865fbd67715b07d43da357dea742edf3bf9913Yuichi Araki        boolean needsEmptyIcon;
642f3865fbd67715b07d43da357dea742edf3bf9913Yuichi Araki
643657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas        NavigationMenuTextItem(MenuItemImpl item) {
644ca2f07c9cc83b98d73a18da7177044ee147ffb94Chris Banes            mMenuItem = item;
64560abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        }
64660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki
64764bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public MenuItemImpl getMenuItem() {
64864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            return mMenuItem;
649ca2f07c9cc83b98d73a18da7177044ee147ffb94Chris Banes        }
650ca2f07c9cc83b98d73a18da7177044ee147ffb94Chris Banes
65164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    }
65264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
65364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    /**
65464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki     * Separator items.
65564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki     */
65664bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    private static class NavigationMenuSeparatorItem implements NavigationMenuItem {
657ca2f07c9cc83b98d73a18da7177044ee147ffb94Chris Banes
65864bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        private final int mPaddingTop;
65964bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
66064bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        private final int mPaddingBottom;
66164bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki
66264bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki        public NavigationMenuSeparatorItem(int paddingTop, int paddingBottom) {
66364bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            mPaddingTop = paddingTop;
66464bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki            mPaddingBottom = paddingBottom;
665ca2f07c9cc83b98d73a18da7177044ee147ffb94Chris Banes        }
666ca2f07c9cc83b98d73a18da7177044ee147ffb94Chris Banes
66760abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        public int getPaddingTop() {
66860abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki            return mPaddingTop;
66960abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        }
67060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki
67160abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        public int getPaddingBottom() {
67260abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki            return mPaddingBottom;
67301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
67401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
67564bcb674cc45ab712a591d4f540d5c13404f3b83Yuichi Araki    }
6767c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes
6777c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes    /**
6787c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes     * Header (not subheader) items.
6797c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes     */
6807c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes    private static class NavigationMenuHeaderItem implements NavigationMenuItem {
681657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas        NavigationMenuHeaderItem() {
682657ea1100fee4750f148f9d0dcb7e7e2028f105eAurimas Liutikas        }
6837c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes        // The actual content is hold by NavigationMenuPresenter#mHeaderLayout.
6847c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes    }
6857c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes
68631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki}
687