summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mady Mellor <madym@google.com> 2015-06-17 17:36:30 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2015-06-17 17:36:31 +0000
commit5279d11f258a01cfdf0a16d965b5e4cd7566b8ac (patch)
tree8081c04bfbb7c9d605dd405c53d6428784e51351
parentf05228822c5da6333f20dc3a29c8f064b7562e06 (diff)
parentf9f8aebdc697e6ea1deff1aa82d0cec0e1ebacef (diff)
Merge "Drag to select text: add some slop for moving between lines" into mnc-dev
-rw-r--r--core/java/android/widget/Editor.java44
1 files changed, 35 insertions, 9 deletions
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index d0b616050af0..bde8dcf9ff02 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -4421,6 +4421,10 @@ public class Editor {
// Indicates whether the user is selecting text and using the drag accelerator.
private boolean mDragAcceleratorActive;
private boolean mHaventMovedEnoughToStartDrag;
+ // The line that a selection happened most recently with the drag accelerator.
+ private int mLineSelectionIsOn = -1;
+ // Whether the drag accelerator has selected past the initial line.
+ private boolean mSwitchedLines = false;
SelectionModifierCursorController() {
resetTouchOffsets();
@@ -4473,6 +4477,7 @@ public class Editor {
// Start location of selection.
mStartOffset = mTextView.getOffsetForPosition(mLastDownPositionX,
mLastDownPositionY);
+ mLineSelectionIsOn = mTextView.getLineAtCoordinate(mLastDownPositionY);
// Don't show the handles until user has lifted finger.
hide();
@@ -4556,17 +4561,35 @@ public class Editor {
break;
}
- if (mStartOffset != -1) {
+ if (mStartOffset != -1 && mTextView.getLayout() != null) {
if (!mHaventMovedEnoughToStartDrag) {
- // Offset the finger by the same vertical offset as the handles. This
- // improves visibility of the content being selected by shifting
- // the finger below the content.
- final float fingerOffset = (mStartHandle != null)
- ? mStartHandle.getIdealVerticalOffset()
- : touchSlop;
- int offset =
- mTextView.getOffsetForPosition(eventX, eventY - fingerOffset);
+
+ float y = eventY;
+ if (mSwitchedLines) {
+ // Offset the finger by the same vertical offset as the handles.
+ // This improves visibility of the content being selected by
+ // shifting the finger below the content, this is applied once
+ // the user has switched lines.
+ final float fingerOffset = (mStartHandle != null)
+ ? mStartHandle.getIdealVerticalOffset()
+ : touchSlop;
+ y = eventY - fingerOffset;
+ }
+
+ final int currLine = getCurrentLineAdjustedForSlop(
+ mTextView.getLayout(),
+ mLineSelectionIsOn, y);
+ if (!mSwitchedLines && currLine != mLineSelectionIsOn) {
+ // Break early here, we want to offset the finger position from
+ // the selection highlight, once the user moved their finger
+ // to a different line we should apply the offset and *not* switch
+ // lines until recomputing the position with the finger offset.
+ mSwitchedLines = true;
+ break;
+ }
+
int startOffset;
+ int offset = mTextView.getOffsetAtCoordinate(currLine, eventX);
// Snap to word boundaries.
if (mStartOffset < offset) {
// Expanding with end handle.
@@ -4577,6 +4600,7 @@ public class Editor {
offset = getWordStart(offset);
startOffset = getWordEnd(mStartOffset);
}
+ mLineSelectionIsOn = currLine;
Selection.setSelection((Spannable) mTextView.getText(),
startOffset, offset);
}
@@ -4613,6 +4637,7 @@ public class Editor {
startSelectionActionMode();
mDragAcceleratorActive = false;
mStartOffset = -1;
+ mSwitchedLines = false;
}
break;
}
@@ -4642,6 +4667,7 @@ public class Editor {
mMinTouchOffset = mMaxTouchOffset = -1;
mStartOffset = -1;
mDragAcceleratorActive = false;
+ mSwitchedLines = false;
}
/**