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