Merge "Action bar context mode support for overflow, submenus"

This commit is contained in:
Adam Powell
2010-07-20 12:15:08 -07:00
committed by Android (Google) Code Review
2 changed files with 45 additions and 54 deletions

View File

@@ -16,8 +16,10 @@
package com.android.internal.app;
import com.android.internal.view.menu.ActionMenu;
import com.android.internal.view.menu.ActionMenuItem;
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.SubMenuBuilder;
import com.android.internal.widget.ActionBarContextView;
import com.android.internal.widget.ActionBarView;
@@ -196,9 +198,7 @@ public class ActionBarImpl extends ActionBar {
@Override
public void startContextMode(ContextModeCallback callback) {
if (mContextMode != null) {
mContextMode.finish();
}
finishContextMode();
// Don't wait for the close context mode animation to finish.
if (mClosingContext) {
@@ -207,15 +207,16 @@ public class ActionBarImpl extends ActionBar {
mCloseContext.run();
}
mContextMode = new ContextMode(callback);
if (callback.onCreateContextMode(mContextMode, mContextMode.getMenu())) {
mContextMode.invalidate();
mUpperContextView.initForMode(mContextMode);
ContextMode mode = new ContextMode(callback);
if (callback.onCreateContextMode(mode, mode.getMenu())) {
mode.invalidate();
mUpperContextView.initForMode(mode);
mAnimatorView.setDisplayedChild(CONTEXT_VIEW);
if (mLowerContextView != null) {
// TODO animate this
mLowerContextView.setVisibility(View.VISIBLE);
}
mContextMode = mode;
}
}
@@ -336,14 +337,15 @@ public class ActionBarImpl extends ActionBar {
/**
* @hide
*/
public class ContextMode extends ActionBar.ContextMode {
public class ContextMode extends ActionBar.ContextMode implements MenuBuilder.Callback {
private ContextModeCallback mCallback;
private ActionMenu mMenu;
private MenuBuilder mMenu;
private WeakReference<View> mCustomView;
public ContextMode(ContextModeCallback callback) {
mCallback = callback;
mMenu = new ActionMenu(mActionView.getContext());
mMenu = new MenuBuilder(mActionView.getContext());
mMenu.setCallback(this);
}
@Override
@@ -405,12 +407,27 @@ public class ActionBarImpl extends ActionBar {
return mCustomView != null ? mCustomView.get() : null;
}
public void dispatchOnContextItemClicked(MenuItem item) {
ActionMenuItem actionItem = (ActionMenuItem) item;
if (!actionItem.invoke()) {
mCallback.onContextItemClicked(this, item);
public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
return mCallback.onContextItemClicked(this, item);
}
public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
}
public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
if (!subMenu.hasVisibleItems()) {
return true;
}
}
new MenuPopupHelper(mActivity, subMenu).show();
return true;
}
public void onCloseSubMenu(SubMenuBuilder menu) {
}
public void onMenuModeChange(MenuBuilder menu) {
}
}
/**

View File

@@ -16,7 +16,8 @@
package com.android.internal.widget;
import com.android.internal.R;
import com.android.internal.app.ActionBarImpl;
import com.android.internal.view.menu.ActionMenuView;
import com.android.internal.view.menu.MenuBuilder;
import android.app.ActionBar;
import android.content.Context;
@@ -25,11 +26,8 @@ import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.MeasureSpec;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -43,6 +41,7 @@ public class ActionBarContextView extends ViewGroup {
private int mItemPadding;
private int mItemMargin;
private int mActionSpacing;
private int mContentHeight;
private CharSequence mTitle;
@@ -54,6 +53,7 @@ public class ActionBarContextView extends ViewGroup {
private TextView mTitleView;
private TextView mSubtitleView;
private Drawable mCloseDrawable;
private View mMenuView;
public ActionBarContextView(Context context) {
this(context, null, 0);
@@ -137,8 +137,6 @@ public class ActionBarContextView extends ViewGroup {
}
public void initForMode(final ActionBar.ContextMode mode) {
final ActionBarImpl.ContextMode implMode = (ActionBarImpl.ContextMode) mode;
if (mCloseButton == null) {
mCloseButton = new ImageButton(getContext());
mCloseButton.setImageDrawable(mCloseDrawable);
@@ -151,34 +149,15 @@ public class ActionBarContextView extends ViewGroup {
}
addView(mCloseButton);
final Context context = getContext();
final Menu menu = mode.getMenu();
final int itemCount = menu.size();
for (int i = 0; i < itemCount; i++) {
final MenuItem item = menu.getItem(i);
final ImageButton button = new ImageButton(context, null,
com.android.internal.R.attr.actionButtonStyle);
button.setClickable(true);
button.setFocusable(true);
button.setImageDrawable(item.getIcon());
button.setId(item.getItemId());
button.setVisibility(item.isVisible() ? VISIBLE : GONE);
button.setEnabled(item.isEnabled());
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
implMode.dispatchOnContextItemClicked(item);
}
});
addView(button);
}
requestLayout();
final MenuBuilder menu = (MenuBuilder) mode.getMenu();
mMenuView = menu.getMenuView(MenuBuilder.TYPE_ACTION_BUTTON, this);
addView(mMenuView);
}
public void closeMode() {
removeAllViews();
mCustomView = null;
mMenuView = null;
}
@Override
@@ -266,15 +245,10 @@ public class ActionBarContextView extends ViewGroup {
}
x = r - l - getPaddingRight();
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
if (child == mCloseButton || child == mTitleLayout || child == mCustomView) {
continue;
}
x -= positionChildInverse(child, x, y, contentHeight) + itemMargin;
if (mMenuView != null) {
x -= positionChildInverse(mMenuView, x + mActionSpacing, y, contentHeight)
- mActionSpacing;
}
}