diff options
| author | 2014-01-07 15:56:59 -0800 | |
|---|---|---|
| committer | 2014-01-08 13:53:30 -0800 | |
| commit | fa18d182a3f37505940e73ae6cd76c2e939f7f7c (patch) | |
| tree | 7dff817f321d1040a13e265e6921d123bdec0cdd | |
| parent | fd3c089b1a153875d06cc46a68105e47ad390e59 (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.txt | 15 | ||||
| -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.java | 1 | ||||
| -rw-r--r-- | core/java/com/android/internal/view/menu/MenuBuilder.java | 10 | ||||
| -rw-r--r-- | core/java/com/android/internal/widget/AbsActionBarView.java | 7 | ||||
| -rw-r--r-- | core/java/com/android/internal/widget/ActionBarContextView.java | 4 | ||||
| -rw-r--r-- | core/java/com/android/internal/widget/ActionBarView.java | 5 |
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) { |