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

Commit 98f98dd1 authored by Abodunrinwa Toki's avatar Abodunrinwa Toki Committed by Android (Google) Code Review
Browse files

Merge "Fix floating toolbar flickers." into mnc-dev

parents 209fb433 f444b5c3
Loading
Loading
Loading
Loading
+1 −13
Original line number Diff line number Diff line
@@ -244,15 +244,6 @@ public class Editor {

    final CursorAnchorInfoNotifier mCursorAnchorInfoNotifier = new CursorAnchorInfoNotifier();

    private final Runnable mHideFloatingToolbar = new Runnable() {
        @Override
        public void run() {
            if (mTextActionMode != null) {
                mTextActionMode.hide(ActionMode.DEFAULT_HIDE_DURATION);
            }
        }
    };

    private final Runnable mShowFloatingToolbar = new Runnable() {
        @Override
        public void run() {
@@ -389,7 +380,6 @@ public class Editor {
            mTextView.removeCallbacks(mInsertionActionModeRunnable);
        }

        mTextView.removeCallbacks(mHideFloatingToolbar);
        mTextView.removeCallbacks(mShowFloatingToolbar);

        destroyDisplayListsData();
@@ -1248,14 +1238,12 @@ public class Editor {
    private void hideFloatingToolbar() {
        if (mTextActionMode != null) {
            mTextView.removeCallbacks(mShowFloatingToolbar);
            // Delay the "hide" a little bit just in case a "show" will happen almost immediately.
            mTextView.postDelayed(mHideFloatingToolbar, 100);
            mTextActionMode.hide(ActionMode.DEFAULT_HIDE_DURATION);
        }
    }

    private void showFloatingToolbar() {
        if (mTextActionMode != null) {
            mTextView.removeCallbacks(mHideFloatingToolbar);
            // Delay "show" so it doesn't interfere with click confirmations
            // or double-clicks that could "dismiss" the floating toolbar.
            int delay = ViewConfiguration.getDoubleTapTimeout();
+57 −38
Original line number Diff line number Diff line
@@ -48,12 +48,14 @@ public class FloatingActionMode extends ActionMode {
    private final Runnable mMovingOff = new Runnable() {
        public void run() {
            mFloatingToolbarVisibilityHelper.setMoving(false);
            mFloatingToolbarVisibilityHelper.updateToolbarVisibility();
        }
    };

    private final Runnable mHideOff = new Runnable() {
        public void run() {
            mFloatingToolbarVisibilityHelper.setHideRequested(false);
            mFloatingToolbarVisibilityHelper.updateToolbarVisibility();
        }
    };

@@ -87,6 +89,7 @@ public class FloatingActionMode extends ActionMode {
                    }
                });
        mFloatingToolbarVisibilityHelper = new FloatingToolbarVisibilityHelper(mFloatingToolbar);
        mFloatingToolbarVisibilityHelper.activate();
    }

    @Override
@@ -108,8 +111,7 @@ public class FloatingActionMode extends ActionMode {
    public void invalidate() {
        checkToolbarInitialized();
        mCallback.onPrepareActionMode(this, mMenu);
        mFloatingToolbar.updateLayout();
        invalidateContentRect();
        invalidateContentRect();  // Will re-layout and show the toolbar if necessary.
    }

    @Override
@@ -131,6 +133,9 @@ public class FloatingActionMode extends ActionMode {

        mContentRectOnWindow.set(mContentRect);
        mContentRectOnWindow.offset(mViewPosition[0], mViewPosition[1]);

        if (isContentRectWithinBounds()) {
            mFloatingToolbarVisibilityHelper.setOutOfBounds(false);
            // Make sure that content rect is not out of the view's visible bounds.
            mContentRectOnWindow.set(
                    Math.max(mContentRectOnWindow.left, mViewRect.left),
@@ -139,19 +144,21 @@ public class FloatingActionMode extends ActionMode {
                    Math.min(mContentRectOnWindow.bottom, mViewRect.bottom));

            if (!mContentRectOnWindow.equals(mPreviousContentRectOnWindow)) {
            if (!mPreviousContentRectOnWindow.isEmpty()) {
                notifyContentRectMoving();
            }
                // Content rect is moving.
                mOriginatingView.removeCallbacks(mMovingOff);
                mFloatingToolbarVisibilityHelper.setMoving(true);
                mOriginatingView.postDelayed(mMovingOff, MOVING_HIDE_DELAY);

                mFloatingToolbar.setContentRect(mContentRectOnWindow);
                mFloatingToolbar.updateLayout();
            }
        mPreviousContentRectOnWindow.set(mContentRectOnWindow);

        if (isContentRectWithinBounds()) {
            mFloatingToolbarVisibilityHelper.setOutOfBounds(false);
        } else {
            mFloatingToolbarVisibilityHelper.setOutOfBounds(true);
            mContentRectOnWindow.setEmpty();
        }
        mFloatingToolbarVisibilityHelper.updateToolbarVisibility();

        mPreviousContentRectOnWindow.set(mContentRectOnWindow);
    }

    private boolean isContentRectWithinBounds() {
@@ -165,12 +172,6 @@ public class FloatingActionMode extends ActionMode {
            && Rect.intersects(mContentRectOnWindow, mViewRect);
    }

    private void notifyContentRectMoving() {
        mOriginatingView.removeCallbacks(mMovingOff);
        mFloatingToolbarVisibilityHelper.setMoving(true);
        mOriginatingView.postDelayed(mMovingOff, MOVING_HIDE_DELAY);
    }

    @Override
    public void hide(long duration) {
        checkToolbarInitialized();
@@ -184,6 +185,7 @@ public class FloatingActionMode extends ActionMode {
            mHideOff.run();
        } else {
            mFloatingToolbarVisibilityHelper.setHideRequested(true);
            mFloatingToolbarVisibilityHelper.updateToolbarVisibility();
            mOriginatingView.postDelayed(mHideOff, duration);
        }
    }
@@ -221,7 +223,7 @@ public class FloatingActionMode extends ActionMode {
    }

    /**
     * @throws IlllegalStateException
     * @throws IllegalStateException
     */
    private void checkToolbarInitialized() {
        Preconditions.checkState(mFloatingToolbar != null);
@@ -229,13 +231,14 @@ public class FloatingActionMode extends ActionMode {
    }

    private void reset() {
        mFloatingToolbarVisibilityHelper.deactivate();
        mOriginatingView.removeCallbacks(mMovingOff);
        mOriginatingView.removeCallbacks(mHideOff);
    }


    /**
     * A helper that shows/hides the floating toolbar depending on certain states.
     * A helper for showing/hiding the floating toolbar depending on certain states.
     */
    private static final class FloatingToolbarVisibilityHelper {

@@ -245,29 +248,45 @@ public class FloatingActionMode extends ActionMode {
        private boolean mMoving;
        private boolean mOutOfBounds;

        private boolean mActive;

        public FloatingToolbarVisibilityHelper(FloatingToolbar toolbar) {
            mToolbar = Preconditions.checkNotNull(toolbar);
        }

        public void activate() {
            mHideRequested = false;
            mMoving = false;
            mOutOfBounds = false;

            mActive = true;
        }

        public void deactivate() {
            mActive = false;
            mToolbar.dismiss();
        }

        public void setHideRequested(boolean hide) {
            mHideRequested = hide;
            updateToolbarVisibility();
        }

        public void setMoving(boolean moving) {
            mMoving = moving;
            updateToolbarVisibility();
        }

        public void setOutOfBounds(boolean outOfBounds) {
            mOutOfBounds = outOfBounds;
            updateToolbarVisibility();
        }

        private void updateToolbarVisibility() {
        public void updateToolbarVisibility() {
            if (!mActive) {
                return;
            }

            if (mHideRequested || mMoving || mOutOfBounds) {
                mToolbar.hide();
            } else if (mToolbar.isHidden()) {
            } else {
                mToolbar.show();
            }
        }