summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adam Powell <adamp@google.com> 2011-01-10 17:14:06 -0800
committer Adam Powell <adamp@google.com> 2011-01-10 17:14:51 -0800
commitf0ad6e6eaf48ac8f4007232ad0a8511a7b5cfc0e (patch)
treed3818280279c06f0811bc2f8850f647b2396b438
parent748ba9a9512dee65d5b09cfe26a34ded753f4aab (diff)
Fix bug 3333015 - Overflow menu item submenus do not open
Submenus of action bar menus will open as new menus. Change-Id: I924b87bbea91b0df5e3608ec894530302c0e1d8d
-rw-r--r--core/java/com/android/internal/view/menu/ActionMenuView.java4
-rw-r--r--core/java/com/android/internal/view/menu/MenuPopupHelper.java4
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindow.java32
3 files changed, 34 insertions, 6 deletions
diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/com/android/internal/view/menu/ActionMenuView.java
index 9381675524c0..463902fe53e9 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuView.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuView.java
@@ -139,6 +139,10 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
mReserveOverflow = reserveOverflow;
}
+ public View getOverflowButton() {
+ return mOverflowButton;
+ }
+
@Override
protected LayoutParams generateDefaultLayoutParams() {
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
diff --git a/core/java/com/android/internal/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
index fe41f5201267..b93fac44f9fc 100644
--- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java
+++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
@@ -68,6 +68,10 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On
}
}
+ public void setAnchorView(View anchor) {
+ mAnchorView = new WeakReference<View>(anchor);
+ }
+
public void show() {
if (!tryShow()) {
throw new IllegalStateException("MenuPopupHelper cannot be used without an anchor");
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 2fcd04ed7e2b..38eed506d193 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -26,9 +26,11 @@ import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
import com.android.internal.view.BaseSurfaceHolder;
import com.android.internal.view.RootViewSurfaceTaker;
import com.android.internal.view.StandaloneActionMode;
+import com.android.internal.view.menu.ActionMenuView;
import com.android.internal.view.menu.ContextMenuBuilder;
import com.android.internal.view.menu.MenuBuilder;
import com.android.internal.view.menu.MenuDialogHelper;
+import com.android.internal.view.menu.MenuItemImpl;
import com.android.internal.view.menu.MenuPopupHelper;
import com.android.internal.view.menu.MenuView;
import com.android.internal.view.menu.SubMenuBuilder;
@@ -881,12 +883,16 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
// The window manager will give us a valid window token
new MenuDialogHelper(subMenu).show(null);
} else if (hasFeature(FEATURE_ACTION_BAR)) {
- mActionButtonPopup = new ActionButtonSubmenu(getContext(), subMenu);
- mActionButtonPopup.show();
- Callback cb = getCallback();
- if (cb != null) {
- cb.onMenuOpened(FEATURE_ACTION_BAR, subMenu);
- }
+ mDecor.post(new Runnable() {
+ public void run() {
+ mActionButtonPopup = new ActionButtonSubmenu(getContext(), subMenu);
+ mActionButtonPopup.show();
+ Callback cb = getCallback();
+ if (cb != null) {
+ cb.onMenuOpened(FEATURE_ACTION_BAR, subMenu);
+ }
+ }
+ });
}
return true;
@@ -3009,6 +3015,20 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
public ActionButtonSubmenu(Context context, SubMenuBuilder subMenu) {
super(context, subMenu);
mSubMenu = subMenu;
+
+ MenuBuilder parentMenu = subMenu.getRootMenu();
+ MenuItemImpl item = (MenuItemImpl) subMenu.getItem();
+ if (!item.isActionButton()) {
+ // Give a reasonable anchor to nested submenus.
+ ActionMenuView amv = (ActionMenuView) parentMenu.getMenuView(
+ MenuBuilder.TYPE_ACTION_BUTTON, null);
+
+ View anchor = amv.getOverflowButton();
+ if (anchor == null) {
+ anchor = amv;
+ }
+ setAnchorView(anchor);
+ }
}
@Override