summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/TextView.java40
1 files changed, 26 insertions, 14 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index ced8e9b8d0c1..396c773124b6 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -7797,6 +7797,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return new DragThumbnailBuilder(thumbnail);
}
+ private static class DragLocalState {
+ public TextView sourceTextView;
+ public int start, end;
+
+ public DragLocalState(TextView sourceTextView, int start, int end) {
+ this.sourceTextView = sourceTextView;
+ this.start = start;
+ this.end = end;
+ }
+ }
+
@Override
public boolean performLongClick() {
if (super.performLongClick()) {
@@ -7822,8 +7833,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final int end = getSelectionEnd();
CharSequence selectedText = mTransformed.subSequence(start, end);
ClipData data = ClipData.newPlainText(null, null, selectedText);
- startDrag(data, getTextThumbnailBuilder(selectedText), false, null);
- mDragSourcePositions = packRangeInLong(start, end);
+ DragLocalState localState = new DragLocalState(this, start, end);
+ startDrag(data, getTextThumbnailBuilder(selectedText), false, localState);
stopSelectionActionMode();
} else {
selectCurrentWord();
@@ -8975,9 +8986,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return true;
case DragEvent.ACTION_DRAG_ENDED:
- mDragSourcePositions = -1;
- return true;
-
case DragEvent.ACTION_DRAG_EXITED:
default:
return true;
@@ -8995,10 +9003,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final int offset = getOffset((int) event.getX(), (int) event.getY());
- if (mDragSourcePositions != -1) {
- final int dragSourceStart = extractRangeStartFromLong(mDragSourcePositions);
- final int dragSourceEnd = extractRangeEndFromLong(mDragSourcePositions);
- if (offset >= dragSourceStart && offset < dragSourceEnd) {
+ Object localState = event.getLocalState();
+ DragLocalState dragLocalState = null;
+ if (localState instanceof DragLocalState) {
+ dragLocalState = (DragLocalState) localState;
+ }
+ boolean dragDropIntoItself = dragLocalState != null &&
+ dragLocalState.sourceTextView == this;
+
+ if (dragDropIntoItself) {
+ if (offset >= dragLocalState.start && offset < dragLocalState.end) {
// A drop inside the original selection discards the drop.
return;
}
@@ -9012,9 +9026,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
Selection.setSelection((Spannable) mText, max);
((Editable) mText).replace(min, max, content);
- if (mDragSourcePositions != -1) {
- int dragSourceStart = extractRangeStartFromLong(mDragSourcePositions);
- int dragSourceEnd = extractRangeEndFromLong(mDragSourcePositions);
+ if (dragDropIntoItself) {
+ int dragSourceStart = dragLocalState.start;
+ int dragSourceEnd = dragLocalState.end;
if (max <= dragSourceStart) {
// Inserting text before selection has shifted positions
final int shift = mText.length() - originalLength;
@@ -9198,8 +9212,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private InputFilter[] mFilters = NO_FILTERS;
private static final Spanned EMPTY_SPANNED = new SpannedString("");
private static int DRAG_THUMBNAIL_MAX_TEXT_LENGTH = 20;
- // A packed range containing the drag source if it occured in that TextView. -1 otherwise.
- private long mDragSourcePositions = -1;
// System wide time for last cut or copy action.
private static long sLastCutOrCopyTime;
}