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