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

Commit 0d7d4ef5 authored by Clara Bayarri's avatar Clara Bayarri
Browse files

Fix Floating Toolbar appearing after ActionMode was cancelled

The Views created for the Toolbar were not cleaned up properly when the
mode was cancelled by the client in onCreateActionMode, leading to the
toolbar appearing over other views when it shouldn't due to
onWindowFocusChanged showing the Toolbar if it exists.

We don't actually need the views if we don't know whether they are
going to be shown yet, so moved view creation to after onCreateActionMode

Bug: 20713912
Change-Id: Ic0c31d1634e1e96d9981a77b2c769306a8bf1a8d
parent d9c7f245
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -3376,9 +3376,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
                mFloatingActionMode.finish();
            }
            cleanupFloatingActionModeViews();
            mFloatingToolbar = new FloatingToolbar(mContext, PhoneWindow.this);
            final FloatingActionMode mode = new FloatingActionMode(
                    mContext, callback, originatingView, mFloatingToolbar);
            final FloatingActionMode mode =
                    new FloatingActionMode(mContext, callback, originatingView);
            mFloatingActionModeOriginatingView = originatingView;
            mFloatingToolbarPreDrawListener =
                new OnPreDrawListener() {
@@ -3393,6 +3392,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {

        private void setHandledFloatingActionMode(ActionMode mode) {
            mFloatingActionMode = mode;
            mFloatingToolbar = new FloatingToolbar(mContext, PhoneWindow.this);
            ((FloatingActionMode) mFloatingActionMode).setFloatingToolbar(mFloatingToolbar);
            mFloatingActionMode.invalidate();
            mFloatingToolbar.show();
            mFloatingActionModeOriginatingView.getViewTreeObserver()
+15 −9
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;

import com.android.internal.util.Preconditions;
import com.android.internal.view.menu.MenuBuilder;
import com.android.internal.widget.FloatingToolbar;

@@ -32,20 +33,28 @@ public class FloatingActionMode extends ActionMode {
    private final Context mContext;
    private final ActionMode.Callback2 mCallback;
    private final MenuBuilder mMenu;
    private final FloatingToolbar mFloatingToolbar;
    private final Rect mContentRect;
    private final Rect mContentRectOnWindow;
    private final Rect mPreviousContentRectOnWindow;
    private final int[] mViewPosition;
    private final View mOriginatingView;
    private FloatingToolbar mFloatingToolbar;

    public FloatingActionMode(
            Context context, ActionMode.Callback2 callback, View originatingView,
            FloatingToolbar floatingToolbar) {
            Context context, ActionMode.Callback2 callback, View originatingView) {
        mContext = context;
        mCallback = callback;
        mMenu = new MenuBuilder(context).setDefaultShowAsAction(
                MenuItem.SHOW_AS_ACTION_IF_ROOM);
        setType(ActionMode.TYPE_FLOATING);
        mContentRect = new Rect();
        mContentRectOnWindow = new Rect();
        mPreviousContentRectOnWindow = new Rect();
        mViewPosition = new int[2];
        mOriginatingView = originatingView;
    }

    public void setFloatingToolbar(FloatingToolbar floatingToolbar) {
        mFloatingToolbar = floatingToolbar
                .setMenu(mMenu)
                .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@@ -54,12 +63,6 @@ public class FloatingActionMode extends ActionMode {
                        return mCallback.onActionItemClicked(FloatingActionMode.this, item);
                    }
                });
        setType(ActionMode.TYPE_FLOATING);
        mContentRect = new Rect();
        mContentRectOnWindow = new Rect();
        mPreviousContentRectOnWindow = new Rect();
        mViewPosition = new int[2];
        mOriginatingView = originatingView;
    }

    @Override
@@ -79,6 +82,7 @@ public class FloatingActionMode extends ActionMode {

    @Override
    public void invalidate() {
        Preconditions.checkNotNull(mFloatingToolbar);
        mCallback.onPrepareActionMode(this, mMenu);
        mFloatingToolbar.updateLayout();
        invalidateContentRect();
@@ -86,11 +90,13 @@ public class FloatingActionMode extends ActionMode {

    @Override
    public void invalidateContentRect() {
        Preconditions.checkNotNull(mFloatingToolbar);
        mCallback.onGetContentRect(this, mOriginatingView, mContentRect);
        repositionToolbar();
    }

    public void updateViewLocationInWindow() {
        Preconditions.checkNotNull(mFloatingToolbar);
        mOriginatingView.getLocationInWindow(mViewPosition);
        repositionToolbar();
    }