NavigationMenuPresenter.java revision 60abdeb39630c4c74a4c401e221f0c968caa26f5
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;
2301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Bundle;
2431a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.os.Parcelable;
25d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.support.annotation.DrawableRes;
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;
3560abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Arakiimport android.support.v7.internal.widget.ListViewCompat;
3601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.util.SparseArray;
3731a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.LayoutInflater;
3801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.view.MenuItem;
3901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.view.SubMenu;
4031a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.View;
4131a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.ViewGroup;
4231a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.widget.AdapterView;
4331a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.widget.BaseAdapter;
4460abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Arakiimport android.widget.ListAdapter;
4501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.widget.TextView;
4601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
4701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport java.util.ArrayList;
4831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
4931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki/**
5031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * @hide
5131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */
5231a49efe2adb59e31611f6871895a3243d835127Yuichi Arakipublic class NavigationMenuPresenter implements MenuPresenter, AdapterView.OnItemClickListener {
5331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
5401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    private static final String STATE_HIERARCHY = "android:menu:list";
5501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
5631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    private NavigationMenuView mMenuView;
573a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    private View mSpace;
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
66d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    private ColorStateList mItemTintList;
67d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    private int mItemBackgroundResource;
68d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
6901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
7001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * Padding to be inserted at the top of the list to avoid the first menu item
7101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * from being placed underneath the status bar.
7201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     */
7301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    private int mPaddingTopDefault;
7401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
7560abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki    /**
7660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki     * Padding for separators between items
7760abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki     */
7860abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki    private int mPaddingSeparator;
7960abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki
8031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
8131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void initForMenu(Context context, MenuBuilder menu) {
8231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        mLayoutInflater = LayoutInflater.from(context);
8331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        mMenu = menu;
8460abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        Resources res = context.getResources();
8560abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        mPaddingTopDefault = res.getDimensionPixelOffset(R.dimen.navigation_padding_top_default);
8660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        mPaddingSeparator = res.getDimensionPixelOffset(
8760abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki                R.dimen.navigation_separator_vertical_padding);
8831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
8931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
9031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
9131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public MenuView getMenuView(ViewGroup root) {
9231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        if (mMenuView == null) {
9331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            mMenuView = (NavigationMenuView) mLayoutInflater.inflate(
94a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                    R.layout.design_navigation_menu, root, false);
9531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            if (mAdapter == null) {
9631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                mAdapter = new NavigationMenuAdapter();
9731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            }
9831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            mMenuView.setAdapter(mAdapter);
9931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            mMenuView.setOnItemClickListener(this);
10031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
10131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return mMenuView;
10231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
10331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
10431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
10531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void updateMenuView(boolean cleared) {
10631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        if (mAdapter != null) {
10731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            mAdapter.notifyDataSetChanged();
10831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
10931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
11031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
11131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
11231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void setCallback(Callback cb) {
11331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        mCallback = cb;
11431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
11531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
11631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
11731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
11831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return false;
11931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
12031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
12131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
12231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
12331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        if (mCallback != null) {
12431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            mCallback.onCloseMenu(menu, allMenusAreClosing);
12531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
12631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
12731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
12831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
12931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public boolean flagActionItems() {
13031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return false;
13131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
13231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
13331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
13431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) {
13531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return false;
13631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
13731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
13831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
13931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) {
14031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return false;
14131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
14231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
14331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
14431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public int getId() {
14531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return mId;
14631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
14731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
14831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void setId(int id) {
14931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        mId = id;
15031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
15131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
15231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
15331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public Parcelable onSaveInstanceState() {
15401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        Bundle state = new Bundle();
15501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        SparseArray<Parcelable> hierarchy = new SparseArray<>();
15601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        if (mMenuView != null) {
15701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            mMenuView.saveHierarchyState(hierarchy);
15801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
15901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        state.putSparseParcelableArray(STATE_HIERARCHY, hierarchy);
16001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        return state;
16131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
16231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
16331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
16401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public void onRestoreInstanceState(Parcelable parcelable) {
16501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        Bundle state = (Bundle) parcelable;
16601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        SparseArray<Parcelable> hierarchy = state.getSparseParcelableArray(STATE_HIERARCHY);
16701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        if (hierarchy != null) {
16801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            mMenuView.restoreHierarchyState(hierarchy);
16901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
17031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
17131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
17231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
17331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
17401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        int positionInAdapter = position - mMenuView.getHeaderViewsCount();
17501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        if (positionInAdapter >= 0) {
17601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            mMenu.performItemAction(mAdapter.getItem(positionInAdapter).getMenuItem(), this, 0);
17701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
17801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
17901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
18001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public View inflateHeaderView(@LayoutRes int res) {
18101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        View view = mLayoutInflater.inflate(res, mMenuView, false);
18201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        addHeaderView(view);
18301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        onHeaderAdded();
18401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        return view;
18501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
18601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
18701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public void addHeaderView(@NonNull View view) {
18860abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        ListAdapter adapter = mMenuView.getAdapter();
18960abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        if (adapter != null) {
19060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki            mMenuView.setAdapter(null);
19160abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        }
19201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mMenuView.addHeaderView(view);
19360abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        mMenuView.setAdapter(adapter);
19401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        onHeaderAdded();
19501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
19601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
19701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    private void onHeaderAdded() {
19801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        // If we have just added the first header, we also need to insert a space
19901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        // between the header and the menu items.
20001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        if (mMenuView.getHeaderViewsCount() == 1) {
201a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki            mSpace = mLayoutInflater.inflate(R.layout.design_navigation_item_space, mMenuView,
202a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                    false);
20301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            mMenuView.addHeaderView(mSpace);
20401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
20501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        // The padding on top should be cleared.
20660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        mMenuView.setPadding(0, 0, 0, mMenuView.getPaddingBottom());
20701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
20801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
20901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public void removeHeaderView(@NonNull View view) {
21001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        if (mMenuView.removeHeaderView(view)) {
21101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            // Remove the space if it is the only remained header
21201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            if (mMenuView.getHeaderViewsCount() == 1) {
21301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                mMenuView.removeHeaderView(mSpace);
21460abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki                mMenuView.setPadding(0, mPaddingTopDefault, 0, mMenuView.getPaddingBottom());
21501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            }
21601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
21731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
21831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
219d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    @Nullable
220d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    public ColorStateList getItemTintList() {
221d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki        return mItemTintList;
222d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
223d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
224d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    public void setItemTintList(@Nullable ColorStateList itemTintList) {
225d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki        mItemTintList = itemTintList;
226d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
227d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
228d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    @DrawableRes
229d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    public int getItemBackgroundResource() {
230d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki        return mItemBackgroundResource;
231d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
232d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
233d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    public void setItemBackgroundResource(@DrawableRes int itemBackgroundResource) {
234d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki        mItemBackgroundResource = itemBackgroundResource;
235d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
236d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
23731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    private class NavigationMenuAdapter extends BaseAdapter {
23801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        private static final int VIEW_TYPE_NORMAL = 0;
23901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        private static final int VIEW_TYPE_SUBHEADER = 1;
24001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        private static final int VIEW_TYPE_SEPARATOR = 2;
24101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
2423a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        private final ArrayList<NavigationMenuItem> mItems = new ArrayList<>();
2433a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        private ColorDrawable mTransparentIcon;
2443a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
2453a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        NavigationMenuAdapter() {
2463a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            prepareMenuItems();
2473a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
2483a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
24931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        @Override
25031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        public int getCount() {
25101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            return mItems.size();
25231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
25331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
25431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        @Override
25501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public NavigationMenuItem getItem(int position) {
25601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            return mItems.get(position);
25731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
25831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
25931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        @Override
26031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        public long getItemId(int position) {
26131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            return position;
26231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
26331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
26431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        @Override
26501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public int getViewTypeCount() {
26601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            return 3;
26701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
26801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
26901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        @Override
27001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public int getItemViewType(int position) {
27101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            NavigationMenuItem item = getItem(position);
27201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            if (item.isSeparator()) {
27301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                return VIEW_TYPE_SEPARATOR;
27401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            } else if (item.getMenuItem().hasSubMenu()) {
27501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                return VIEW_TYPE_SUBHEADER;
27601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            } else {
27701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                return VIEW_TYPE_NORMAL;
27801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            }
27901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
28001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
28101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        @Override
28231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        public View getView(int position, View convertView, ViewGroup parent) {
28301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            NavigationMenuItem item = getItem(position);
28401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            int viewType = getItemViewType(position);
28501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            switch (viewType) {
28601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                case VIEW_TYPE_NORMAL:
28701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    if (convertView == null) {
288a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                        convertView = mLayoutInflater.inflate(R.layout.design_navigation_item,
289a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                                parent, false);
29001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    }
291d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki                    NavigationMenuItemView itemView = (NavigationMenuItemView) convertView;
292d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki                    itemView.setTintList(mItemTintList);
293d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki                    itemView.setBackgroundResource(mItemBackgroundResource);
29401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    itemView.initialize(item.getMenuItem(), 0);
29501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    break;
29601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                case VIEW_TYPE_SUBHEADER:
29701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    if (convertView == null) {
298a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                        convertView = mLayoutInflater.inflate(
299a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                                R.layout.design_navigation_item_subheader, parent, false);
30001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    }
30101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    TextView subHeader = (TextView) convertView;
30201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    subHeader.setText(item.getMenuItem().getTitle());
30301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    break;
30401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                case VIEW_TYPE_SEPARATOR:
30501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    if (convertView == null) {
306a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                        convertView = mLayoutInflater.inflate(
307a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                                R.layout.design_navigation_item_separator, parent, false);
30801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    }
30960abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki                    convertView.setPadding(0, item.getPaddingTop(), 0,
31060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki                            item.getPaddingBottom());
31101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                    break;
31231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            }
31331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            return convertView;
31431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
31501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
31601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        @Override
31701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public boolean areAllItemsEnabled() {
31801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            return false;
31901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
32001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
32101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        @Override
32201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public boolean isEnabled(int position) {
32301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            return getItem(position).isEnabled();
32401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
32501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
3263a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        @Override
3273a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        public void notifyDataSetChanged() {
3283a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            prepareMenuItems();
3293a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            super.notifyDataSetChanged();
3303a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
3313a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
3323a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        /**
3333a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes         * Flattens the visible menu items of {@link #mMenu} into {@link #mItems},
3343a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes         * while inserting separators between items when necessary.
3353a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes         */
3363a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        private void prepareMenuItems() {
3373a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            mItems.clear();
3383a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            int currentGroupId = -1;
3393a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            int currentGroupStart = 0;
3403a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            boolean currentGroupHasIcon = false;
3413a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            for (int i = 0, totalSize = mMenu.getVisibleItems().size(); i < totalSize; i++) {
3423a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                MenuItemImpl item = mMenu.getVisibleItems().get(i);
3433a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                if (item.hasSubMenu()) {
3443a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    SubMenu subMenu = item.getSubMenu();
3453a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    if (subMenu.hasVisibleItems()) {
3463a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        if (i != 0) {
34760abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki                            mItems.add(NavigationMenuItem.separator(mPaddingSeparator, 0));
3483a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        }
3493a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        mItems.add(NavigationMenuItem.of(item));
3503a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        boolean subMenuHasIcon = false;
3513a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        int subMenuStart = mItems.size();
3523a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        for (int j = 0, size = subMenu.size(); j < size; j++) {
3533a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                            MenuItem subMenuItem = subMenu.getItem(j);
3543a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                            if (subMenuItem.isVisible()) {
3553a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                                if (!subMenuHasIcon && subMenuItem.getIcon() != null) {
3563a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                                    subMenuHasIcon = true;
3573a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                                }
3583a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                                mItems.add(NavigationMenuItem.of((MenuItemImpl) subMenuItem));
3593a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                            }
3603a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        }
3613a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        if (subMenuHasIcon) {
3623a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                            appendTransparentIconIfMissing(subMenuStart, mItems.size());
3633a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        }
3643a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    }
3653a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                } else {
3663a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    int groupId = item.getGroupId();
3673a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    if (groupId != currentGroupId) { // first item in group
3683a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        currentGroupStart = mItems.size();
3693a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        currentGroupHasIcon = item.getIcon() != null;
3703a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        if (i != 0) {
3713a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                            currentGroupStart++;
37260abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki                            mItems.add(NavigationMenuItem.separator(
37360abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki                                    mPaddingSeparator, mPaddingSeparator));
3743a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        }
3753a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    } else if (!currentGroupHasIcon && item.getIcon() != null) {
3763a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        currentGroupHasIcon = true;
3773a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        appendTransparentIconIfMissing(currentGroupStart, mItems.size());
3783a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    }
3793a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    if (currentGroupHasIcon && item.getIcon() == null) {
3803a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        item.setIcon(android.R.color.transparent);
3813a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    }
3823a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    mItems.add(NavigationMenuItem.of(item));
3833a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    currentGroupId = groupId;
3843a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                }
3853a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            }
3863a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
3873a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
3883a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        private void appendTransparentIconIfMissing(int startIndex, int endIndex) {
3893a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            for (int i = startIndex; i < endIndex; i++) {
3903a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                MenuItem item = mItems.get(i).getMenuItem();
3913a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                if (item.getIcon() == null) {
3923a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    if (mTransparentIcon == null) {
3933a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                        mTransparentIcon = new ColorDrawable(android.R.color.transparent);
3943a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    }
3953a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    item.setIcon(mTransparentIcon);
3963a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                }
3973a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            }
3983a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
39901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
40001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
40101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
40201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * Wraps {@link MenuItemImpl}. This allows separators to be counted as items in list.
40301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     */
40401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    private static class NavigationMenuItem {
40501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
40660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        /** The item; null for separators */
40701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        private final MenuItemImpl mMenuItem;
40801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
40960abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        /** Padding top; used only for separators */
41060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        private final int mPaddingTop;
41160abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki
41260abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        /** Padding bottom; used only for separators */
41360abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        private final int mPaddingBottom;
41460abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki
41560abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        private NavigationMenuItem(MenuItemImpl item, int paddingTop, int paddingBottom) {
41601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            mMenuItem = item;
41760abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki            mPaddingTop = paddingTop;
41860abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki            mPaddingBottom = paddingBottom;
41901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
42001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
42101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public static NavigationMenuItem of(MenuItemImpl item) {
42260abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki            return new NavigationMenuItem(item, 0, 0);
42360abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        }
42460abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki
42560abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        public static NavigationMenuItem separator(int paddingTop, int paddingBottom) {
42660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki            return new NavigationMenuItem(null, paddingTop, paddingBottom);
42701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
42801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
42901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public boolean isSeparator() {
43060abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki            return mMenuItem == null;
43160abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        }
43260abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki
43360abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        public int getPaddingTop() {
43460abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki            return mPaddingTop;
43560abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        }
43660abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki
43760abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki        public int getPaddingBottom() {
43860abdeb39630c4c74a4c401e221f0c968caa26f5Yuichi Araki            return mPaddingBottom;
43901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
44001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
44101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public MenuItemImpl getMenuItem() {
44201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            return mMenuItem;
44301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
44401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
44501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public boolean isEnabled() {
44601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            // Separators and subheaders never respond to click
44701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            return mMenuItem != null && !mMenuItem.hasSubMenu() && mMenuItem.isEnabled();
44801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
44901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
45031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
45131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
45231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki}
453