summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adam Powell <adamp@google.com> 2014-01-07 15:56:59 -0800
committer Adam Powell <adamp@google.com> 2014-01-08 13:53:30 -0800
commitfa18d182a3f37505940e73ae6cd76c2e939f7f7c (patch)
tree7dff817f321d1040a13e265e6921d123bdec0cdd
parentfd3c089b1a153875d06cc46a68105e47ad390e59 (diff)
Move ActionMenuView into android.widget and make it public
Expose ActionMenuView as a way for applications to present ActionBar-style menus in other embedded or repeating contexts. Change-Id: I54b7ccd9b2116ca68bc72956da9262bca9d5085f
-rw-r--r--api/current.txt15
-rw-r--r--core/java/android/widget/ActionMenuPresenter.java (renamed from core/java/com/android/internal/view/menu/ActionMenuPresenter.java)26
-rw-r--r--core/java/android/widget/ActionMenuView.java (renamed from core/java/com/android/internal/view/menu/ActionMenuView.java)82
-rw-r--r--core/java/com/android/internal/view/menu/ActionMenuItemView.java1
-rw-r--r--core/java/com/android/internal/view/menu/MenuBuilder.java10
-rw-r--r--core/java/com/android/internal/widget/AbsActionBarView.java7
-rw-r--r--core/java/com/android/internal/widget/ActionBarContextView.java4
-rw-r--r--core/java/com/android/internal/widget/ActionBarView.java5
8 files changed, 101 insertions, 49 deletions
diff --git a/api/current.txt b/api/current.txt
index ff88b100f113..c03fc8bd2120 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -31404,6 +31404,21 @@ package android.widget {
field public int y;
}
+ public class ActionMenuView extends android.widget.LinearLayout {
+ ctor public ActionMenuView(android.content.Context);
+ ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
+ method public android.view.Menu getMenu();
+ method public void onConfigurationChanged(android.content.res.Configuration);
+ method public void onDetachedFromWindow();
+ }
+
+ public static class ActionMenuView.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+ ctor public ActionMenuView.LayoutParams(android.content.Context, android.util.AttributeSet);
+ ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams);
+ ctor public ActionMenuView.LayoutParams(android.widget.ActionMenuView.LayoutParams);
+ ctor public ActionMenuView.LayoutParams(int, int);
+ }
+
public abstract interface Adapter {
method public abstract int getCount();
method public abstract java.lang.Object getItem(int);
diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/android/widget/ActionMenuPresenter.java
index 11c4777a673a..b75d12fbacab 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
+++ b/core/java/android/widget/ActionMenuPresenter.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.internal.view.menu;
+package android.widget;
import android.content.Context;
import android.content.res.Configuration;
@@ -30,17 +30,23 @@ import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityNodeInfo;
-import android.widget.ImageButton;
-import android.widget.ListPopupWindow;
import android.widget.ListPopupWindow.ForwardingListener;
import com.android.internal.transition.ActionBarTransition;
import com.android.internal.view.ActionBarPolicy;
-import com.android.internal.view.menu.ActionMenuView.ActionMenuChildView;
+import com.android.internal.view.menu.ActionMenuItemView;
+import com.android.internal.view.menu.BaseMenuPresenter;
+import com.android.internal.view.menu.MenuBuilder;
+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;
import java.util.ArrayList;
/**
* MenuPresenter for building action menus as seen in the action bar and action modes.
+ *
+ * @hide
*/
public class ActionMenuPresenter extends BaseMenuPresenter
implements ActionProvider.SubUiVisibilityListener {
@@ -551,6 +557,10 @@ public class ActionMenuPresenter extends BaseMenuPresenter
}
}
+ public void setMenuView(ActionMenuView menuView) {
+ mMenuView = menuView;
+ }
+
private static class SavedState implements Parcelable {
public int openSubMenuId;
@@ -583,7 +593,7 @@ public class ActionMenuPresenter extends BaseMenuPresenter
};
}
- private class OverflowMenuButton extends ImageButton implements ActionMenuChildView {
+ private class OverflowMenuButton extends ImageButton implements ActionMenuView.ActionMenuChildView {
public OverflowMenuButton(Context context) {
super(context, null, com.android.internal.R.attr.actionOverflowButtonStyle);
@@ -712,14 +722,14 @@ public class ActionMenuPresenter extends BaseMenuPresenter
}
}
- private class PopupPresenterCallback implements MenuPresenter.Callback {
+ private class PopupPresenterCallback implements Callback {
@Override
public boolean onOpenSubMenu(MenuBuilder subMenu) {
if (subMenu == null) return false;
mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId();
- final MenuPresenter.Callback cb = getCallback();
+ final Callback cb = getCallback();
return cb != null ? cb.onOpenSubMenu(subMenu) : false;
}
@@ -728,7 +738,7 @@ public class ActionMenuPresenter extends BaseMenuPresenter
if (menu instanceof SubMenuBuilder) {
((SubMenuBuilder) menu).getRootMenu().close(false);
}
- final MenuPresenter.Callback cb = getCallback();
+ final Callback cb = getCallback();
if (cb != null) {
cb.onCloseMenu(menu, allMenusAreClosing);
}
diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/android/widget/ActionMenuView.java
index 16a2031a5643..32c7086b70e8 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuView.java
+++ b/core/java/android/widget/ActionMenuView.java
@@ -13,22 +13,27 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.internal.view.menu;
+package android.widget;
import android.content.Context;
import android.content.res.Configuration;
-import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
+import android.view.Menu;
import android.view.View;
import android.view.ViewDebug;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
-import android.widget.LinearLayout;
-import com.android.internal.R;
+import com.android.internal.view.menu.ActionMenuItemView;
+import com.android.internal.view.menu.MenuBuilder;
+import com.android.internal.view.menu.MenuItemImpl;
+import com.android.internal.view.menu.MenuView;
/**
- * @hide
+ * ActionMenuView is a presentation of a series of menu options as a View. It provides
+ * several top level options as action buttons while spilling remaining options over as
+ * items in an overflow menu. This allows applications to present packs of actions inline with
+ * specific or repeating content.
*/
public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvoker, MenuView {
private static final String TAG = "ActionMenuView";
@@ -44,8 +49,6 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
private int mFormatItemsWidth;
private int mMinCellSize;
private int mGeneratedItemPadding;
- private int mMeasuredExtraWidth;
- private int mMaxItemHeight;
public ActionMenuView(Context context) {
this(context, null);
@@ -57,26 +60,13 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
final float density = context.getResources().getDisplayMetrics().density;
mMinCellSize = (int) (MIN_CELL_SIZE * density);
mGeneratedItemPadding = (int) (GENERATED_ITEM_PADDING * density);
-
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActionBar,
- R.attr.actionBarStyle, 0);
- mMaxItemHeight = a.getDimensionPixelSize(R.styleable.ActionBar_height, 0);
- a.recycle();
}
+ /** @hide */
public void setPresenter(ActionMenuPresenter presenter) {
mPresenter = presenter;
}
- public boolean isExpandedFormat() {
- return mFormatItems;
- }
-
- public void setMaxItemHeight(int maxItemHeight) {
- mMaxItemHeight = maxItemHeight;
- requestLayout();
- }
-
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
@@ -129,10 +119,8 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
final int widthPadding = getPaddingLeft() + getPaddingRight();
final int heightPadding = getPaddingTop() + getPaddingBottom();
- final int itemHeightSpec = heightMode == MeasureSpec.EXACTLY
- ? MeasureSpec.makeMeasureSpec(heightSize - heightPadding, MeasureSpec.EXACTLY)
- : MeasureSpec.makeMeasureSpec(
- Math.min(mMaxItemHeight, heightSize - heightPadding), MeasureSpec.AT_MOST);
+ final int itemHeightSpec = getChildMeasureSpec(heightMeasureSpec, heightPadding,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
widthSize -= widthPadding;
@@ -333,7 +321,6 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
}
setMeasuredDimension(widthSize, heightSize);
- mMeasuredExtraWidth = cellsRemaining * cellSize;
}
/**
@@ -496,10 +483,12 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
mPresenter.dismissPopupMenus();
}
+ /** @hide */
public boolean isOverflowReserved() {
return mReserveOverflow;
}
-
+
+ /** @hide */
public void setOverflowReserved(boolean reserveOverflow) {
mReserveOverflow = reserveOverflow;
}
@@ -536,24 +525,51 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
return p != null && p instanceof LayoutParams;
}
+ /** @hide */
public LayoutParams generateOverflowButtonLayoutParams() {
LayoutParams result = generateDefaultLayoutParams();
result.isOverflowButton = true;
return result;
}
+ /** @hide */
public boolean invokeItem(MenuItemImpl item) {
return mMenu.performItemAction(item, 0);
}
+ /** @hide */
public int getWindowAnimations() {
return 0;
}
+ /** @hide */
public void initialize(MenuBuilder menu) {
mMenu = menu;
}
+ /**
+ * Returns the Menu object that this ActionMenuView is currently presenting.
+ *
+ * <p>Applications should use this method to obtain the ActionMenuView's Menu object
+ * and inflate or add content to it as necessary.</p>
+ *
+ * @return the Menu presented by this view
+ */
+ public Menu getMenu() {
+ if (mMenu == null) {
+ final Context context = getContext();
+ mMenu = new MenuBuilder(context);
+ mPresenter = new ActionMenuPresenter(context);
+ mPresenter.initForMenu(context, mMenu);
+ mPresenter.setMenuView(this);
+ }
+
+ return mMenu;
+ }
+
+ /**
+ * @hide Private LinearLayout (superclass) API. Un-hide if LinearLayout API is made public.
+ */
@Override
protected boolean hasDividerBeforeChildAt(int childIndex) {
if (childIndex == 0) {
@@ -575,23 +591,34 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
return false;
}
+ /** @hide */
public interface ActionMenuChildView {
public boolean needsDividerBefore();
public boolean needsDividerAfter();
}
public static class LayoutParams extends LinearLayout.LayoutParams {
+ /** @hide */
@ViewDebug.ExportedProperty(category = "layout")
public boolean isOverflowButton;
+
+ /** @hide */
@ViewDebug.ExportedProperty(category = "layout")
public int cellsUsed;
+
+ /** @hide */
@ViewDebug.ExportedProperty(category = "layout")
public int extraPixels;
+
+ /** @hide */
@ViewDebug.ExportedProperty(category = "layout")
public boolean expandable;
+
+ /** @hide */
@ViewDebug.ExportedProperty(category = "layout")
public boolean preventEdgeOffset;
+ /** @hide */
public boolean expanded;
public LayoutParams(Context c, AttributeSet attrs) {
@@ -612,6 +639,7 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
isOverflowButton = false;
}
+ /** @hide */
public LayoutParams(int width, int height, boolean isOverflowButton) {
super(width, height);
this.isOverflowButton = isOverflowButton;
diff --git a/core/java/com/android/internal/view/menu/ActionMenuItemView.java b/core/java/com/android/internal/view/menu/ActionMenuItemView.java
index c14d5879f895..ad0853e66823 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuItemView.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuItemView.java
@@ -28,6 +28,7 @@ import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
+import android.widget.ActionMenuView;
import android.widget.TextView;
import android.widget.Toast;
diff --git a/core/java/com/android/internal/view/menu/MenuBuilder.java b/core/java/com/android/internal/view/menu/MenuBuilder.java
index 195a00d9eca7..b7cb0de0791e 100644
--- a/core/java/com/android/internal/view/menu/MenuBuilder.java
+++ b/core/java/com/android/internal/view/menu/MenuBuilder.java
@@ -919,7 +919,7 @@ public class MenuBuilder implements Menu {
* sub menu is about to be shown, <var>allMenusAreClosing</var>
* is false.
*/
- final void close(boolean allMenusAreClosing) {
+ public final void close(boolean allMenusAreClosing) {
if (mIsClosing) return;
mIsClosing = true;
@@ -946,7 +946,7 @@ public class MenuBuilder implements Menu {
* false if only item properties changed.
* (Visibility is a structural property since it affects layout.)
*/
- void onItemsChanged(boolean structureChanged) {
+ public void onItemsChanged(boolean structureChanged) {
if (!mPreventDispatchingItemsChanged) {
if (structureChanged) {
mIsVisibleItemsStale = true;
@@ -1000,7 +1000,7 @@ public class MenuBuilder implements Menu {
onItemsChanged(true);
}
- ArrayList<MenuItemImpl> getVisibleItems() {
+ public ArrayList<MenuItemImpl> getVisibleItems() {
if (!mIsVisibleItemsStale) return mVisibleItems;
// Refresh the visible items
@@ -1085,12 +1085,12 @@ public class MenuBuilder implements Menu {
mIsActionItemsStale = false;
}
- ArrayList<MenuItemImpl> getActionItems() {
+ public ArrayList<MenuItemImpl> getActionItems() {
flagActionItems();
return mActionItems;
}
- ArrayList<MenuItemImpl> getNonActionItems() {
+ public ArrayList<MenuItemImpl> getNonActionItems() {
flagActionItems();
return mNonActionItems;
}
diff --git a/core/java/com/android/internal/widget/AbsActionBarView.java b/core/java/com/android/internal/widget/AbsActionBarView.java
index 6ea7372bab25..183478faca52 100644
--- a/core/java/com/android/internal/widget/AbsActionBarView.java
+++ b/core/java/com/android/internal/widget/AbsActionBarView.java
@@ -16,8 +16,8 @@
package com.android.internal.widget;
import com.android.internal.R;
-import com.android.internal.view.menu.ActionMenuPresenter;
-import com.android.internal.view.menu.ActionMenuView;
+import android.widget.ActionMenuPresenter;
+import android.widget.ActionMenuView;
import android.animation.Animator;
import android.animation.AnimatorSet;
@@ -100,9 +100,6 @@ public abstract class AbsActionBarView extends ViewGroup {
public void setContentHeight(int height) {
mContentHeight = height;
- if (mMenuView != null) {
- mMenuView.setMaxItemHeight(mContentHeight);
- }
requestLayout();
}
diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java
index 0cacaa5ab1d7..e10070fb30c0 100644
--- a/core/java/com/android/internal/widget/ActionBarContextView.java
+++ b/core/java/com/android/internal/widget/ActionBarContextView.java
@@ -16,8 +16,8 @@
package com.android.internal.widget;
import com.android.internal.R;
-import com.android.internal.view.menu.ActionMenuPresenter;
-import com.android.internal.view.menu.ActionMenuView;
+import android.widget.ActionMenuPresenter;
+import android.widget.ActionMenuView;
import com.android.internal.view.menu.MenuBuilder;
import android.animation.Animator;
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index 786f5cfa2e5c..ff2c62570041 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -41,6 +41,8 @@ import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.Window;
import android.view.accessibility.AccessibilityEvent;
+import android.widget.ActionMenuPresenter;
+import android.widget.ActionMenuView;
import android.widget.AdapterView;
import android.widget.FrameLayout;
import android.widget.ImageView;
@@ -52,8 +54,6 @@ import android.widget.TextView;
import com.android.internal.R;
import com.android.internal.transition.ActionBarTransition;
import com.android.internal.view.menu.ActionMenuItem;
-import com.android.internal.view.menu.ActionMenuPresenter;
-import com.android.internal.view.menu.ActionMenuView;
import com.android.internal.view.menu.MenuBuilder;
import com.android.internal.view.menu.MenuItemImpl;
import com.android.internal.view.menu.MenuPresenter;
@@ -430,6 +430,7 @@ public class ActionBarView extends AbsActionBarView {
mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE);
// Span the whole width
layoutParams.width = LayoutParams.MATCH_PARENT;
+ layoutParams.height = mContentHeight;
configPresenters(builder);
menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
if (mSplitView != null) {