OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |