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

Commit 937a6f63 authored by Adam Powell's avatar Adam Powell Committed by Android Git Automerger
Browse files

am 7e53f3d7: am 624380a1: Fix bug 3047653 - Text select handles stick around when they shouldn\'t

Merge commit '7e53f3d7'

* commit '7e53f3d7':
  Fix bug 3047653 - Text select handles stick around when they shouldn't
parents d4b8cad1 7e53f3d7
Loading
Loading
Loading
Loading
+68 −8
Original line number Diff line number Diff line
@@ -3781,18 +3781,34 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            showError();
            mShowErrorAfterAttach = false;
        }

        final ViewTreeObserver observer = getViewTreeObserver();
        if (observer != null) {
            if (mInsertionPointCursorController != null) {
                observer.addOnTouchModeChangeListener(mInsertionPointCursorController);
            }
            if (mSelectionModifierCursorController != null) {
                observer.addOnTouchModeChangeListener(mSelectionModifierCursorController);
            }
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();

        if (mPreDrawState != PREDRAW_NOT_REGISTERED) {
        final ViewTreeObserver observer = getViewTreeObserver();
        if (observer != null) {
            if (mPreDrawState != PREDRAW_NOT_REGISTERED) {
                observer.removeOnPreDrawListener(this);
                mPreDrawState = PREDRAW_NOT_REGISTERED;
            }
            if (mInsertionPointCursorController != null) {
                observer.removeOnTouchModeChangeListener(mInsertionPointCursorController);
            }
            if (mSelectionModifierCursorController != null) {
                observer.removeOnTouchModeChangeListener(mSelectionModifierCursorController);
            }
        }

        if (mError != null) {
@@ -6684,7 +6700,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            if (mInputContentType != null) {
                mInputContentType.enterDown = false;
            }
            hideControllers();
            hideInsertionPointCursorController();
            if (mSelectionModifierCursorController != null) {
                mSelectionModifierCursorController.hide();
            }
        }

        startStopMarquee(hasWindowFocus);
@@ -6694,7 +6713,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        if (visibility != VISIBLE) {
            hideControllers();
            hideInsertionPointCursorController();
            if (mSelectionModifierCursorController != null) {
                mSelectionModifierCursorController.hide();
            }
        }
    }

@@ -6732,8 +6754,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            if (start >= prevStart && start < prevEnd) {
                // Restore previous selection
                Selection.setSelection((Spannable)mText, prevStart, prevEnd);
                // Tapping inside the selection displays the cut/copy/paste context menu.

                if (mSelectionModifierCursorController != null &&
                        !mSelectionModifierCursorController.isShowing()) {
                    // If the anchors aren't showing, revive them.
                    mSelectionModifierCursorController.show();
                } else {
                    // Tapping inside the selection displays the cut/copy/paste context menu
                    // as long as the anchors are already showing.
                    showContextMenu();
                }
                return;
            } else {
                // Tapping outside stops selection mode, if any
@@ -6743,6 +6773,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                    mInsertionPointCursorController.show();
                }
            }
        } else if (hasSelection() && mSelectionModifierCursorController != null) {
            mSelectionModifierCursorController.show();
        }
    }

@@ -7714,7 +7746,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
     * It is not used outside of {@link TextView}.
     * @hide
     */
    private interface CursorController {
    private interface CursorController extends ViewTreeObserver.OnTouchModeChangeListener {
        /**
         * Makes the cursor controller visible on screen. Will be drawn by {@link #draw(Canvas)}.
         * See also {@link #hide()}.
@@ -7969,6 +8001,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        public boolean onTouchEvent(MotionEvent ev) {
            return false;
        }

        public void onTouchModeChanged(boolean isInTouchMode) {
            if (!isInTouchMode) {
                hide();
            }
        }
    }

    private class SelectionModifierCursorController implements CursorController {
@@ -7979,6 +8017,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        // Whether selection anchors are active
        private boolean mIsShowing;

        private static final int DELAY_BEFORE_FADE_OUT = 4100;

        private final Runnable mHider = new Runnable() {
            public void run() {
                hide();
            }
        };

        SelectionModifierCursorController() {
            Resources res = mContext.getResources();
            mStartHandle = new HandleView(this, res.getDrawable(mTextSelectHandleLeftRes));
@@ -7991,12 +8037,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            mStartHandle.show();
            mEndHandle.show();
            hideInsertionPointCursorController();
            hideDelayed(DELAY_BEFORE_FADE_OUT);
        }

        public void hide() {
            mStartHandle.hide();
            mEndHandle.hide();
            mIsShowing = false;
            removeCallbacks(mHider);
        }

        private void hideDelayed(int delay) {
            removeCallbacks(mHider);
            postDelayed(mHider, delay);
        }

        public boolean isShowing() {
@@ -8062,6 +8115,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                    mLayout.getLineForOffset(selectionEnd);
            mStartHandle.positionAtCursor(selectionStart, oneLineSelection);
            mEndHandle.positionAtCursor(selectionEnd, true);
            hideDelayed(DELAY_BEFORE_FADE_OUT);
        }

        public boolean onTouchEvent(MotionEvent event) {
@@ -8118,6 +8172,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        public boolean isSelectionStartDragged() {
            return mStartHandle.isDragging();
        }

        public void onTouchModeChanged(boolean isInTouchMode) {
            if (!isInTouchMode) {
                hide();
            }
        }
    }

    private void hideInsertionPointCursorController() {