diff options
| author | 2015-06-26 22:36:42 +0000 | |
|---|---|---|
| committer | 2015-06-26 22:36:44 +0000 | |
| commit | 11b64410d92a68f10b17190d5566fc2b22875ad5 (patch) | |
| tree | e4fff43730139d317c1b45cabc709f5760c1161a | |
| parent | 0a202eac0103cae1c544d6f44bb67b236a3dde8d (diff) | |
| parent | a526683d123abdd4c2a54f8a4482c4a71a35b301 (diff) | |
Merge "Text selection: fix snapping to words when words break across lines" into mnc-dev
| -rw-r--r-- | core/java/android/widget/Editor.java | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index c96d39b0f384..84e7db44423e 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -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; |