NavigationMenuPresenter.java revision cc7a09fc0018e348027151daecf581b1d1b78f11
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 1931a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.content.Context; 20d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.content.res.ColorStateList; 2160abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Arakiimport android.content.res.Resources; 228bc6f4dfa590d8cd872a9894804a4c80d01a5d87Yuichi Arakiimport android.graphics.drawable.ColorDrawable; 23a63940ca14cd3ad9620e94f709930bb968525c57Chris Banesimport android.graphics.drawable.Drawable; 2401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Bundle; 2531a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.os.Parcelable; 2601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.support.annotation.LayoutRes; 2701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.support.annotation.NonNull; 28d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.support.annotation.Nullable; 2931a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.design.R; 3031a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.v7.internal.view.menu.MenuBuilder; 3131a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.v7.internal.view.menu.MenuItemImpl; 3231a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.v7.internal.view.menu.MenuPresenter; 3331a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.v7.internal.view.menu.MenuView; 3431a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.v7.internal.view.menu.SubMenuBuilder; 3501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.util.SparseArray; 3631a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.LayoutInflater; 3701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.view.MenuItem; 3801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.view.SubMenu; 3931a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.View; 4031a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.ViewGroup; 4131a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.widget.AdapterView; 4231a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.widget.BaseAdapter; 4372fa50f289d462aae5038e8dd78e134a0fffcf12Yuichi Arakiimport android.widget.LinearLayout; 4401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.widget.TextView; 4501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 4601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport java.util.ArrayList; 4731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 4831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki/** 4931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * @hide 5031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */ 5131a49efe2adb59e31611f6871895a3243d835127Yuichi Arakipublic class NavigationMenuPresenter implements MenuPresenter, AdapterView.OnItemClickListener { 5231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 5301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki private static final String STATE_HIERARCHY = "android:menu:list"; 5476bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki private static final String STATE_ADAPTER = "android:menu:adapter"; 5501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 5631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki private NavigationMenuView mMenuView; 5772fa50f289d462aae5038e8dd78e134a0fffcf12Yuichi Araki private LinearLayout mHeader; 5831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 5931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki private Callback mCallback; 6031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki private MenuBuilder mMenu; 6131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki private int mId; 6231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 6331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki private NavigationMenuAdapter mAdapter; 6431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki private LayoutInflater mLayoutInflater; 6531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 66a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes private ColorStateList mTextColor; 67a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes private ColorStateList mIconTintList; 68a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes private Drawable mItemBackground; 69d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki 7001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki /** 7101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * Padding to be inserted at the top of the list to avoid the first menu item 7201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * from being placed underneath the status bar. 7301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki */ 7401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki private int mPaddingTopDefault; 7501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 7660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki /** 7760abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki * Padding for separators between items 7860abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki */ 7960abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki private int mPaddingSeparator; 8060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki 8131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 8231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public void initForMenu(Context context, MenuBuilder menu) { 8331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki mLayoutInflater = LayoutInflater.from(context); 8431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki mMenu = menu; 8560abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki Resources res = context.getResources(); 8660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki mPaddingTopDefault = res.getDimensionPixelOffset(R.dimen.navigation_padding_top_default); 8760abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki mPaddingSeparator = res.getDimensionPixelOffset( 8860abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki R.dimen.navigation_separator_vertical_padding); 8931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 9031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 9131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 9231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public MenuView getMenuView(ViewGroup root) { 9331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki if (mMenuView == null) { 9431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki mMenuView = (NavigationMenuView) mLayoutInflater.inflate( 95a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki R.layout.design_navigation_menu, root, false); 9631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki if (mAdapter == null) { 9731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki mAdapter = new NavigationMenuAdapter(); 9831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 9972fa50f289d462aae5038e8dd78e134a0fffcf12Yuichi Araki mHeader = (LinearLayout) mLayoutInflater.inflate(R.layout.design_navigation_item_header, 10072fa50f289d462aae5038e8dd78e134a0fffcf12Yuichi Araki mMenuView, false); 10172fa50f289d462aae5038e8dd78e134a0fffcf12Yuichi Araki mMenuView.addHeaderView(mHeader); 10231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki mMenuView.setAdapter(mAdapter); 10331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki mMenuView.setOnItemClickListener(this); 10431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 10531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki return mMenuView; 10631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 10731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 10831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 10931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public void updateMenuView(boolean cleared) { 11031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki if (mAdapter != null) { 11131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki mAdapter.notifyDataSetChanged(); 11231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 11331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 11431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 11531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 11631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public void setCallback(Callback cb) { 11731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki mCallback = cb; 11831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 11931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 12031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 12131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public boolean onSubMenuSelected(SubMenuBuilder subMenu) { 12231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki return false; 12331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 12431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 12531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 12631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { 12731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki if (mCallback != null) { 12831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki mCallback.onCloseMenu(menu, allMenusAreClosing); 12931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 13031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 13131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 13231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 13331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public boolean flagActionItems() { 13431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki return false; 13531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 13631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 13731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 13831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { 13931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki return false; 14031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 14131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 14231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 14331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { 14431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki return false; 14531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 14631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 14731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 14831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public int getId() { 14931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki return mId; 15031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 15131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 15231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public void setId(int id) { 15331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki mId = id; 15431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 15531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 15631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 15731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public Parcelable onSaveInstanceState() { 15801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki Bundle state = new Bundle(); 15901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki if (mMenuView != null) { 16076bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki SparseArray<Parcelable> hierarchy = new SparseArray<>(); 16101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki mMenuView.saveHierarchyState(hierarchy); 16276bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki state.putSparseParcelableArray(STATE_HIERARCHY, hierarchy); 16376bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki } 16476bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki if (mAdapter != null) { 16576bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki state.putBundle(STATE_ADAPTER, mAdapter.createInstanceState()); 16601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 16701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return state; 16831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 16931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 17031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 17101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public void onRestoreInstanceState(Parcelable parcelable) { 17201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki Bundle state = (Bundle) parcelable; 17301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki SparseArray<Parcelable> hierarchy = state.getSparseParcelableArray(STATE_HIERARCHY); 17401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki if (hierarchy != null) { 17501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki mMenuView.restoreHierarchyState(hierarchy); 17601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 17776bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki Bundle adapterState = state.getBundle(STATE_ADAPTER); 17876bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki if (adapterState != null) { 17976bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki mAdapter.restoreInstanceState(adapterState); 18076bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki } 18131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 18231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 18331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 18431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 18501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki int positionInAdapter = position - mMenuView.getHeaderViewsCount(); 18601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki if (positionInAdapter >= 0) { 18701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki mMenu.performItemAction(mAdapter.getItem(positionInAdapter).getMenuItem(), this, 0); 18801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 18901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 19001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 19101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public View inflateHeaderView(@LayoutRes int res) { 19272fa50f289d462aae5038e8dd78e134a0fffcf12Yuichi Araki View view = mLayoutInflater.inflate(res, mHeader, false); 19301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki addHeaderView(view); 19401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return view; 19501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 19601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 19701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public void addHeaderView(@NonNull View view) { 19872fa50f289d462aae5038e8dd78e134a0fffcf12Yuichi Araki mHeader.addView(view); 19901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki // The padding on top should be cleared. 20060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki mMenuView.setPadding(0, 0, 0, mMenuView.getPaddingBottom()); 20101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 20201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 20301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public void removeHeaderView(@NonNull View view) { 20472fa50f289d462aae5038e8dd78e134a0fffcf12Yuichi Araki mHeader.removeView(view); 20572fa50f289d462aae5038e8dd78e134a0fffcf12Yuichi Araki if (mHeader.getChildCount() == 0) { 20672fa50f289d462aae5038e8dd78e134a0fffcf12Yuichi Araki mMenuView.setPadding(0, mPaddingTopDefault, 0, mMenuView.getPaddingBottom()); 20701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 20831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 20931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 210d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki @Nullable 211d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki public ColorStateList getItemTintList() { 212a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes return mIconTintList; 213d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki } 214d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki 215a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes public void setItemIconTintList(@Nullable ColorStateList tint) { 216a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes mIconTintList = tint; 217d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki } 218d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki 219a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes @Nullable 220a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes public ColorStateList getItemTextColor() { 221a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes return mTextColor; 222a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes } 223a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes 224a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes public void setItemTextColor(@Nullable ColorStateList textColor) { 225a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes mTextColor = textColor; 226a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes } 227a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes 228a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes public Drawable getItemBackground() { 229a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes return mItemBackground; 230d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki } 231d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki 232a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes public void setItemBackground(Drawable itemBackground) { 233a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes mItemBackground = itemBackground; 234d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki } 235d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki 236cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki public void setUpdateSuspended(boolean updateSuspended) { 237cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki if (mAdapter != null) { 238cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki mAdapter.setUpdateSuspended(updateSuspended); 239cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki } 240cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki } 241cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki 24231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki private class NavigationMenuAdapter extends BaseAdapter { 24376bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki 24476bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki private static final String STATE_CHECKED_ITEMS = "android:menu:checked"; 24576bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki 24601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki private static final int VIEW_TYPE_NORMAL = 0; 24701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki private static final int VIEW_TYPE_SUBHEADER = 1; 24801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki private static final int VIEW_TYPE_SEPARATOR = 2; 24901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 2503a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes private final ArrayList<NavigationMenuItem> mItems = new ArrayList<>(); 2513a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes private ColorDrawable mTransparentIcon; 25276bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki private boolean mUpdateSuspended; 2533a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 2543a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes NavigationMenuAdapter() { 2553a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes prepareMenuItems(); 2563a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 2573a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 25831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 25931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public int getCount() { 26001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return mItems.size(); 26131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 26231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 26331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 26401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public NavigationMenuItem getItem(int position) { 26501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return mItems.get(position); 26631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 26731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 26831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 26931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public long getItemId(int position) { 27031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki return position; 27131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 27231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 27331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 27401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public int getViewTypeCount() { 27501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return 3; 27601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 27701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 27801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki @Override 27901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public int getItemViewType(int position) { 28001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki NavigationMenuItem item = getItem(position); 28101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki if (item.isSeparator()) { 28201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return VIEW_TYPE_SEPARATOR; 28301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } else if (item.getMenuItem().hasSubMenu()) { 28401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return VIEW_TYPE_SUBHEADER; 28501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } else { 28601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return VIEW_TYPE_NORMAL; 28701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 28801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 28901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 29001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki @Override 29131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public View getView(int position, View convertView, ViewGroup parent) { 29201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki NavigationMenuItem item = getItem(position); 29301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki int viewType = getItemViewType(position); 29401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki switch (viewType) { 29501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki case VIEW_TYPE_NORMAL: 29601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki if (convertView == null) { 297a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki convertView = mLayoutInflater.inflate(R.layout.design_navigation_item, 298a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki parent, false); 29901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 300d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki NavigationMenuItemView itemView = (NavigationMenuItemView) convertView; 301a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes itemView.setIconTintList(mIconTintList); 302a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes itemView.setTextColor(mTextColor); 30344dc3d86d8fa6544d49b2e14f89c9b1f49639dbdChris Banes itemView.setBackgroundDrawable(mItemBackground); 30401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki itemView.initialize(item.getMenuItem(), 0); 30501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki break; 30601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki case VIEW_TYPE_SUBHEADER: 30701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki if (convertView == null) { 308a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki convertView = mLayoutInflater.inflate( 309a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki R.layout.design_navigation_item_subheader, parent, false); 31001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 31101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki TextView subHeader = (TextView) convertView; 31201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki subHeader.setText(item.getMenuItem().getTitle()); 31301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki break; 31401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki case VIEW_TYPE_SEPARATOR: 31501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki if (convertView == null) { 316a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki convertView = mLayoutInflater.inflate( 317a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki R.layout.design_navigation_item_separator, parent, false); 31801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 31960abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki convertView.setPadding(0, item.getPaddingTop(), 0, 32060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki item.getPaddingBottom()); 32101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki break; 32231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 32331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki return convertView; 32431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 32501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 32601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki @Override 32701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public boolean areAllItemsEnabled() { 32801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return false; 32901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 33001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 33101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki @Override 33201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public boolean isEnabled(int position) { 33301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return getItem(position).isEnabled(); 33401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 33501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 3363a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes @Override 3373a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes public void notifyDataSetChanged() { 3383a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes prepareMenuItems(); 3393a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes super.notifyDataSetChanged(); 3403a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3413a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 3423a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes /** 3433a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes * Flattens the visible menu items of {@link #mMenu} into {@link #mItems}, 3443a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes * while inserting separators between items when necessary. 3453a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes */ 3463a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes private void prepareMenuItems() { 34776bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki if (mUpdateSuspended) { 34876bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki return; 34976bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki } 3503a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes mItems.clear(); 3513a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes int currentGroupId = -1; 3523a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes int currentGroupStart = 0; 3533a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes boolean currentGroupHasIcon = false; 3543a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes for (int i = 0, totalSize = mMenu.getVisibleItems().size(); i < totalSize; i++) { 3553a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes MenuItemImpl item = mMenu.getVisibleItems().get(i); 3563a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (item.hasSubMenu()) { 3573a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes SubMenu subMenu = item.getSubMenu(); 3583a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (subMenu.hasVisibleItems()) { 3593a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (i != 0) { 36060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki mItems.add(NavigationMenuItem.separator(mPaddingSeparator, 0)); 3613a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3623a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes mItems.add(NavigationMenuItem.of(item)); 3633a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes boolean subMenuHasIcon = false; 3643a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes int subMenuStart = mItems.size(); 3653a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes for (int j = 0, size = subMenu.size(); j < size; j++) { 3663a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes MenuItem subMenuItem = subMenu.getItem(j); 3673a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (subMenuItem.isVisible()) { 3683a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (!subMenuHasIcon && subMenuItem.getIcon() != null) { 3693a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes subMenuHasIcon = true; 3703a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3713a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes mItems.add(NavigationMenuItem.of((MenuItemImpl) subMenuItem)); 3723a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3733a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3743a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (subMenuHasIcon) { 3753a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes appendTransparentIconIfMissing(subMenuStart, mItems.size()); 3763a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3773a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3783a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } else { 3793a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes int groupId = item.getGroupId(); 3803a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (groupId != currentGroupId) { // first item in group 3813a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes currentGroupStart = mItems.size(); 3823a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes currentGroupHasIcon = item.getIcon() != null; 3833a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (i != 0) { 3843a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes currentGroupStart++; 38560abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki mItems.add(NavigationMenuItem.separator( 38660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki mPaddingSeparator, mPaddingSeparator)); 3873a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3883a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } else if (!currentGroupHasIcon && item.getIcon() != null) { 3893a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes currentGroupHasIcon = true; 3903a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes appendTransparentIconIfMissing(currentGroupStart, mItems.size()); 3913a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3923a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (currentGroupHasIcon && item.getIcon() == null) { 3933a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes item.setIcon(android.R.color.transparent); 3943a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3953a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes mItems.add(NavigationMenuItem.of(item)); 3963a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes currentGroupId = groupId; 3973a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3983a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 3993a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 4003a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 4013a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes private void appendTransparentIconIfMissing(int startIndex, int endIndex) { 4023a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes for (int i = startIndex; i < endIndex; i++) { 4033a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes MenuItem item = mItems.get(i).getMenuItem(); 4043a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (item.getIcon() == null) { 4053a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (mTransparentIcon == null) { 4063a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes mTransparentIcon = new ColorDrawable(android.R.color.transparent); 4073a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 4083a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes item.setIcon(mTransparentIcon); 4093a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 4103a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 4113a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 41276bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki 41376bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki public Bundle createInstanceState() { 41476bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki Bundle state = new Bundle(); 41576bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki ArrayList<Integer> checkedItems = new ArrayList<>(); 41676bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki for (NavigationMenuItem item : mItems) { 41776bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki MenuItemImpl menuItem = item.getMenuItem(); 41876bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki if (menuItem != null && menuItem.isChecked()) { 41976bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki checkedItems.add(menuItem.getItemId()); 42076bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki } 42176bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki } 42276bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki state.putIntegerArrayList(STATE_CHECKED_ITEMS, checkedItems); 42376bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki return state; 42476bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki } 42576bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki 42676bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki public void restoreInstanceState(Bundle state) { 42776bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki ArrayList<Integer> checkedItems = state.getIntegerArrayList(STATE_CHECKED_ITEMS); 42876bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki if (checkedItems != null) { 42976bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki mUpdateSuspended = true; 43076bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki for (NavigationMenuItem item : mItems) { 43176bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki MenuItemImpl menuItem = item.getMenuItem(); 43276bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki if (menuItem != null && checkedItems.contains(menuItem.getItemId())) { 43376bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki menuItem.setChecked(true); 43476bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki } 43576bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki } 43676bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki mUpdateSuspended = false; 43776bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki prepareMenuItems(); 43876bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki } 43976bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki } 44076bd4d2c1173100ab73c4f27dc42dd917c48915fYuichi Araki 441cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki public void setUpdateSuspended(boolean updateSuspended) { 442cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki mUpdateSuspended = updateSuspended; 443cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki } 444cc7a09fc0018e348027151daecf581b1d1b78f11Yuichi Araki 44501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 44601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 44701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki /** 44801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * Wraps {@link MenuItemImpl}. This allows separators to be counted as items in list. 44901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki */ 45001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki private static class NavigationMenuItem { 45101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 45260abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki /** The item; null for separators */ 45301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki private final MenuItemImpl mMenuItem; 45401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 45560abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki /** Padding top; used only for separators */ 45660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki private final int mPaddingTop; 45760abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki 45860abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki /** Padding bottom; used only for separators */ 45960abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki private final int mPaddingBottom; 46060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki 46160abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki private NavigationMenuItem(MenuItemImpl item, int paddingTop, int paddingBottom) { 46201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki mMenuItem = item; 46360abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki mPaddingTop = paddingTop; 46460abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki mPaddingBottom = paddingBottom; 46501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 46601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 46701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public static NavigationMenuItem of(MenuItemImpl item) { 46860abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki return new NavigationMenuItem(item, 0, 0); 46960abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki } 47060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki 47160abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki public static NavigationMenuItem separator(int paddingTop, int paddingBottom) { 47260abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki return new NavigationMenuItem(null, paddingTop, paddingBottom); 47301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 47401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 47501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public boolean isSeparator() { 47660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki return mMenuItem == null; 47760abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki } 47860abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki 47960abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki public int getPaddingTop() { 48060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki return mPaddingTop; 48160abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki } 48260abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki 48360abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki public int getPaddingBottom() { 48460abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki return mPaddingBottom; 48501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 48601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 48701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public MenuItemImpl getMenuItem() { 48801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return mMenuItem; 48901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 49001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 49101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public boolean isEnabled() { 49201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki // Separators and subheaders never respond to click 49301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return mMenuItem != null && !mMenuItem.hasSubMenu() && mMenuItem.isEnabled(); 49401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 49501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 49631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 49731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 49831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki} 499