diff options
| -rw-r--r-- | api/current.txt | 4 | ||||
| -rw-r--r-- | core/java/android/view/ActionProvider.java | 33 | ||||
| -rw-r--r-- | core/java/android/view/MenuInflater.java | 34 | ||||
| -rw-r--r-- | core/java/android/widget/ShareActionProvider.java | 22 | ||||
| -rw-r--r-- | core/java/com/android/internal/view/menu/MenuBuilder.java | 8 | ||||
| -rw-r--r-- | core/java/com/android/internal/view/menu/MenuItemImpl.java | 5 |
6 files changed, 73 insertions, 33 deletions
diff --git a/api/current.txt b/api/current.txt index f3dda785fa67..24c7d76ef0df 100644 --- a/api/current.txt +++ b/api/current.txt @@ -20904,8 +20904,10 @@ package android.view { public abstract class ActionProvider { ctor public ActionProvider(android.content.Context); + method public boolean hasSubMenu(); method public abstract android.view.View onCreateActionView(); - method public void onPerformDefaultAction(android.view.View); + method public boolean onPerformDefaultAction(); + method public void onPrepareSubMenu(android.view.SubMenu); } public abstract interface ContextMenu implements android.view.Menu { diff --git a/core/java/android/view/ActionProvider.java b/core/java/android/view/ActionProvider.java index 6491da0fee11..47f7358f6f74 100644 --- a/core/java/android/view/ActionProvider.java +++ b/core/java/android/view/ActionProvider.java @@ -76,7 +76,7 @@ public abstract class ActionProvider { * Performs an optional default action. * <p> * For the case of an action provider placed in a menu item not shown as an action this - * method is invoked if none of the callbacks for processing menu selection has handled + * method is invoked if previous callbacks for processing menu selection has handled * the event. * </p> * <p> @@ -104,11 +104,36 @@ public abstract class ActionProvider { * </ul> * </p> * <p> - * The default implementation does not perform any action. + * The default implementation does not perform any action and returns false. * </p> + */ + public boolean onPerformDefaultAction() { + return false; + } + + /** + * Determines if this ActionProvider has a submenu associated with it. + * + * <p>Associated submenus will be shown when an action view is not. This + * provider instance will receive a call to {@link #onPrepareSubMenu(SubMenu)} + * after the call to {@link #onPerformDefaultAction()} and before a submenu is + * displayed to the user. + * + * @return true if the item backed by this provider should have an associated submenu + */ + public boolean hasSubMenu() { + return false; + } + + /** + * Called to prepare an associated submenu for the menu item backed by this ActionProvider. + * + * <p>if {@link #hasSubMenu()} returns true, this method will be called when the + * menu item is selected to prepare the submenu for presentation to the user. Apps + * may use this to create or alter submenu content right before display. * - * @param actionView A view created by {@link #onCreateActionView()}. + * @param subMenu Submenu that will be displayed */ - public void onPerformDefaultAction(View actionView) { + public void onPrepareSubMenu(SubMenu subMenu) { } } diff --git a/core/java/android/view/MenuInflater.java b/core/java/android/view/MenuInflater.java index a7f0cba832e4..c46e43a74a30 100644 --- a/core/java/android/view/MenuInflater.java +++ b/core/java/android/view/MenuInflater.java @@ -166,7 +166,12 @@ public class MenuInflater { // Add the item if it hasn't been added (if the item was // a submenu, it would have been added already) if (!menuState.hasAddedItem()) { - menuState.addItem(); + if (menuState.itemActionProvider != null && + menuState.itemActionProvider.hasSubMenu()) { + menuState.addSubMenuItem(); + } else { + menuState.addItem(); + } } } else if (tagName.equals(XML_MENU)) { reachedEndOfMenu = true; @@ -270,6 +275,8 @@ public class MenuInflater { private String itemListenerMethodName; + private ActionProvider itemActionProvider; + private static final int defaultGroupId = NO_ID; private static final int defaultItemId = NO_ID; private static final int defaultItemCategory = 0; @@ -347,6 +354,19 @@ public class MenuInflater { itemActionViewClassName = a.getString(com.android.internal.R.styleable.MenuItem_actionViewClass); itemActionProviderClassName = a.getString(com.android.internal.R.styleable.MenuItem_actionProviderClass); + final boolean hasActionProvider = itemActionProviderClassName != null; + if (hasActionProvider && itemActionViewLayout == 0 && itemActionViewClassName == null) { + itemActionProvider = newInstance(itemActionProviderClassName, + ACTION_PROVIDER_CONSTRUCTOR_SIGNATURE, + mActionProviderConstructorArguments); + } else { + if (hasActionProvider) { + Log.w(LOG_TAG, "Ignoring attribute 'actionProviderClass'." + + " Action view already specified."); + } + itemActionProvider = null; + } + a.recycle(); itemAdded = false; @@ -406,16 +426,8 @@ public class MenuInflater { + " Action view already specified."); } } - if (itemActionProviderClassName != null) { - if (!actionViewSpecified) { - ActionProvider actionProvider = newInstance(itemActionProviderClassName, - ACTION_PROVIDER_CONSTRUCTOR_SIGNATURE, - mActionProviderConstructorArguments); - item.setActionProvider(actionProvider); - } else { - Log.w(LOG_TAG, "Ignoring attribute 'itemActionProviderClass'." - + " Action view already specified."); - } + if (itemActionProvider != null) { + item.setActionProvider(itemActionProvider); } } diff --git a/core/java/android/widget/ShareActionProvider.java b/core/java/android/widget/ShareActionProvider.java index d6e426fe7a87..f48261d7eb65 100644 --- a/core/java/android/widget/ShareActionProvider.java +++ b/core/java/android/widget/ShareActionProvider.java @@ -16,16 +16,17 @@ package android.widget; +import com.android.internal.R; + import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.util.TypedValue; import android.view.ActionProvider; import android.view.MenuItem; +import android.view.SubMenu; import android.view.View; -import com.android.internal.R; - /** * This is a provider for a share action. It is responsible for creating views * that enable data sharing and also to perform a default action for showing @@ -102,17 +103,14 @@ public class ShareActionProvider extends ActionProvider { return activityChooserView; } - /** - * {@inheritDoc} - */ @Override - public void onPerformDefaultAction(View actionView) { - if (actionView instanceof ActivityChooserView) { - ActivityChooserView activityChooserView = (ActivityChooserView) actionView; - activityChooserView.showPopup(); - } else { - throw new IllegalArgumentException("actionView not instance of ActivityChooserView"); - } + public boolean hasSubMenu() { + return true; + } + + @Override + public void onPrepareSubMenu(SubMenu subMenu) { + // TODO Implement me } /** diff --git a/core/java/com/android/internal/view/menu/MenuBuilder.java b/core/java/com/android/internal/view/menu/MenuBuilder.java index a4edbc5166e0..b0b49213d278 100644 --- a/core/java/com/android/internal/view/menu/MenuBuilder.java +++ b/core/java/com/android/internal/view/menu/MenuBuilder.java @@ -28,6 +28,7 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcelable; import android.util.SparseArray; +import android.view.ActionProvider; import android.view.ContextMenu.ContextMenuInfo; import android.view.KeyCharacterMap; import android.view.KeyEvent; @@ -807,7 +808,12 @@ public class MenuBuilder implements Menu { } else if (item.hasSubMenu()) { close(false); - invoked |= dispatchSubMenuSelected((SubMenuBuilder) item.getSubMenu()); + final SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); + final ActionProvider provider = item.getActionProvider(); + if (provider != null && provider.hasSubMenu()) { + provider.onPrepareSubMenu(subMenu); + } + invoked |= dispatchSubMenuSelected(subMenu); if (!invoked) close(true); } else { if ((flags & FLAG_PERFORM_NO_CLOSE) == 0) { diff --git a/core/java/com/android/internal/view/menu/MenuItemImpl.java b/core/java/com/android/internal/view/menu/MenuItemImpl.java index 20b7d8094478..0a7313c308a4 100644 --- a/core/java/com/android/internal/view/menu/MenuItemImpl.java +++ b/core/java/com/android/internal/view/menu/MenuItemImpl.java @@ -164,10 +164,7 @@ public final class MenuItemImpl implements MenuItem { } } - if (mActionProvider != null) { - // The action view is created by the provider in this case. - View actionView = getActionView(); - mActionProvider.onPerformDefaultAction(actionView); + if (mActionProvider != null && mActionProvider.onPerformDefaultAction()) { return true; } |