diff options
| author | 2015-06-17 17:36:30 +0000 | |
|---|---|---|
| committer | 2015-06-17 17:36:31 +0000 | |
| commit | 5279d11f258a01cfdf0a16d965b5e4cd7566b8ac (patch) | |
| tree | 8081c04bfbb7c9d605dd405c53d6428784e51351 | |
| parent | f05228822c5da6333f20dc3a29c8f064b7562e06 (diff) | |
| parent | f9f8aebdc697e6ea1deff1aa82d0cec0e1ebacef (diff) | |
Merge "Drag to select text: add some slop for moving between lines" into mnc-dev
| -rw-r--r-- | core/java/android/widget/Editor.java | 44 |
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; } /** |