1e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes/*
2e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * Copyright (C) 2012 The Android Open Source Project
3e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *
4e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * you may not use this file except in compliance with the License.
6e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * You may obtain a copy of the License at
7e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *
8e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *
10e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * Unless required by applicable law or agreed to in writing, software
11e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * See the License for the specific language governing permissions and
14e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * limitations under the License.
15e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes */
16e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
1766698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banespackage android.support.v7.view.menu;
18e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
19d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banesimport android.content.Context;
2030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.support.v4.internal.view.SupportMenuItem;
21d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banesimport android.support.v4.internal.view.SupportSubMenu;
22d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banesimport android.support.v4.util.ArrayMap;
2330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem;
2430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.SubMenu;
25e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
26e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banesimport java.util.Iterator;
27d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banesimport java.util.Map;
28e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
29e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banesabstract class BaseMenuWrapper<T> extends BaseWrapper<T> {
30e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
31d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes    final Context mContext;
32e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
33d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes    private Map<SupportMenuItem, MenuItem> mMenuItems;
34d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes    private Map<SupportSubMenu, SubMenu> mSubMenus;
35e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
36d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes    BaseMenuWrapper(Context context, T object) {
37e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        super(object);
38d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes        mContext = context;
39e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
40e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
41d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes    final MenuItem getMenuItemWrapper(final MenuItem menuItem) {
42d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes        if (menuItem instanceof SupportMenuItem) {
43d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes            final SupportMenuItem supportMenuItem = (SupportMenuItem) menuItem;
44d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes
45d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes            // Instantiate Map if null
46e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            if (mMenuItems == null) {
47d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes                mMenuItems = new ArrayMap<>();
48e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
49e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
50d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes            // First check if we already have a wrapper for this item
51d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes            MenuItem wrappedItem = mMenuItems.get(menuItem);
52e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
53d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes            if (null == wrappedItem) {
54d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes                // ... if not, create one and add it to our map
55d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes                wrappedItem = MenuWrapperFactory.wrapSupportMenuItem(mContext, supportMenuItem);
56d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes                mMenuItems.put(supportMenuItem, wrappedItem);
57e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
58e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
59d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes            return wrappedItem;
60e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
61d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes        return menuItem;
62e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
63e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
64d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes    final SubMenu getSubMenuWrapper(final SubMenu subMenu) {
65d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes        if (subMenu instanceof SupportSubMenu) {
66d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes            final SupportSubMenu supportSubMenu = (SupportSubMenu) subMenu;
67d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes
68d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes            // Instantiate Map if null
69e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            if (mSubMenus == null) {
70d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes                mSubMenus = new ArrayMap<>();
71e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
72e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
73d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes            SubMenu wrappedMenu = mSubMenus.get(supportSubMenu);
74e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
75d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes            if (null == wrappedMenu) {
76d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes                wrappedMenu = MenuWrapperFactory.wrapSupportSubMenu(mContext, supportSubMenu);
77d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes                mSubMenus.put(supportSubMenu, wrappedMenu);
78e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
79d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes            return wrappedMenu;
80e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
81d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes        return subMenu;
82e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
83e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
84e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
85e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    final void internalClear() {
86e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        if (mMenuItems != null) {
87e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            mMenuItems.clear();
88e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
89e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        if (mSubMenus != null) {
90e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            mSubMenus.clear();
91e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
92e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
93e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
94e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    final void internalRemoveGroup(final int groupId) {
95e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        if (mMenuItems == null) {
96e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            return;
97e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
98e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
99d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes        Iterator<SupportMenuItem> iterator = mMenuItems.keySet().iterator();
100e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        android.view.MenuItem menuItem;
101e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
102e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        while (iterator.hasNext()) {
103e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            menuItem = iterator.next();
104e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            if (groupId == menuItem.getGroupId()) {
105e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                iterator.remove();
106e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
107e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
108e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
109e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
110e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    final void internalRemoveItem(final int id) {
111e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        if (mMenuItems == null) {
112e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            return;
113e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
114e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
115d837ef307ff53290159c0d7c8cf9e3e0dc2fa410Chris Banes        Iterator<SupportMenuItem> iterator = mMenuItems.keySet().iterator();
116e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        android.view.MenuItem menuItem;
117e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
118e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        while (iterator.hasNext()) {
119e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            menuItem = iterator.next();
120e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            if (id == menuItem.getItemId()) {
121e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                iterator.remove();
122e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                break;
123e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
124e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
125e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
126e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes}
127