diff options
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 2355c87b66e3..0d4791b82e5a 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -4825,11 +4825,8 @@ public final class ViewRootImpl implements ViewParent, protected int onProcess(QueuedInputEvent q) { if (q.mEvent instanceof KeyEvent) { return processKeyEvent(q); - } else { - final int source = q.mEvent.getSource(); - if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) { - return processPointerEvent(q); - } + } else if (q.mEvent instanceof MotionEvent) { + return processMotionEvent(q); } return FORWARD; } @@ -4853,6 +4850,23 @@ public final class ViewRootImpl implements ViewParent, return FORWARD; } + private int processMotionEvent(QueuedInputEvent q) { + final MotionEvent event = (MotionEvent) q.mEvent; + + if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { + return processPointerEvent(q); + } + + // If the motion event is from an absolute position device, exit touch mode + final int action = event.getActionMasked(); + if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_SCROLL) { + if (event.isFromSource(InputDevice.SOURCE_CLASS_POSITION)) { + ensureTouchMode(false); + } + } + return FORWARD; + } + private int processPointerEvent(QueuedInputEvent q) { final MotionEvent event = (MotionEvent)q.mEvent; @@ -5185,6 +5199,12 @@ public final class ViewRootImpl implements ViewParent, private int processGenericMotionEvent(QueuedInputEvent q) { final MotionEvent event = (MotionEvent)q.mEvent; + if (event.isFromSource(InputDevice.SOURCE_TOUCHPAD)) { + if (hasPointerCapture() && mView.dispatchCapturedPointerEvent(event)) { + return FINISH_HANDLED; + } + } + // Deliver the event to the view. if (mView.dispatchGenericMotionEvent(event)) { return FINISH_HANDLED; |