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 17da10fdd1400ecfd8d7f2e55651dd528d0614dfc5Jeff Brownpackage android.support.v7.internal.view.menu; 18e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes 1989208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.content.Intent; 2089208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.graphics.drawable.Drawable; 21d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banesimport android.support.v4.internal.view.SupportMenuItem; 22d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banesimport android.support.v4.view.ActionProvider; 2389208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.support.v4.view.MenuItemCompat; 242e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banesimport android.support.v7.view.CollapsibleActionView; 25592df2e7552ba6902c9750ab8453850fc9e30334Chris Banesimport android.util.Log; 2689208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.view.ContextMenu; 2730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powellimport android.view.MenuItem; 2889208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.view.SubMenu; 29d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banesimport android.view.View; 302e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banesimport android.widget.FrameLayout; 31e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes 32592df2e7552ba6902c9750ab8453850fc9e30334Chris Banesimport java.lang.reflect.Method; 33592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes 34592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes/** 35592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes * @hide 36592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes */ 37592df2e7552ba6902c9750ab8453850fc9e30334Chris Banespublic class MenuItemWrapperICS extends BaseMenuWrapper<android.view.MenuItem> implements SupportMenuItem { 38592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes static final String LOG_TAG = "MenuItemWrapper"; 39592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes 40a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes private final boolean mEmulateProviderVisibilityOverride; 41a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes // Tracks the last requested visibility 42a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes private boolean mLastRequestVisible; 43a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes 44592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes // Reflection Method to call setExclusiveCheckable 45592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes private Method mSetExclusiveCheckableMethod; 46592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes 47a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes MenuItemWrapperICS(android.view.MenuItem object, boolean emulateProviderVisibilityOverride) { 48e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes super(object); 49a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes mLastRequestVisible = object.isVisible(); 50a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes mEmulateProviderVisibilityOverride = emulateProviderVisibilityOverride; 51a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 52a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes 53a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes MenuItemWrapperICS(android.view.MenuItem object) { 54a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes this(object, true); 55a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 56a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes 57a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes @Override 5889208232f3b5d1451408d787872504a190bc7ee0Chris Banes public int getItemId() { 5989208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.getItemId(); 6089208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 6189208232f3b5d1451408d787872504a190bc7ee0Chris Banes 6289208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 6389208232f3b5d1451408d787872504a190bc7ee0Chris Banes public int getGroupId() { 6489208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.getGroupId(); 6589208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 6689208232f3b5d1451408d787872504a190bc7ee0Chris Banes 6789208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 6889208232f3b5d1451408d787872504a190bc7ee0Chris Banes public int getOrder() { 6989208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.getOrder(); 7089208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 7189208232f3b5d1451408d787872504a190bc7ee0Chris Banes 7289208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 7389208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setTitle(CharSequence title) { 7489208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setTitle(title); 7589208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 7689208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 7789208232f3b5d1451408d787872504a190bc7ee0Chris Banes 7889208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 7989208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setTitle(int title) { 8089208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setTitle(title); 8189208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 8289208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 8389208232f3b5d1451408d787872504a190bc7ee0Chris Banes 8489208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 8589208232f3b5d1451408d787872504a190bc7ee0Chris Banes public CharSequence getTitle() { 8689208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.getTitle(); 8789208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 8889208232f3b5d1451408d787872504a190bc7ee0Chris Banes 8989208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 9089208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setTitleCondensed(CharSequence title) { 9189208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setTitleCondensed(title); 9289208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 9389208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 9489208232f3b5d1451408d787872504a190bc7ee0Chris Banes 9589208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 9689208232f3b5d1451408d787872504a190bc7ee0Chris Banes public CharSequence getTitleCondensed() { 9789208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.getTitleCondensed(); 9889208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 9989208232f3b5d1451408d787872504a190bc7ee0Chris Banes 10089208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 10189208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setIcon(Drawable icon) { 10289208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setIcon(icon); 10389208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 10489208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 10589208232f3b5d1451408d787872504a190bc7ee0Chris Banes 10689208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 10789208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setIcon(int iconRes) { 10889208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setIcon(iconRes); 10989208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 11089208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 11189208232f3b5d1451408d787872504a190bc7ee0Chris Banes 11289208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 11389208232f3b5d1451408d787872504a190bc7ee0Chris Banes public Drawable getIcon() { 11489208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.getIcon(); 11589208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 11689208232f3b5d1451408d787872504a190bc7ee0Chris Banes 11789208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 11889208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setIntent(Intent intent) { 11989208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setIntent(intent); 12089208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 12189208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 12289208232f3b5d1451408d787872504a190bc7ee0Chris Banes 12389208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 12489208232f3b5d1451408d787872504a190bc7ee0Chris Banes public Intent getIntent() { 12589208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.getIntent(); 12689208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 12789208232f3b5d1451408d787872504a190bc7ee0Chris Banes 12889208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 12989208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setShortcut(char numericChar, char alphaChar) { 13089208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setShortcut(numericChar, alphaChar); 13189208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 13289208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 13389208232f3b5d1451408d787872504a190bc7ee0Chris Banes 13489208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 13589208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setNumericShortcut(char numericChar) { 13689208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setNumericShortcut(numericChar); 13789208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 13889208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 13989208232f3b5d1451408d787872504a190bc7ee0Chris Banes 14089208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 14189208232f3b5d1451408d787872504a190bc7ee0Chris Banes public char getNumericShortcut() { 14289208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.getNumericShortcut(); 14389208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 14489208232f3b5d1451408d787872504a190bc7ee0Chris Banes 14589208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 14689208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setAlphabeticShortcut(char alphaChar) { 14789208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setAlphabeticShortcut(alphaChar); 14889208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 14989208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 15089208232f3b5d1451408d787872504a190bc7ee0Chris Banes 15189208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 15289208232f3b5d1451408d787872504a190bc7ee0Chris Banes public char getAlphabeticShortcut() { 15389208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.getAlphabeticShortcut(); 15489208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 15589208232f3b5d1451408d787872504a190bc7ee0Chris Banes 15689208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 15789208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setCheckable(boolean checkable) { 15889208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setCheckable(checkable); 15989208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 16089208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 16189208232f3b5d1451408d787872504a190bc7ee0Chris Banes 16289208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 16389208232f3b5d1451408d787872504a190bc7ee0Chris Banes public boolean isCheckable() { 16489208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.isCheckable(); 16589208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 16689208232f3b5d1451408d787872504a190bc7ee0Chris Banes 16789208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 16889208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setChecked(boolean checked) { 16989208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setChecked(checked); 17089208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 17189208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 17289208232f3b5d1451408d787872504a190bc7ee0Chris Banes 17389208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 17489208232f3b5d1451408d787872504a190bc7ee0Chris Banes public boolean isChecked() { 17589208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.isChecked(); 17689208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 17789208232f3b5d1451408d787872504a190bc7ee0Chris Banes 17889208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 179a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes public MenuItem setVisible(boolean visible) { 180a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes if (mEmulateProviderVisibilityOverride) { 181a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes mLastRequestVisible = visible; 182a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes // If we need to be visible, we need to check whether the ActionProvider overrides it 183a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes if (checkActionProviderOverrideVisibility()) { 184a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes return this; 185a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 186a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 187a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes return wrappedSetVisible(visible); 188e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes } 189e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes 190e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes @Override 19189208232f3b5d1451408d787872504a190bc7ee0Chris Banes public boolean isVisible() { 19289208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.isVisible(); 19389208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 19489208232f3b5d1451408d787872504a190bc7ee0Chris Banes 19589208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 19689208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setEnabled(boolean enabled) { 19789208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setEnabled(enabled); 19889208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 19989208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 20089208232f3b5d1451408d787872504a190bc7ee0Chris Banes 20189208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 20289208232f3b5d1451408d787872504a190bc7ee0Chris Banes public boolean isEnabled() { 20389208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.isEnabled(); 20489208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 20589208232f3b5d1451408d787872504a190bc7ee0Chris Banes 20689208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 20789208232f3b5d1451408d787872504a190bc7ee0Chris Banes public boolean hasSubMenu() { 20889208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.hasSubMenu(); 20989208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 21089208232f3b5d1451408d787872504a190bc7ee0Chris Banes 21189208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 21289208232f3b5d1451408d787872504a190bc7ee0Chris Banes public SubMenu getSubMenu() { 21389208232f3b5d1451408d787872504a190bc7ee0Chris Banes return getSubMenuWrapper(mWrappedObject.getSubMenu()); 21489208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 21589208232f3b5d1451408d787872504a190bc7ee0Chris Banes 21689208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 21789208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { 21889208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setOnMenuItemClickListener(menuItemClickListener != null ? 21989208232f3b5d1451408d787872504a190bc7ee0Chris Banes new OnMenuItemClickListenerWrapper(menuItemClickListener) : null); 22089208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 22189208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 22289208232f3b5d1451408d787872504a190bc7ee0Chris Banes 22389208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 22489208232f3b5d1451408d787872504a190bc7ee0Chris Banes public ContextMenu.ContextMenuInfo getMenuInfo() { 22589208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.getMenuInfo(); 22689208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 22789208232f3b5d1451408d787872504a190bc7ee0Chris Banes 22889208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 22989208232f3b5d1451408d787872504a190bc7ee0Chris Banes public void setShowAsAction(int actionEnum) { 23089208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setShowAsAction(actionEnum); 23189208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 23289208232f3b5d1451408d787872504a190bc7ee0Chris Banes 23389208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 23489208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setShowAsActionFlags(int actionEnum) { 23589208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setShowAsActionFlags(actionEnum); 23689208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 23789208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 23889208232f3b5d1451408d787872504a190bc7ee0Chris Banes 23989208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 24089208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setActionView(View view) { 2412e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes if (view instanceof CollapsibleActionView) { 2422e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes view = new CollapsibleActionViewWrapper(view); 2432e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes } 24489208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setActionView(view); 24589208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 24689208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 24789208232f3b5d1451408d787872504a190bc7ee0Chris Banes 24889208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 24989208232f3b5d1451408d787872504a190bc7ee0Chris Banes public MenuItem setActionView(int resId) { 2502e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes // Make framework menu item inflate the view 25189208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setActionView(resId); 2522e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes 2532e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes View actionView = mWrappedObject.getActionView(); 2542e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes if (actionView instanceof CollapsibleActionView) { 2552e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes // If the inflated Action View is support-collapsible, wrap it 2562e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes mWrappedObject.setActionView(new CollapsibleActionViewWrapper(actionView)); 2572e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes } 25889208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 25989208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 26089208232f3b5d1451408d787872504a190bc7ee0Chris Banes 26189208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 26289208232f3b5d1451408d787872504a190bc7ee0Chris Banes public View getActionView() { 2632e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes View actionView = mWrappedObject.getActionView(); 2642e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes if (actionView instanceof CollapsibleActionViewWrapper) { 2652e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes return ((CollapsibleActionViewWrapper) actionView).getWrappedView(); 2662e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes } 2672e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes return actionView; 26889208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 26989208232f3b5d1451408d787872504a190bc7ee0Chris Banes 27089208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 27130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public MenuItem setActionProvider(android.view.ActionProvider provider) { 27230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell mWrappedObject.setActionProvider(provider); 273a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes if (provider != null && mEmulateProviderVisibilityOverride) { 274a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes checkActionProviderOverrideVisibility(); 275a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 27630837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return this; 27730837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell } 27830837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell 27930837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell @Override 28030837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell public android.view.ActionProvider getActionProvider() { 28130837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell return mWrappedObject.getActionProvider(); 28230837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell } 28330837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell 28430837f1095c803f332f4a1c3f0917c8afdd50156Adam Powell @Override 285e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes public boolean expandActionView() { 286e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes return mWrappedObject.expandActionView(); 287e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes } 288e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes 289e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes @Override 290e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes public boolean collapseActionView() { 291e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes return mWrappedObject.collapseActionView(); 292e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes } 293e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes 294e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes @Override 295e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes public boolean isActionViewExpanded() { 296e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes return mWrappedObject.isActionViewExpanded(); 297e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes } 298e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes 299e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes @Override 300e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) { 30189208232f3b5d1451408d787872504a190bc7ee0Chris Banes mWrappedObject.setOnActionExpandListener(listener); 30289208232f3b5d1451408d787872504a190bc7ee0Chris Banes return this; 30389208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 30489208232f3b5d1451408d787872504a190bc7ee0Chris Banes 30589208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 30689208232f3b5d1451408d787872504a190bc7ee0Chris Banes public SupportMenuItem setSupportOnActionExpandListener( 30789208232f3b5d1451408d787872504a190bc7ee0Chris Banes MenuItemCompat.OnActionExpandListener listener) { 3086e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brown mWrappedObject.setOnActionExpandListener(listener != null ? 3096e6abe6eb358db4c3932752249c8ac61dd3dab21Jeff Brown new OnActionExpandListenerWrapper(listener) : null); 31089208232f3b5d1451408d787872504a190bc7ee0Chris Banes return null; 311e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes } 312e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes 313d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes @Override 314d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) { 315d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes mWrappedObject.setActionProvider(actionProvider != null ? 316d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes createActionProviderWrapper(actionProvider) : null); 317d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes return this; 318d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes } 319d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes 320d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes @Override 321d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes public ActionProvider getSupportActionProvider() { 322d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes ActionProviderWrapper providerWrapper = 323a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes (ActionProviderWrapper) mWrappedObject.getActionProvider(); 324a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes return providerWrapper != null ? providerWrapper.mInner : null; 325d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes } 326d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes 327592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes public void setExclusiveCheckable(boolean checkable) { 328592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes try { 329592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes if (mSetExclusiveCheckableMethod == null) { 330592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes mSetExclusiveCheckableMethod = mWrappedObject.getClass() 331592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes .getDeclaredMethod("setExclusiveCheckable", Boolean.TYPE); 332592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes } 333592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes mSetExclusiveCheckableMethod.invoke(mWrappedObject, checkable); 334592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes } catch (Exception e) { 335592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes Log.w(LOG_TAG, "Error while calling setExclusiveCheckable", e); 336592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes } 337592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes } 338592df2e7552ba6902c9750ab8453850fc9e30334Chris Banes 339d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes ActionProviderWrapper createActionProviderWrapper(ActionProvider provider) { 340d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes return new ActionProviderWrapper(provider); 341d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes } 342d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes 343a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes /** 344a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes * @return true if the ActionProvider has overriden the visibility 345a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes */ 346a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes final boolean checkActionProviderOverrideVisibility() { 347a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes if (mLastRequestVisible) { 348a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes ActionProvider provider = getSupportActionProvider(); 349a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes if (provider != null && provider.overridesItemVisibility() && !provider.isVisible()) { 350a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes wrappedSetVisible(false); 351a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes return true; 352a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 353a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 354a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes return false; 355a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 356a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes 357a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes final MenuItem wrappedSetVisible(boolean visible) { 358a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes return mWrappedObject.setVisible(visible); 359a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 360a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes 36189208232f3b5d1451408d787872504a190bc7ee0Chris Banes private class OnMenuItemClickListenerWrapper extends BaseWrapper<OnMenuItemClickListener> 36289208232f3b5d1451408d787872504a190bc7ee0Chris Banes implements android.view.MenuItem.OnMenuItemClickListener { 36389208232f3b5d1451408d787872504a190bc7ee0Chris Banes 36489208232f3b5d1451408d787872504a190bc7ee0Chris Banes OnMenuItemClickListenerWrapper(OnMenuItemClickListener object) { 36589208232f3b5d1451408d787872504a190bc7ee0Chris Banes super(object); 36689208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 36789208232f3b5d1451408d787872504a190bc7ee0Chris Banes 36889208232f3b5d1451408d787872504a190bc7ee0Chris Banes @Override 36989208232f3b5d1451408d787872504a190bc7ee0Chris Banes public boolean onMenuItemClick(android.view.MenuItem item) { 37089208232f3b5d1451408d787872504a190bc7ee0Chris Banes return mWrappedObject.onMenuItemClick(getMenuItemWrapper(item)); 37189208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 37289208232f3b5d1451408d787872504a190bc7ee0Chris Banes } 37389208232f3b5d1451408d787872504a190bc7ee0Chris Banes 37489208232f3b5d1451408d787872504a190bc7ee0Chris Banes private class OnActionExpandListenerWrapper extends BaseWrapper<MenuItemCompat.OnActionExpandListener> 375e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes implements android.view.MenuItem.OnActionExpandListener { 376e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes 37789208232f3b5d1451408d787872504a190bc7ee0Chris Banes OnActionExpandListenerWrapper(MenuItemCompat.OnActionExpandListener object) { 378e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes super(object); 379e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes } 380e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes 381e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes @Override 382e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes public boolean onMenuItemActionExpand(android.view.MenuItem item) { 383e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes return mWrappedObject.onMenuItemActionExpand(getMenuItemWrapper(item)); 384e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes } 385e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes 386e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes @Override 387e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes public boolean onMenuItemActionCollapse(android.view.MenuItem item) { 388e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes return mWrappedObject.onMenuItemActionCollapse(getMenuItemWrapper(item)); 389e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes } 390e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes } 391d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes 392d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes class ActionProviderWrapper extends android.view.ActionProvider { 393d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes final ActionProvider mInner; 394d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes 395d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes public ActionProviderWrapper(ActionProvider inner) { 396d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes super(inner.getContext()); 397d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes mInner = inner; 398a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes 399a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes if (mEmulateProviderVisibilityOverride) { 400a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes mInner.setVisibilityListener(new ActionProvider.VisibilityListener() { 401a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes @Override 402a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes public void onActionProviderVisibilityChanged(boolean isVisible) { 403a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes if (mInner.overridesItemVisibility() && mLastRequestVisible) { 404a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes wrappedSetVisible(isVisible); 405a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 406a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 407a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes }); 408a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 409d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes } 410d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes 411d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes @Override 412d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes public View onCreateActionView() { 413a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes if (mEmulateProviderVisibilityOverride) { 414a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes // This is a convenient place to hook in and check if we need to override the 415a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes // visibility after being created. 416a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes checkActionProviderOverrideVisibility(); 417a6fc0bcd9e65ed20193976cd02500152bb39a163Chris Banes } 418d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes return mInner.onCreateActionView(); 419d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes } 420d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes 421d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes @Override 422d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes public boolean onPerformDefaultAction() { 423d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes return mInner.onPerformDefaultAction(); 424d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes } 425d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes 426d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes @Override 427d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes public boolean hasSubMenu() { 428d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes return mInner.hasSubMenu(); 429d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes } 430d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes 431d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes @Override 432d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes public void onPrepareSubMenu(android.view.SubMenu subMenu) { 433d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes mInner.onPrepareSubMenu(getSubMenuWrapper(subMenu)); 434d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes } 435d713f4f0643a5f6409b431f643f1ad25dba6c22fChris Banes } 4362e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes 4372e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes static class CollapsibleActionViewWrapper extends FrameLayout 4382e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes implements android.view.CollapsibleActionView { 4392e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes final CollapsibleActionView mWrappedView; 4402e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes 4412e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes CollapsibleActionViewWrapper(View actionView) { 4422e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes super(actionView.getContext()); 4432e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes mWrappedView = (CollapsibleActionView) actionView; 4442e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes addView(actionView); 4452e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes } 4462e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes 4472e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes @Override 4482e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes public void onActionViewExpanded() { 4492e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes mWrappedView.onActionViewExpanded(); 4502e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes } 4512e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes 4522e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes @Override 4532e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes public void onActionViewCollapsed() { 4542e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes mWrappedView.onActionViewCollapsed(); 4552e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes } 4562e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes 4572e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes View getWrappedView() { 4582e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes return (View) mWrappedView; 4592e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes } 4602e21b5e22c320fd7e6af86a7cc05b4b11d7a0f64Chris Banes } 461e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes} 462