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

Commit 21417a0d authored by Mady Mellor's avatar Mady Mellor Committed by Android (Google) Code Review
Browse files

Merge "Text selection: Fix moving by character when should move by word" into mnc-dev

parents c25d6c22 81fa3e89
Loading
Loading
Loading
Loading
+34 −34
Original line number Diff line number Diff line
@@ -3913,10 +3913,20 @@ public class Editor {

        @Override
        public void updatePosition(float x, float y) {
            final int trueOffset = mTextView.getOffsetForPosition(x, y);
            final int currLine = mTextView.getLineAtCoordinate(y);
            final int selectionEnd = mTextView.getSelectionEnd();
            final Layout layout = mTextView.getLayout();
            int initialOffset = mTextView.getOffsetForPosition(x, y);
            int currLine = mTextView.getLineAtCoordinate(y);
            boolean positionCursor = false;
            int offset = trueOffset;

            if (initialOffset >= selectionEnd) {
                // Handles have crossed, bound it to the last selected line and
                // adjust by word / char as normal.
                currLine = layout != null ? layout.getLineForOffset(selectionEnd) : mPrevLine;
                initialOffset = mTextView.getOffsetAtCoordinate(currLine, x);
            }

            int offset = initialOffset;
            int end = getWordEnd(offset);
            int start = getWordStart(offset);

@@ -3932,8 +3942,7 @@ public class Editor {
                        offset = mPreviousOffset;
                    }
                }
                final Layout layout = mTextView.getLayout();
                if (layout != null && offset < trueOffset) {
                if (layout != null && offset < initialOffset) {
                    final float adjustedX = layout.getPrimaryHorizontal(offset);
                    mTouchWordDelta =
                            mTextView.convertToLocalHorizontalCoordinate(x) - adjustedX;
@@ -3949,8 +3958,7 @@ public class Editor {
                    if (currLine > mPrevLine) {
                        // We're on a different line, so we'll snap to word boundaries.
                        offset = start;
                        final Layout layout = mTextView.getLayout();
                        if (layout != null && offset < trueOffset) {
                        if (layout != null && offset < initialOffset) {
                            final float adjustedX = layout.getPrimaryHorizontal(offset);
                            mTouchWordDelta =
                                    mTextView.convertToLocalHorizontalCoordinate(x) - adjustedX;
@@ -3964,18 +3972,10 @@ public class Editor {
                }
            }

            // Handles can not cross and selection is at least one character.
            if (positionCursor) {
                final int selectionEnd = mTextView.getSelectionEnd();
                // Handles can not cross and selection is at least one character.
                if (offset >= selectionEnd) {
                    // We can't cross the handles so let's just constrain the Y value.
                    int alteredOffset = mTextView.getOffsetAtCoordinate(mPrevLine, x);
                    if (alteredOffset >= selectionEnd) {
                        // Can't pass the other drag handle.
                    offset = getNextCursorOffset(selectionEnd, false);
                    } else {
                        offset = alteredOffset;
                    }
                    mTouchWordDelta = 0.0f;
                }
                mInWord = !getWordIteratorWithText().isBoundary(offset);
@@ -4031,10 +4031,20 @@ public class Editor {

        @Override
        public void updatePosition(float x, float y) {
            final int trueOffset = mTextView.getOffsetForPosition(x, y);
            final int currLine = mTextView.getLineAtCoordinate(y);
            int offset = trueOffset;
            final int selectionStart = mTextView.getSelectionStart();
            final Layout layout = mTextView.getLayout();
            int initialOffset = mTextView.getOffsetForPosition(x, y);
            int currLine = mTextView.getLineAtCoordinate(y);
            boolean positionCursor = false;

            if (initialOffset <= selectionStart) {
                // Handles have crossed, bound it to the first selected line and
                // adjust by word / char as normal.
                currLine = layout != null ? layout.getLineForOffset(selectionStart) : mPrevLine;
                initialOffset = mTextView.getOffsetAtCoordinate(currLine, x);
            }

            int offset = initialOffset;
            int end = getWordEnd(offset);
            int start = getWordStart(offset);

@@ -4050,8 +4060,7 @@ public class Editor {
                        offset = mPreviousOffset;
                    }
                }
                final Layout layout = mTextView.getLayout();
                if (layout != null && offset > trueOffset) {
                if (layout != null && offset > initialOffset) {
                    final float adjustedX = layout.getPrimaryHorizontal(offset);
                    mTouchWordDelta =
                            adjustedX - mTextView.convertToLocalHorizontalCoordinate(x);
@@ -4067,8 +4076,7 @@ public class Editor {
                    if (currLine < mPrevLine) {
                        // We're on a different line, so we'll snap to word boundaries.
                        offset = end;
                        final Layout layout = mTextView.getLayout();
                        if (layout != null && offset > trueOffset) {
                        if (layout != null && offset > initialOffset) {
                            final float adjustedX = layout.getPrimaryHorizontal(offset);
                            mTouchWordDelta =
                                    adjustedX - mTextView.convertToLocalHorizontalCoordinate(x);
@@ -4083,17 +4091,9 @@ public class Editor {
            }

            if (positionCursor) {
                final int selectionStart = mTextView.getSelectionStart();
                // Handles can not cross and selection is at least one character.
                if (offset <= selectionStart) {
                    // We can't cross the handles so let's just constrain the Y value.
                    int alteredOffset = mTextView.getOffsetAtCoordinate(mPrevLine, x);
                    int length = mTextView.getText().length();
                    if (alteredOffset <= selectionStart) {
                        // Can't pass the other drag handle.
                    offset = getNextCursorOffset(selectionStart, true);
                    } else {
                        offset = Math.min(alteredOffset, length);
                    }
                    mTouchWordDelta = 0.0f;
                }
                mInWord = !getWordIteratorWithText().isBoundary(offset);