Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Side by Side Diff: content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java

Issue 2054193002: Android mouse events shouldn't appear as TouchEvents (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed a test, etc. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.content.browser; 5 package org.chromium.content.browser;
6 6
7 import android.annotation.SuppressLint; 7 import android.annotation.SuppressLint;
8 import android.annotation.TargetApi; 8 import android.annotation.TargetApi;
9 import android.app.Activity; 9 import android.app.Activity;
10 import android.app.SearchManager; 10 import android.app.SearchManager;
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 public boolean isGamepadAPIActive() { 1012 public boolean isGamepadAPIActive() {
1013 return GamepadList.isGamepadAPIActive(); 1013 return GamepadList.isGamepadAPIActive();
1014 } 1014 }
1015 1015
1016 // End FrameLayout overrides. 1016 // End FrameLayout overrides.
1017 1017
1018 /** 1018 /**
1019 * @see View#onTouchEvent(MotionEvent) 1019 * @see View#onTouchEvent(MotionEvent)
1020 */ 1020 */
1021 public boolean onTouchEvent(MotionEvent event) { 1021 public boolean onTouchEvent(MotionEvent event) {
1022 // TODO(mustaq): Should we include MotionEvent.TOOL_TYPE_STYLUS here?
1023 // crbug.com/592082
1024 if (event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE) {
1025 // Mouse button info is incomplete on L and below
1026 int apiVersion = Build.VERSION.SDK_INT;
1027 if (apiVersion >= android.os.Build.VERSION_CODES.M) {
1028 return sendMouseEvent(event);
1029 }
1030 }
1031
1022 final boolean isTouchHandleEvent = false; 1032 final boolean isTouchHandleEvent = false;
1023 return onTouchEventImpl(event, isTouchHandleEvent); 1033 return sendTouchEvent(event, isTouchHandleEvent);
1034 }
1035
1036 @TargetApi(Build.VERSION_CODES.M)
1037 private boolean sendMouseEvent(MotionEvent event) {
1038 TraceEvent.begin("sendMouseEvent");
1039
1040 MotionEvent offsetEvent = createOffsetMotionEvent(event);
1041 try {
1042 mContainerView.removeCallbacks(mFakeMouseMoveRunnable);
1043 if (mNativeContentViewCore == 0) return false;
1044
1045 int eventAction = event.getActionMasked();
1046
1047 // For mousedown and mouseup events, we use ACTION_BUTTON_PRESS
1048 // and ACTION_BUTTON_RELEASE respectively because they provide
1049 // info about the changed-button.
1050 if (eventAction == MotionEvent.ACTION_DOWN || eventAction == MotionE vent.ACTION_UP) {
1051 return false;
1052 }
1053
1054 nativeSendMouseEvent(mNativeContentViewCore, event.getEventTime(), e ventAction,
1055 offsetEvent.getX(), offsetEvent.getY(), event.getPointerId(0 ),
1056 event.getPressure(0), event.getOrientation(0),
1057 event.getAxisValue(MotionEvent.AXIS_TILT, 0), event.getActio nButton(),
1058 event.getButtonState(), event.getMetaState(), event.getToolT ype(0));
1059 return true;
1060 } finally {
1061 offsetEvent.recycle();
1062 TraceEvent.end("sendMouseEvent");
1063 }
1024 } 1064 }
1025 1065
1026 /** 1066 /**
1027 * Called by PopupWindow-based touch handles. 1067 * Called by PopupWindow-based touch handles.
1028 * @param event the MotionEvent targeting the handle. 1068 * @param event the MotionEvent targeting the handle.
1029 */ 1069 */
1030 public boolean onTouchHandleEvent(MotionEvent event) { 1070 public boolean onTouchHandleEvent(MotionEvent event) {
1031 final boolean isTouchHandleEvent = true; 1071 final boolean isTouchHandleEvent = true;
1032 return onTouchEventImpl(event, isTouchHandleEvent); 1072 return sendTouchEvent(event, isTouchHandleEvent);
1033 } 1073 }
1034 1074
1035 private boolean onTouchEventImpl(MotionEvent event, boolean isTouchHandleEve nt) { 1075 private boolean sendTouchEvent(MotionEvent event, boolean isTouchHandleEvent ) {
1036 TraceEvent.begin("onTouchEvent"); 1076 TraceEvent.begin("sendTouchEvent");
1037 try { 1077 try {
1038 int eventAction = event.getActionMasked(); 1078 int eventAction = event.getActionMasked();
1039 1079
1040 if (eventAction == MotionEvent.ACTION_DOWN) { 1080 if (eventAction == MotionEvent.ACTION_DOWN) {
1041 cancelRequestToScrollFocusedEditableNodeIntoView(); 1081 cancelRequestToScrollFocusedEditableNodeIntoView();
1042 } 1082 }
1043 1083
1044 if (SPenSupport.isSPenSupported(mContext)) { 1084 if (SPenSupport.isSPenSupported(mContext)) {
1045 eventAction = SPenSupport.convertSPenEventAction(eventAction); 1085 eventAction = SPenSupport.convertSPenEventAction(eventAction);
1046 } 1086 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1085 event.getRawX(), event.getRawY(), 1125 event.getRawX(), event.getRawY(),
1086 event.getToolType(0), 1126 event.getToolType(0),
1087 pointerCount > 1 ? event.getToolType(1) : MotionEvent.TOOL_T YPE_UNKNOWN, 1127 pointerCount > 1 ? event.getToolType(1) : MotionEvent.TOOL_T YPE_UNKNOWN,
1088 event.getButtonState(), 1128 event.getButtonState(),
1089 event.getMetaState(), 1129 event.getMetaState(),
1090 isTouchHandleEvent); 1130 isTouchHandleEvent);
1091 1131
1092 if (offset != null) offset.recycle(); 1132 if (offset != null) offset.recycle();
1093 return consumed; 1133 return consumed;
1094 } finally { 1134 } finally {
1095 TraceEvent.end("onTouchEvent"); 1135 TraceEvent.end("sendTouchEvent");
1096 } 1136 }
1097 } 1137 }
1098 1138
1099 @CalledByNative 1139 @CalledByNative
1100 private void requestDisallowInterceptTouchEvent() { 1140 private void requestDisallowInterceptTouchEvent() {
1101 mContainerView.requestDisallowInterceptTouchEvent(true); 1141 mContainerView.requestDisallowInterceptTouchEvent(true);
1102 } 1142 }
1103 1143
1104 private static boolean isValidTouchEventActionForNative(int eventAction) { 1144 private static boolean isValidTouchEventActionForNative(int eventAction) {
1105 // Only these actions have any effect on gesture detection. Other 1145 // Only these actions have any effect on gesture detection. Other
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
1566 1606
1567 /** 1607 /**
1568 * @see View#onHoverEvent(MotionEvent) 1608 * @see View#onHoverEvent(MotionEvent)
1569 * Mouse move events are sent on hover enter, hover move and hover exit. 1609 * Mouse move events are sent on hover enter, hover move and hover exit.
1570 * They are sent on hover exit because sometimes it acts as both a hover 1610 * They are sent on hover exit because sometimes it acts as both a hover
1571 * move and hover exit. 1611 * move and hover exit.
1572 */ 1612 */
1573 public boolean onHoverEvent(MotionEvent event) { 1613 public boolean onHoverEvent(MotionEvent event) {
1574 TraceEvent.begin("onHoverEvent"); 1614 TraceEvent.begin("onHoverEvent");
1575 1615
1616 int eventAction = event.getActionMasked();
1617
1618 // Ignore ACTION_HOVER_ENTER & ACTION_HOVER_EXIT: every mouse-down on
1619 // Android follows a hover-exit and is followed by a hover-enter. The
1620 // MotionEvent spec seems to support this behavior indirectly.
1621 if (eventAction == MotionEvent.ACTION_HOVER_ENTER
1622 || eventAction == MotionEvent.ACTION_HOVER_EXIT) {
1623 return false;
1624 }
1625
1576 MotionEvent offset = createOffsetMotionEvent(event); 1626 MotionEvent offset = createOffsetMotionEvent(event);
1577 try { 1627 try {
1578 if (mBrowserAccessibilityManager != null && !mIsObscuredByAnotherVie w) { 1628 if (mBrowserAccessibilityManager != null && !mIsObscuredByAnotherVie w) {
1579 return mBrowserAccessibilityManager.onHoverEvent(offset); 1629 return mBrowserAccessibilityManager.onHoverEvent(offset);
1580 } 1630 }
1581 1631
1582 // Work around Android bug where the x, y coordinates of a hover exi t
1583 // event are incorrect when touch exploration is on.
1584 if (mTouchExplorationEnabled && offset.getAction() == MotionEvent.AC TION_HOVER_EXIT) {
1585 return true;
1586 }
1587
1588 // TODO(lanwei): Remove this switch once experimentation is complete - 1632 // TODO(lanwei): Remove this switch once experimentation is complete -
1589 // crbug.com/418188 1633 // crbug.com/418188
1590 if (event.getToolType(0) == MotionEvent.TOOL_TYPE_FINGER) { 1634 if (event.getToolType(0) == MotionEvent.TOOL_TYPE_FINGER) {
1591 if (mEnableTouchHover == null) { 1635 if (mEnableTouchHover == null) {
1592 mEnableTouchHover = 1636 mEnableTouchHover =
1593 CommandLine.getInstance().hasSwitch(ContentSwitches. ENABLE_TOUCH_HOVER); 1637 CommandLine.getInstance().hasSwitch(ContentSwitches. ENABLE_TOUCH_HOVER);
1594 } 1638 }
1595 if (!mEnableTouchHover.booleanValue()) return false; 1639 if (!mEnableTouchHover.booleanValue()) return false;
1596 } 1640 }
1597 1641
1598 mContainerView.removeCallbacks(mFakeMouseMoveRunnable); 1642 mContainerView.removeCallbacks(mFakeMouseMoveRunnable);
1599 if (mNativeContentViewCore != 0) { 1643 if (mNativeContentViewCore != 0) {
1600 nativeSendMouseMoveEvent(mNativeContentViewCore, offset.getEvent Time(), 1644 nativeSendMouseEvent(mNativeContentViewCore, event.getEventTime( ), eventAction,
1601 offset.getX(), offset.getY(), event.getToolType(0)); 1645 offset.getX(), offset.getY(), event.getPointerId(0), eve nt.getPressure(0),
1646 event.getOrientation(0), event.getAxisValue(MotionEvent. AXIS_TILT, 0),
1647 0 /* changedButton */, event.getButtonState(), event.get MetaState(),
1648 event.getToolType(0));
1602 } 1649 }
1603 return true; 1650 return true;
1604 } finally { 1651 } finally {
1605 offset.recycle(); 1652 offset.recycle();
1606 TraceEvent.end("onHoverEvent"); 1653 TraceEvent.end("onHoverEvent");
1607 } 1654 }
1608 } 1655 }
1609 1656
1610 /** 1657 /**
1611 * @see View#onGenericMotionEvent(MotionEvent) 1658 * @see View#onGenericMotionEvent(MotionEvent)
1612 */ 1659 */
1613 public boolean onGenericMotionEvent(MotionEvent event) { 1660 public boolean onGenericMotionEvent(MotionEvent event) {
1614 if (GamepadList.onGenericMotionEvent(event)) return true; 1661 if (GamepadList.onGenericMotionEvent(event)) return true;
1615 if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { 1662 if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
1616 mLastFocalEventX = event.getX(); 1663 mLastFocalEventX = event.getX();
1617 mLastFocalEventY = event.getY(); 1664 mLastFocalEventY = event.getY();
1618 switch (event.getAction()) { 1665 switch (event.getActionMasked()) {
1619 case MotionEvent.ACTION_SCROLL: 1666 case MotionEvent.ACTION_SCROLL:
1620 if (mNativeContentViewCore == 0) return false; 1667 if (mNativeContentViewCore == 0) return false;
1621 1668
1622 nativeSendMouseWheelEvent(mNativeContentViewCore, event.getE ventTime(), 1669 nativeSendMouseWheelEvent(mNativeContentViewCore, event.getE ventTime(),
1623 event.getX(), event.getY(), 1670 event.getX(), event.getY(),
1624 event.getAxisValue(MotionEvent.AXIS_HSCROLL), 1671 event.getAxisValue(MotionEvent.AXIS_HSCROLL),
1625 event.getAxisValue(MotionEvent.AXIS_VSCROLL), 1672 event.getAxisValue(MotionEvent.AXIS_VSCROLL),
1626 mRenderCoordinates.getWheelScrollFactor()); 1673 mRenderCoordinates.getWheelScrollFactor());
1627 1674
1675 // TODO(mustaq): Delete mFakeMouseMoveRunnable, see crbug.co m/492738
1628 mContainerView.removeCallbacks(mFakeMouseMoveRunnable); 1676 mContainerView.removeCallbacks(mFakeMouseMoveRunnable);
1629 // Send a delayed onMouseMove event so that we end 1677 // Send a delayed onMouseMove event so that we end
1630 // up hovering over the right position after the scroll. 1678 // up hovering over the right position after the scroll.
1631 final MotionEvent eventFakeMouseMove = MotionEvent.obtain(ev ent); 1679 final MotionEvent eventFakeMouseMove = MotionEvent.obtain(ev ent);
1632 mFakeMouseMoveRunnable = new Runnable() { 1680 mFakeMouseMoveRunnable = new Runnable() {
1633 @Override 1681 @Override
1634 public void run() { 1682 public void run() {
1635 onHoverEvent(eventFakeMouseMove); 1683 onHoverEvent(eventFakeMouseMove);
1636 eventFakeMouseMove.recycle(); 1684 eventFakeMouseMove.recycle();
1637 } 1685 }
1638 }; 1686 };
1639 mContainerView.postDelayed(mFakeMouseMoveRunnable, 250); 1687 mContainerView.postDelayed(mFakeMouseMoveRunnable, 250);
1640 return true; 1688 return true;
1689 case MotionEvent.ACTION_BUTTON_PRESS:
1690 case MotionEvent.ACTION_BUTTON_RELEASE:
1691 // TODO(mustaq): Should we include MotionEvent.TOOL_TYPE_STY LUS here?
1692 // crbug.com/592082
1693 if (event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE) {
1694 return sendMouseEvent(event);
1695 }
1641 } 1696 }
1642 } else if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) { 1697 } else if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
1643 if (mJoystickScrollProvider.onMotion(event)) return true; 1698 if (mJoystickScrollProvider.onMotion(event)) return true;
1644 if (mJoystickZoomProvider == null) { 1699 if (mJoystickZoomProvider == null) {
1645 mJoystickZoomProvider = 1700 mJoystickZoomProvider =
1646 new JoystickZoomProvider(this, new SystemAnimationInterv alProvider()); 1701 new JoystickZoomProvider(this, new SystemAnimationInterv alProvider());
1647 } 1702 }
1648 if (mJoystickZoomProvider.onMotion(event)) return true; 1703 if (mJoystickZoomProvider.onMotion(event)) return true;
1649 } 1704 }
1650 return mContainerViewInternals.super_onGenericMotionEvent(event); 1705 return mContainerViewInternals.super_onGenericMotionEvent(event);
(...skipping 1691 matching lines...) Expand 10 before | Expand all | Expand 10 after
3342 int pointerId0, int pointerId1, 3397 int pointerId0, int pointerId1,
3343 float touchMajor0, float touchMajor1, 3398 float touchMajor0, float touchMajor1,
3344 float touchMinor0, float touchMinor1, 3399 float touchMinor0, float touchMinor1,
3345 float orientation0, float orientation1, 3400 float orientation0, float orientation1,
3346 float tilt0, float tilt1, 3401 float tilt0, float tilt1,
3347 float rawX, float rawY, 3402 float rawX, float rawY,
3348 int androidToolType0, int androidToolType1, 3403 int androidToolType0, int androidToolType1,
3349 int androidButtonState, int androidMetaState, 3404 int androidButtonState, int androidMetaState,
3350 boolean isTouchHandleEvent); 3405 boolean isTouchHandleEvent);
3351 3406
3352 private native int nativeSendMouseMoveEvent( 3407 private native int nativeSendMouseEvent(long nativeContentViewCoreImpl, long timeMs, int action,
3353 long nativeContentViewCoreImpl, long timeMs, float x, float y, int t oolType); 3408 float x, float y, int pointerId, float pressure, float orientaton, f loat tilt,
3409 int changedButton, int buttonState, int metaState, int toolType);
3354 3410
3355 private native int nativeSendMouseWheelEvent(long nativeContentViewCoreImpl, long timeMs, 3411 private native int nativeSendMouseWheelEvent(long nativeContentViewCoreImpl, long timeMs,
3356 float x, float y, float ticksX, float ticksY, float pixelsPerTick); 3412 float x, float y, float ticksX, float ticksY, float pixelsPerTick);
3357 3413
3358 private native void nativeScrollBegin(long nativeContentViewCoreImpl, long t imeMs, float x, 3414 private native void nativeScrollBegin(long nativeContentViewCoreImpl, long t imeMs, float x,
3359 float y, float hintX, float hintY, boolean targetViewport); 3415 float y, float hintX, float hintY, boolean targetViewport);
3360 3416
3361 private native void nativeScrollEnd(long nativeContentViewCoreImpl, long tim eMs); 3417 private native void nativeScrollEnd(long nativeContentViewCoreImpl, long tim eMs);
3362 3418
3363 private native void nativeScrollBy( 3419 private native void nativeScrollBy(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
3426 String textTrackTextShadow, String textTrackTextSize); 3482 String textTrackTextShadow, String textTrackTextSize);
3427 3483
3428 private native void nativeExtractSmartClipData(long nativeContentViewCoreImp l, 3484 private native void nativeExtractSmartClipData(long nativeContentViewCoreImp l,
3429 int x, int y, int w, int h); 3485 int x, int y, int w, int h);
3430 3486
3431 private native void nativeSetBackgroundOpaque(long nativeContentViewCoreImpl , boolean opaque); 3487 private native void nativeSetBackgroundOpaque(long nativeContentViewCoreImpl , boolean opaque);
3432 private native boolean nativeIsTouchDragDropEnabled(long nativeContentViewCo reImpl); 3488 private native boolean nativeIsTouchDragDropEnabled(long nativeContentViewCo reImpl);
3433 private native void nativeOnDragEvent(long nativeContentViewCoreImpl, int ac tion, int x, int y, 3489 private native void nativeOnDragEvent(long nativeContentViewCoreImpl, int ac tion, int x, int y,
3434 int screenX, int screenY, String[] mimeTypes, String content); 3490 int screenX, int screenY, String[] mimeTypes, String content);
3435 } 3491 }
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.cc ('k') | ui/events/android/motion_event_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698