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

Commit a526683d authored by Mady Mellor's avatar Mady Mellor
Browse files

Text selection: fix snapping to words when words break across lines

Some languages do break words across lines and words can break between
lines with hyphenation. If a word has only one character on the current
line with the rest of the characters on the next line, the user would
be unable to move the cursor to the end of the word.

Rather than judging if a user is far enough into a word by using the
full word length, this CL amends the logic to only use the characters
that are on the current line of the word, if the user is far enough into
these characters the handle jumps to the next line to the end of the
word position.

Bug: 21400624
Change-Id: I8b96eb83bea08d9794d1e9db74066bcc3e168ac0
parent 6356d3b2
Loading
Loading
Loading
Loading
+22 −8
Original line number Diff line number Diff line
@@ -4171,10 +4171,17 @@ public class Editor {
            if (isExpanding) {
                // User is increasing the selection.
                if (!mInWord || currLine < mPrevLine) {
                    // We're not in a word, or we're on a different line so we'll expand by
                    // word. First ensure the user has at least entered the next word.
                    int offsetToWord = (end - start) / 2;
                    if (offset <= end - offsetToWord || currLine < mPrevLine) {
                    // Sometimes words can be broken across lines (Chinese, hyphenation).
                    // We still snap to the start of the word but we only use the letters on the
                    // current line to determine if the user is far enough into the word to snap.
                    int wordStartOnCurrLine = start;
                    if (layout != null && layout.getLineForOffset(start) != currLine) {
                        wordStartOnCurrLine = layout.getLineStart(currLine);
                    }
                    int offsetThresholdToSnap = end - ((end - wordStartOnCurrLine) / 2);
                    if (offset <= offsetThresholdToSnap || currLine < mPrevLine) {
                        // User is far enough into the word or on a different
                        // line so we expand by word.
                        offset = start;
                    } else {
                        offset = mPreviousOffset;
@@ -4352,10 +4359,17 @@ public class Editor {
            if (isExpanding) {
                // User is increasing the selection.
                if (!mInWord || currLine > mPrevLine) {
                    // We're not in a word, or we're on a different line so we'll expand by
                    // word. First ensure the user has at least entered the next word.
                    int midPoint = (end - start) / 2;
                    if (offset >= start + midPoint || currLine > mPrevLine) {
                    // Sometimes words can be broken across lines (Chinese, hyphenation).
                    // We still snap to the end of the word but we only use the letters on the
                    // current line to determine if the user is far enough into the word to snap.
                    int wordEndOnCurrLine = end;
                    if (layout != null && layout.getLineForOffset(end) != currLine) {
                        wordEndOnCurrLine = layout.getLineEnd(currLine);
                    }
                    final int offsetThresholdToSnap = start + ((wordEndOnCurrLine - start) / 2);
                    if (offset >= offsetThresholdToSnap || currLine > mPrevLine) {
                        // User is far enough into the word or on a different
                        // line so we expand by word.
                        offset = end;
                    } else {
                        offset = mPreviousOffset;