From 090edf47f03400572ca36d5fdd052edaf3f68e79 Mon Sep 17 00:00:00 2001 From: Sergey Shatunov Date: Sat, 2 Nov 2013 12:27:51 +0800 Subject: [PATCH] Fix #655 --- issues/AndroidManifest.xml | 18 +++++ issues/res/menu/i655_menu.xml | 26 ++++++ .../issues/i655/MainActivity.java | 15 ++++ .../view/menu/ActionMenuPresenter.java | 79 +++++++++++-------- 4 files changed, 105 insertions(+), 33 deletions(-) create mode 100644 issues/res/menu/i655_menu.xml create mode 100644 issues/src/org/holoeverywhere/issues/i655/MainActivity.java diff --git a/issues/AndroidManifest.xml b/issues/AndroidManifest.xml index 81abe168..d976d06e 100644 --- a/issues/AndroidManifest.xml +++ b/issues/AndroidManifest.xml @@ -38,6 +38,15 @@ + + + + + + + @@ -101,6 +110,15 @@ + + + + + + + diff --git a/issues/res/menu/i655_menu.xml b/issues/res/menu/i655_menu.xml new file mode 100644 index 00000000..54b0a75a --- /dev/null +++ b/issues/res/menu/i655_menu.xml @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/issues/src/org/holoeverywhere/issues/i655/MainActivity.java b/issues/src/org/holoeverywhere/issues/i655/MainActivity.java new file mode 100644 index 00000000..5dadf17d --- /dev/null +++ b/issues/src/org/holoeverywhere/issues/i655/MainActivity.java @@ -0,0 +1,15 @@ +package org.holoeverywhere.issues.i655; + +import android.view.Menu; + +import org.holoeverywhere.app.Activity; +import org.holoeverywhere.issues.R; + + +public class MainActivity extends Activity { + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.i655_menu, menu); + return true; + } +} diff --git a/library/src/android/support/v7/internal/view/menu/ActionMenuPresenter.java b/library/src/android/support/v7/internal/view/menu/ActionMenuPresenter.java index dc239c34..f6182e80 100644 --- a/library/src/android/support/v7/internal/view/menu/ActionMenuPresenter.java +++ b/library/src/android/support/v7/internal/view/menu/ActionMenuPresenter.java @@ -17,14 +17,12 @@ package android.support.v7.internal.view.menu; import android.content.Context; -import android.content.DialogInterface; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Parcel; import android.os.Parcelable; -import org.holoeverywhere.R; -import android.support.v7.internal.view.ActionBarPolicy; import android.support.v4.view.ActionProvider; +import android.support.v7.internal.view.ActionBarPolicy; import android.support.v7.internal.view.menu.ActionMenuView.ActionMenuChildView; import android.util.SparseBooleanArray; import android.view.MenuItem; @@ -34,6 +32,8 @@ import android.view.ViewGroup; import android.widget.ImageButton; +import org.holoeverywhere.R; + import java.util.ArrayList; /** @@ -45,7 +45,10 @@ public class ActionMenuPresenter extends BaseMenuPresenter implements ActionProvider.SubUiVisibilityListener { private static final String TAG = "ActionMenuPresenter"; - + final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback(); + // Group IDs that have been added as actions - used temporarily, allocated here for reuse. + private final SparseBooleanArray mActionButtonGroups = new SparseBooleanArray(); + int mOpenSubMenuId; private View mOverflowButton; private boolean mReserveOverflow; private boolean mReserveOverflowSet; @@ -56,22 +59,12 @@ public class ActionMenuPresenter extends BaseMenuPresenter private boolean mStrictWidthLimit; private boolean mWidthLimitSet; private boolean mExpandedActionViewsExclusive; - private int mMinCellSize; - - // Group IDs that have been added as actions - used temporarily, allocated here for reuse. - private final SparseBooleanArray mActionButtonGroups = new SparseBooleanArray(); - private View mScrapActionButtonView; - private OverflowPopup mOverflowPopup; private ActionButtonSubmenu mActionButtonPopup; - private OpenOverflowRunnable mPostedOpenRunnable; - final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback(); - int mOpenSubMenuId; - public ActionMenuPresenter(Context context) { super(context, R.layout.abc_action_menu_layout, R.layout.abc_action_menu_item_layout); } @@ -263,8 +256,9 @@ public boolean onSubMenuSelected(SubMenuBuilder subMenu) { } mOpenSubMenuId = subMenu.getItem().getItemId(); - mActionButtonPopup = new ActionButtonSubmenu(subMenu); - mActionButtonPopup.show(null); + mActionButtonPopup = new ActionButtonSubmenu(mContext, subMenu); + mActionButtonPopup.setAnchorView(anchor); + mActionButtonPopup.show(); super.onSubMenuSelected(subMenu); return true; } @@ -538,6 +532,16 @@ public void onSubUiVisibilityChanged(boolean isVisible) { private static class SavedState implements Parcelable { + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; public int openSubMenuId; SavedState() { @@ -556,17 +560,6 @@ public int describeContents() { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(openSubMenuId); } - - public static final Parcelable.Creator CREATOR - = new Parcelable.Creator() { - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; } private class OverflowMenuButton extends ImageButton implements ActionMenuChildView { @@ -603,7 +596,7 @@ public boolean needsDividerAfter() { private class OverflowPopup extends MenuPopupHelper { public OverflowPopup(Context context, MenuBuilder menu, View anchorView, - boolean overflowOnly) { + boolean overflowOnly) { super(context, menu, anchorView, overflowOnly); setCallback(mPopupPresenterCallback); } @@ -616,16 +609,36 @@ public void onDismiss() { } } - private class ActionButtonSubmenu extends MenuDialogHelper { + private class ActionButtonSubmenu extends MenuPopupHelper { + private SubMenuBuilder mSubMenu; + + public ActionButtonSubmenu(Context context, SubMenuBuilder subMenu) { + super(context, subMenu); + mSubMenu = subMenu; + + MenuItemImpl item = (MenuItemImpl) subMenu.getItem(); + if (!item.isActionButton()) { + // Give a reasonable anchor to nested submenus. + setAnchorView(mOverflowButton == null ? (View) mMenuView : mOverflowButton); + } - public ActionButtonSubmenu(SubMenuBuilder subMenu) { - super(subMenu); setCallback(mPopupPresenterCallback); + + boolean preserveIconSpacing = false; + final int count = subMenu.size(); + for (int i = 0; i < count; i++) { + MenuItem childItem = subMenu.getItem(i); + if (childItem.isVisible() && childItem.getIcon() != null) { + preserveIconSpacing = true; + break; + } + } + setForceShowIcon(preserveIconSpacing); } @Override - public void onDismiss(DialogInterface dialog) { - super.onDismiss(dialog); + public void onDismiss() { + super.onDismiss(); mActionButtonPopup = null; mOpenSubMenuId = 0; }