summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mady Mellor <madym@google.com> 2015-06-26 22:36:42 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2015-06-26 22:36:44 +0000
commit11b64410d92a68f10b17190d5566fc2b22875ad5 (patch)
treee4fff43730139d317c1b45cabc709f5760c1161a
parent0a202eac0103cae1c544d6f44bb67b236a3dde8d (diff)
parenta526683d123abdd4c2a54f8a4482c4a71a35b301 (diff)
Merge "Text selection: fix snapping to words when words break across lines" into mnc-dev
-rw-r--r--core/java/android/widget/Editor.java30
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;