MenuItemWrapperICS.java revision 89208232f3b5d1451408d787872504a190bc7ee0
1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.support.v7.internal.view.menu; 18 19import android.content.Intent; 20import android.graphics.drawable.Drawable; 21import android.support.v4.internal.view.SupportMenuItem; 22import android.support.v4.view.ActionProvider; 23import android.support.v4.view.MenuItemCompat; 24import android.view.ContextMenu; 25import android.view.MenuItem; 26import android.view.SubMenu; 27import android.view.View; 28 29class MenuItemWrapperICS extends BaseMenuWrapper<android.view.MenuItem> implements SupportMenuItem { 30 private final boolean mEmulateProviderVisibilityOverride; 31 // Tracks the last requested visibility 32 private boolean mLastRequestVisible; 33 34 MenuItemWrapperICS(android.view.MenuItem object, boolean emulateProviderVisibilityOverride) { 35 super(object); 36 mLastRequestVisible = object.isVisible(); 37 mEmulateProviderVisibilityOverride = emulateProviderVisibilityOverride; 38 } 39 40 MenuItemWrapperICS(android.view.MenuItem object) { 41 this(object, true); 42 } 43 44 @Override 45 public int getItemId() { 46 return mWrappedObject.getItemId(); 47 } 48 49 @Override 50 public int getGroupId() { 51 return mWrappedObject.getGroupId(); 52 } 53 54 @Override 55 public int getOrder() { 56 return mWrappedObject.getOrder(); 57 } 58 59 @Override 60 public MenuItem setTitle(CharSequence title) { 61 mWrappedObject.setTitle(title); 62 return this; 63 } 64 65 @Override 66 public MenuItem setTitle(int title) { 67 mWrappedObject.setTitle(title); 68 return this; 69 } 70 71 @Override 72 public CharSequence getTitle() { 73 return mWrappedObject.getTitle(); 74 } 75 76 @Override 77 public MenuItem setTitleCondensed(CharSequence title) { 78 mWrappedObject.setTitleCondensed(title); 79 return this; 80 } 81 82 @Override 83 public CharSequence getTitleCondensed() { 84 return mWrappedObject.getTitleCondensed(); 85 } 86 87 @Override 88 public MenuItem setIcon(Drawable icon) { 89 mWrappedObject.setIcon(icon); 90 return this; 91 } 92 93 @Override 94 public MenuItem setIcon(int iconRes) { 95 mWrappedObject.setIcon(iconRes); 96 return this; 97 } 98 99 @Override 100 public Drawable getIcon() { 101 return mWrappedObject.getIcon(); 102 } 103 104 @Override 105 public MenuItem setIntent(Intent intent) { 106 mWrappedObject.setIntent(intent); 107 return this; 108 } 109 110 @Override 111 public Intent getIntent() { 112 return mWrappedObject.getIntent(); 113 } 114 115 @Override 116 public MenuItem setShortcut(char numericChar, char alphaChar) { 117 mWrappedObject.setShortcut(numericChar, alphaChar); 118 return this; 119 } 120 121 @Override 122 public MenuItem setNumericShortcut(char numericChar) { 123 mWrappedObject.setNumericShortcut(numericChar); 124 return this; 125 } 126 127 @Override 128 public char getNumericShortcut() { 129 return mWrappedObject.getNumericShortcut(); 130 } 131 132 @Override 133 public MenuItem setAlphabeticShortcut(char alphaChar) { 134 mWrappedObject.setAlphabeticShortcut(alphaChar); 135 return this; 136 } 137 138 @Override 139 public char getAlphabeticShortcut() { 140 return mWrappedObject.getAlphabeticShortcut(); 141 } 142 143 @Override 144 public MenuItem setCheckable(boolean checkable) { 145 mWrappedObject.setCheckable(checkable); 146 return this; 147 } 148 149 @Override 150 public boolean isCheckable() { 151 return mWrappedObject.isCheckable(); 152 } 153 154 @Override 155 public MenuItem setChecked(boolean checked) { 156 mWrappedObject.setChecked(checked); 157 return this; 158 } 159 160 @Override 161 public boolean isChecked() { 162 return mWrappedObject.isChecked(); 163 } 164 165 @Override 166 public MenuItem setVisible(boolean visible) { 167 if (mEmulateProviderVisibilityOverride) { 168 mLastRequestVisible = visible; 169 // If we need to be visible, we need to check whether the ActionProvider overrides it 170 if (checkActionProviderOverrideVisibility()) { 171 return this; 172 } 173 } 174 return wrappedSetVisible(visible); 175 } 176 177 @Override 178 public boolean isVisible() { 179 return mWrappedObject.isVisible(); 180 } 181 182 @Override 183 public MenuItem setEnabled(boolean enabled) { 184 mWrappedObject.setEnabled(enabled); 185 return this; 186 } 187 188 @Override 189 public boolean isEnabled() { 190 return mWrappedObject.isEnabled(); 191 } 192 193 @Override 194 public boolean hasSubMenu() { 195 return mWrappedObject.hasSubMenu(); 196 } 197 198 @Override 199 public SubMenu getSubMenu() { 200 return getSubMenuWrapper(mWrappedObject.getSubMenu()); 201 } 202 203 @Override 204 public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { 205 mWrappedObject.setOnMenuItemClickListener(menuItemClickListener != null ? 206 new OnMenuItemClickListenerWrapper(menuItemClickListener) : null); 207 return this; 208 } 209 210 @Override 211 public ContextMenu.ContextMenuInfo getMenuInfo() { 212 return mWrappedObject.getMenuInfo(); 213 } 214 215 @Override 216 public void setShowAsAction(int actionEnum) { 217 mWrappedObject.setShowAsAction(actionEnum); 218 } 219 220 @Override 221 public MenuItem setShowAsActionFlags(int actionEnum) { 222 mWrappedObject.setShowAsActionFlags(actionEnum); 223 return this; 224 } 225 226 @Override 227 public MenuItem setActionView(View view) { 228 mWrappedObject.setActionView(view); 229 return this; 230 } 231 232 @Override 233 public MenuItem setActionView(int resId) { 234 mWrappedObject.setActionView(resId); 235 return this; 236 } 237 238 @Override 239 public View getActionView() { 240 return mWrappedObject.getActionView(); 241 } 242 243 @Override 244 public MenuItem setActionProvider(android.view.ActionProvider provider) { 245 mWrappedObject.setActionProvider(provider); 246 if (provider != null && mEmulateProviderVisibilityOverride) { 247 checkActionProviderOverrideVisibility(); 248 } 249 return this; 250 } 251 252 @Override 253 public android.view.ActionProvider getActionProvider() { 254 return mWrappedObject.getActionProvider(); 255 } 256 257 @Override 258 public boolean expandActionView() { 259 return mWrappedObject.expandActionView(); 260 } 261 262 @Override 263 public boolean collapseActionView() { 264 return mWrappedObject.collapseActionView(); 265 } 266 267 @Override 268 public boolean isActionViewExpanded() { 269 return mWrappedObject.isActionViewExpanded(); 270 } 271 272 @Override 273 public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) { 274 mWrappedObject.setOnActionExpandListener(listener); 275 return this; 276 } 277 278 @Override 279 public SupportMenuItem setSupportOnActionExpandListener( 280 MenuItemCompat.OnActionExpandListener listener) { 281 mWrappedObject.setOnActionExpandListener(listener != null ? 282 new OnActionExpandListenerWrapper(listener) : null); 283 return null; 284 } 285 286 @Override 287 public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) { 288 mWrappedObject.setActionProvider(actionProvider != null ? 289 createActionProviderWrapper(actionProvider) : null); 290 return this; 291 } 292 293 @Override 294 public ActionProvider getSupportActionProvider() { 295 ActionProviderWrapper providerWrapper = 296 (ActionProviderWrapper) mWrappedObject.getActionProvider(); 297 return providerWrapper != null ? providerWrapper.mInner : null; 298 } 299 300 ActionProviderWrapper createActionProviderWrapper(ActionProvider provider) { 301 return new ActionProviderWrapper(provider); 302 } 303 304 /** 305 * @return true if the ActionProvider has overriden the visibility 306 */ 307 final boolean checkActionProviderOverrideVisibility() { 308 if (mLastRequestVisible) { 309 ActionProvider provider = getSupportActionProvider(); 310 if (provider != null && provider.overridesItemVisibility() && !provider.isVisible()) { 311 wrappedSetVisible(false); 312 return true; 313 } 314 } 315 return false; 316 } 317 318 final MenuItem wrappedSetVisible(boolean visible) { 319 return mWrappedObject.setVisible(visible); 320 } 321 322 private class OnMenuItemClickListenerWrapper extends BaseWrapper<OnMenuItemClickListener> 323 implements android.view.MenuItem.OnMenuItemClickListener { 324 325 OnMenuItemClickListenerWrapper(OnMenuItemClickListener object) { 326 super(object); 327 } 328 329 @Override 330 public boolean onMenuItemClick(android.view.MenuItem item) { 331 return mWrappedObject.onMenuItemClick(getMenuItemWrapper(item)); 332 } 333 } 334 335 private class OnActionExpandListenerWrapper extends BaseWrapper<MenuItemCompat.OnActionExpandListener> 336 implements android.view.MenuItem.OnActionExpandListener { 337 338 OnActionExpandListenerWrapper(MenuItemCompat.OnActionExpandListener object) { 339 super(object); 340 } 341 342 @Override 343 public boolean onMenuItemActionExpand(android.view.MenuItem item) { 344 return mWrappedObject.onMenuItemActionExpand(getMenuItemWrapper(item)); 345 } 346 347 @Override 348 public boolean onMenuItemActionCollapse(android.view.MenuItem item) { 349 return mWrappedObject.onMenuItemActionCollapse(getMenuItemWrapper(item)); 350 } 351 } 352 353 class ActionProviderWrapper extends android.view.ActionProvider { 354 final ActionProvider mInner; 355 356 public ActionProviderWrapper(ActionProvider inner) { 357 super(inner.getContext()); 358 mInner = inner; 359 360 if (mEmulateProviderVisibilityOverride) { 361 mInner.setVisibilityListener(new ActionProvider.VisibilityListener() { 362 @Override 363 public void onActionProviderVisibilityChanged(boolean isVisible) { 364 if (mInner.overridesItemVisibility() && mLastRequestVisible) { 365 wrappedSetVisible(isVisible); 366 } 367 } 368 }); 369 } 370 } 371 372 @Override 373 public View onCreateActionView() { 374 if (mEmulateProviderVisibilityOverride) { 375 // This is a convenient place to hook in and check if we need to override the 376 // visibility after being created. 377 checkActionProviderOverrideVisibility(); 378 } 379 return mInner.onCreateActionView(); 380 } 381 382 @Override 383 public boolean onPerformDefaultAction() { 384 return mInner.onPerformDefaultAction(); 385 } 386 387 @Override 388 public boolean hasSubMenu() { 389 return mInner.hasSubMenu(); 390 } 391 392 @Override 393 public void onPrepareSubMenu(android.view.SubMenu subMenu) { 394 mInner.onPrepareSubMenu(getSubMenuWrapper(subMenu)); 395 } 396 } 397} 398