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