summaryrefslogtreecommitdiff
path: root/core/java/android/widget/TextView.java
diff options
context:
space:
mode:
authorNikita Dubrovsky <dubrovsky@google.com>2021-03-12 09:41:53 -0800
committerNikita Dubrovsky <dubrovsky@google.com>2021-03-18 13:53:49 -0700
commit4b7b90e79182805dd52fb0b779a0b4ab08983ab0 (patch)
tree2e6044cfa9ed18cefb820c0c9079379ab56442bf /core/java/android/widget/TextView.java
parent910746fe9668b6e879fb75a7a240be7fe6168d1e (diff)
Integrate OnReceiveContentListener in View.onDragEvent
OnReceiveContentListener was already integrated with drag-and-drop in TextView. The change extends support to all subclasses of View. If an OnReceiveContentListener is set on the view, the default implementation of View.onDragEvent will now return true for an ACTION_DRAG_STARTED event and will call View.performReceiveContent for an ACTION_DROP event. Bug: 182617122 Test: atest CtsWindowManagerDeviceTestCases:CrossAppDragAndDropTests Test: atest CtsViewTestCases:ViewOnReceiveContentTest Test: atest CtsWidgetTestCases:TextViewOnReceiveContentTest Test: Manually using ReceiveContentDemo Change-Id: I98fb703220ebd1953b20dcab60d22847cc5000d8
Diffstat (limited to 'core/java/android/widget/TextView.java')
-rw-r--r--core/java/android/widget/TextView.java28
1 files changed, 27 insertions, 1 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index fdc66fcb81d8..71b5b3d67649 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -13059,11 +13059,37 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return getLayout().getOffsetForHorizontal(line, x);
}
+ /**
+ * Handles drag events sent by the system following a call to
+ * {@link android.view.View#startDragAndDrop(ClipData,DragShadowBuilder,Object,int)
+ * startDragAndDrop()}.
+ *
+ * <p>If this text view is not editable, delegates to the default {@link View#onDragEvent}
+ * implementation.
+ *
+ * <p>If this text view is editable, accepts all drag actions (returns true for an
+ * {@link android.view.DragEvent#ACTION_DRAG_STARTED ACTION_DRAG_STARTED} event and all
+ * subsequent drag events). While the drag is in progress, updates the cursor position
+ * to follow the touch location. Once a drop event is received, handles content insertion
+ * via {@link #performReceiveContent}.
+ *
+ * @param event The {@link android.view.DragEvent} sent by the system.
+ * The {@link android.view.DragEvent#getAction()} method returns an action type constant
+ * defined in DragEvent, indicating the type of drag event represented by this object.
+ * @return Returns true if this text view is editable and delegates to super otherwise.
+ * See {@link View#onDragEvent}.
+ */
@Override
public boolean onDragEvent(DragEvent event) {
+ if (mEditor == null || !mEditor.hasInsertionController()) {
+ // If this TextView is not editable, defer to the default View implementation. This
+ // will check for the presence of an OnReceiveContentListener and accept/reject
+ // drag events depending on whether the listener is/isn't set.
+ return super.onDragEvent(event);
+ }
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
- return mEditor != null && mEditor.hasInsertionController();
+ return true;
case DragEvent.ACTION_DRAG_ENTERED:
TextView.this.requestFocus();