From cfde2362817d3ba29cff9b9f818ad76b487d735b Mon Sep 17 00:00:00 2001 From: arthurhung Date: Wed, 30 Dec 2020 17:26:31 +0800 Subject: [PATCH] Move drag event to InputDispatcher (2/n) This CL adds the ability to receive a DRAG event through the InputChannel, and adds the appropriate processing logic to InputEventReceiver. Bug: 158242495 Test: atest libinput_tests Change-Id: I94d5fa545d920be52e03702d0d24712fd11c497c --- core/java/android/view/InputEventReceiver.java | 10 ++++++++++ core/jni/android_view_InputEventReceiver.cpp | 15 +++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/core/java/android/view/InputEventReceiver.java b/core/java/android/view/InputEventReceiver.java index 79d8c14aa0dfe..5e0579d8a6729 100644 --- a/core/java/android/view/InputEventReceiver.java +++ b/core/java/android/view/InputEventReceiver.java @@ -158,6 +158,16 @@ public abstract class InputEventReceiver { public void onPointerCaptureEvent(boolean pointerCaptureEnabled) { } + /** + * Called when a drag event is received, from native code. + * + * @param isExiting if false, the window associated with this input channel has just received + * drag + * if true, the window associated with this input channel has just lost drag + */ + public void onDragEvent(boolean isExiting, float x, float y) { + } + /** * Called when a batched input event is pending. * diff --git a/core/jni/android_view_InputEventReceiver.cpp b/core/jni/android_view_InputEventReceiver.cpp index 5e142fd10de00..ab6633f395a80 100644 --- a/core/jni/android_view_InputEventReceiver.cpp +++ b/core/jni/android_view_InputEventReceiver.cpp @@ -57,6 +57,7 @@ static struct { jmethodID dispatchInputEvent; jmethodID onFocusEvent; jmethodID onPointerCaptureEvent; + jmethodID onDragEvent; jmethodID onBatchedInputEventPending; } gInputEventReceiverClassInfo; @@ -400,6 +401,18 @@ status_t NativeInputEventReceiver::consumeEvents(JNIEnv* env, finishInputEvent(seq, true /* handled */); continue; } + case AINPUT_EVENT_TYPE_DRAG: { + const DragEvent* dragEvent = static_cast(inputEvent); + if (kDebugDispatchCycle) { + ALOGD("channel '%s' ~ Received drag event: isExiting=%s", + getInputChannelName().c_str(), toString(dragEvent->isExiting())); + } + env->CallVoidMethod(receiverObj.get(), gInputEventReceiverClassInfo.onDragEvent, + jboolean(dragEvent->isExiting()), dragEvent->getX(), + dragEvent->getY()); + finishInputEvent(seq, true /* handled */); + continue; + } default: assert(false); // InputConsumer should prevent this from ever happening @@ -547,6 +560,8 @@ int register_android_view_InputEventReceiver(JNIEnv* env) { gInputEventReceiverClassInfo.onPointerCaptureEvent = GetMethodIDOrDie(env, gInputEventReceiverClassInfo.clazz, "onPointerCaptureEvent", "(Z)V"); + gInputEventReceiverClassInfo.onDragEvent = + GetMethodIDOrDie(env, gInputEventReceiverClassInfo.clazz, "onDragEvent", "(ZFF)V"); gInputEventReceiverClassInfo.onBatchedInputEventPending = GetMethodIDOrDie(env, gInputEventReceiverClassInfo.clazz, "onBatchedInputEventPending", "(I)V");