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

Commit 727899fd authored by Clara Bayarri's avatar Clara Bayarri Committed by Android (Google) Code Review
Browse files

Merge "Floating Toolbar: Wrap the ActionBar ActionMode handling."

parents dd3fc6b9 c57e7bc3
Loading
Loading
Loading
Loading
+22 −11
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ import android.util.EventLog;
import android.util.Log;
import android.util.SparseArray;
import android.util.TypedValue;
import android.view.ActionMode.Callback;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.animation.Animation;
@@ -2678,28 +2679,38 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
        public ActionMode startActionMode(ActionMode.Callback callback) {
            if (mActionMode != null) {
                mActionMode.finish();
                mActionMode = null;
            }

            final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback);
            ActionMode mode = null;
            ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback);
            ActionModeWrapper mode = null;
            ActionMode callbackMode = null;
            if (getCallback() != null && !isDestroyed()) {
                try {
                    mode = getCallback().onWindowStartingActionMode(wrappedCallback);
                    callbackMode =
                            getCallback().onWindowStartingActionMode(wrappedCallback);
                    if (callbackMode != null && callbackMode instanceof ActionModeWrapper) {
                        // If we get an ActionModeWrapper back, we handle its lifecycle.
                        mode = (ActionModeWrapper) callbackMode;
                        callbackMode = null;
                    }
                } catch (AbstractMethodError ame) {
                    // Older apps might not implement this callback method.
                }
            }
            if (mode != null) {
                mActionMode = mode;
            if (callbackMode != null) {
                mActionMode = callbackMode;
            } else {
                if (mode == null) {
                    mode = new ActionModeWrapper(
                            mContext, wrappedCallback, new StandaloneActionModeProvider());
                }
                if (mActionModeView != null) {
                    mActionModeView.killMode();
                }
                ActionModeWrapper wrapperMode = new ActionModeWrapper(
                        mContext, wrappedCallback, new StandaloneActionModeProvider());
                if (callback.onCreateActionMode(wrapperMode, wrapperMode.getMenu())) {
                    mActionMode = wrapperMode;
                    wrapperMode.lockType();
                if (callback.onCreateActionMode(mode, mode.getMenu())) {
                    mode.lockType();
                    mActionMode = mode.getWrappedActionMode();
                    mActionMode.invalidate();
                } else {
                    mActionMode = null;
@@ -3310,7 +3321,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
                }
                if (getCallback() != null && !isDestroyed()) {
                    try {
                        getCallback().onActionModeFinished(mActionMode);
                        getCallback().onActionModeFinished(mode);
                    } catch (AbstractMethodError ame) {
                        // Older apps might not implement this callback method.
                    }
+27 −25
Original line number Diff line number Diff line
@@ -20,8 +20,10 @@ import android.animation.ValueAnimator;
import android.content.res.TypedArray;
import android.view.ViewParent;
import android.widget.Toolbar;

import com.android.internal.R;
import com.android.internal.view.ActionBarPolicy;
import com.android.internal.view.ActionModeWrapper;
import com.android.internal.view.menu.MenuBuilder;
import com.android.internal.view.menu.MenuPopupHelper;
import com.android.internal.view.menu.SubMenuBuilder;
@@ -46,6 +48,7 @@ import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.TypedValue;
import android.view.ActionMode;
import android.view.ActionMode.Callback;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -91,7 +94,7 @@ public class WindowDecorActionBar extends ActionBar implements

    private boolean mDisplayHomeAsUpSet;

    ActionModeImpl mActionMode;
    ActionMode mActionMode;
    ActionMode mDeferredDestroyActionMode;
    ActionMode.Callback mDeferredModeDestroyCallback;

@@ -490,15 +493,21 @@ public class WindowDecorActionBar extends ActionBar implements
    }

    public ActionMode startActionMode(ActionMode.Callback callback) {
        return new ActionModeWrapper(mContext, callback, new ActionModeProviderImpl());
    }
    
    private class ActionModeProviderImpl implements ActionModeWrapper.ActionModeProvider {

        @Override
        public ActionMode createActionMode(Callback callback, MenuBuilder menuBuilder) {
            if (mActionMode != null) {
                mActionMode.finish();
            }

            mOverlayLayout.setHideOnContentScrollEnabled(false);
            mContextView.killMode();
        ActionModeImpl mode = new ActionModeImpl(mContextView.getContext(), callback);
        if (mode.dispatchOnCreate()) {
            mode.invalidate();
            ActionModeImpl mode = new ActionModeImpl(
                    mContextView.getContext(), callback, menuBuilder);
            mContextView.initForMode(mode);
            animateToMode(true);
            if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) {
@@ -514,7 +523,6 @@ public class WindowDecorActionBar extends ActionBar implements
            mActionMode = mode;
            return mode;
        }
        return null;
    }

    private void configureTab(Tab tab, int position) {
@@ -942,11 +950,14 @@ public class WindowDecorActionBar extends ActionBar implements
        private ActionMode.Callback mCallback;
        private WeakReference<View> mCustomView;

        public ActionModeImpl(Context context, ActionMode.Callback callback) {
        public ActionModeImpl(
                Context context, ActionMode.Callback callback, MenuBuilder menuBuilder) {
            mActionModeContext = context;
            mCallback = callback;
            mMenu = new MenuBuilder(context)
                    .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
            mMenu = menuBuilder == null 
                    ? new MenuBuilder(context)
                        .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
                    : menuBuilder;
            mMenu.setCallback(this);
        }

@@ -1008,15 +1019,6 @@ public class WindowDecorActionBar extends ActionBar implements
            }
        }

        public boolean dispatchOnCreate() {
            mMenu.stopDispatchingItemsChanged();
            try {
                return mCallback.onCreateActionMode(this, mMenu);
            } finally {
                mMenu.startDispatchingItemsChanged();
            }
        }

        @Override
        public void setCustomView(View view) {
            mContextView.setCustomView(view);
+6 −0
Original line number Diff line number Diff line
@@ -113,6 +113,10 @@ public class ActionModeWrapper extends ActionMode {
        }
    }

    public ActionMode getWrappedActionMode() {
        return mActionMode;
    }

    /**
     * Set the current type as final and create the necessary ActionMode. After this call, any
     * changes to the ActionMode type will be ignored.
@@ -165,6 +169,8 @@ public class ActionModeWrapper extends ActionMode {
    public void finish() {
        if (mActionMode != null) {
            mActionMode.finish();
        } else {
            mCallback.onDestroyActionMode(this);
        }
    }