Merge "Action bar context mode support for overflow, submenus"
This commit is contained in:
@@ -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) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user