From 80679071abb516bcc6470dfcc68ac4d5bc16ff96 Mon Sep 17 00:00:00 2001 From: Mady Mellor Date: Thu, 9 Jul 2015 16:05:36 -0700 Subject: [PATCH] Fix: line slop shouldn't always increase / decrease by one line Touch slop is from the bottom (or top) of the line + line height / 2. It only makes sense to apply touch slop if the user is within a line from the previous line. Additionally, not doing this can cause some undesirable behavior if the user moves very quickly and the selection catches up with a weird line by line selection increase, potentially even having the selection be stalled until a next move event. This CL alters the logic so that if the user isn't within one line of the previous selection, it'll just use whatever line the user is currently on. Bug: 22385003 Change-Id: I4f37988893868e5e2b7925314fe824c3da9c1b97 --- core/java/android/widget/Editor.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 96e033a3231b9..5153f676528f6 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -4416,10 +4416,16 @@ public class Editor { } private int getCurrentLineAdjustedForSlop(Layout layout, int prevLine, float y) { + final int trueLine = mTextView.getLineAtCoordinate(y); if (layout == null || prevLine > layout.getLineCount() || layout.getLineCount() <= 0 || prevLine < 0) { // Invalid parameters, just return whatever line is at y. - return mTextView.getLineAtCoordinate(y); + return trueLine; + } + + if (Math.abs(trueLine - prevLine) >= 2) { + // Only stick to lines if we're within a line of the previous selection. + return trueLine; } final float verticalOffset = mTextView.viewportToContentVerticalOffset();