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

Commit 2c9c9fe8 authored by Adam Powell's avatar Adam Powell
Browse files

Action bar context mode support for overflow, submenus

Change-Id: I951ae179698b08b6aba5b174b3d47f0cf847352e
parent bd7599ff
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;
        }
    }