Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7bb66f32 authored by Adam Powell's avatar Adam Powell Committed by Android (Google) Code Review
Browse files

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

parents f91f2971 2c9c9fe8
Loading
Loading
Loading
Loading
+34 −17
Original line number Diff line number Diff line
@@ -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,11 +407,26 @@ 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) {
        }
    }

+11 −37
Original line number Diff line number Diff line
@@ -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
@@ -267,14 +246,9 @@ 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;
        }
    }