summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt4
-rw-r--r--core/java/android/view/ActionProvider.java33
-rw-r--r--core/java/android/view/MenuInflater.java34
-rw-r--r--core/java/android/widget/ShareActionProvider.java22
-rw-r--r--core/java/com/android/internal/view/menu/MenuBuilder.java8
-rw-r--r--core/java/com/android/internal/view/menu/MenuItemImpl.java5
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;
}