diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.java index 67534e698ac..e7e69919f91 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.java @@ -154,7 +154,6 @@ public class PointerEvent extends Event { // https://www.w3.org/TR/pointerevents/#pointerevent-interface pointerEvent.putDouble("pointerId", pointerId); - pointerEvent.putDouble("pressure", mMotionEvent.getPressure(index)); String pointerType = PointerEventHelper.getW3CPointerType(mMotionEvent.getToolType(index)); pointerEvent.putString("pointerType", pointerType); @@ -188,17 +187,29 @@ public class PointerEvent extends Event { pointerEvent.putInt("target", this.getViewTag()); pointerEvent.putDouble("timestamp", this.getTimestampMs()); + pointerEvent.putInt("detail", 0); + pointerEvent.putDouble("tiltX", 0); + pointerEvent.putDouble("tiltY", 0); + if (pointerType.equals(PointerEventHelper.POINTER_TYPE_MOUSE)) { pointerEvent.putDouble("width", 1); pointerEvent.putDouble("height", 1); - pointerEvent.putDouble("tiltX", 0); - pointerEvent.putDouble("tiltY", 0); + } else { + float majorAxis = PixelUtil.toDIPFromPixel(mMotionEvent.getTouchMajor(index)); + pointerEvent.putDouble("width", majorAxis); + pointerEvent.putDouble("height", majorAxis); } - int buttons = mMotionEvent.getButtonState(); - pointerEvent.putInt("buttons", buttons); + int buttonState = mMotionEvent.getButtonState(); pointerEvent.putInt( - "button", PointerEventHelper.getButtonChange(mEventState.getLastButtonState(), buttons)); + "button", + PointerEventHelper.getButtonChange( + pointerType, mEventState.getLastButtonState(), buttonState)); + pointerEvent.putInt( + "buttons", PointerEventHelper.getButtons(mEventName, pointerType, buttonState)); + + pointerEvent.putDouble( + "pressure", PointerEventHelper.getPressure(pointerEvent.getInt("buttons"), mEventName)); return pointerEvent; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEventHelper.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEventHelper.java index 9395163537d..8e1873ed94c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEventHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEventHelper.java @@ -76,8 +76,25 @@ public class PointerEventHelper { } } + // https://w3c.github.io/pointerevents/#the-buttons-property + public static int getButtons(String eventName, String pointerType, int buttonState) { + if (isExitEvent(eventName)) { + return 0; + } + if (POINTER_TYPE_TOUCH.equals(pointerType)) { + return 1; + } + return buttonState; + } + // https://w3c.github.io/pointerevents/#the-button-property - public static int getButtonChange(int lastButtonState, int currentButtonState) { + public static int getButtonChange( + String pointerType, int lastButtonState, int currentButtonState) { + // Always return 0 for touch + if (POINTER_TYPE_TOUCH.equals(pointerType)) { + return 0; + } + int changedMask = currentButtonState ^ lastButtonState; if (changedMask == 0) { return -1; @@ -170,4 +187,29 @@ public class PointerEventHelper { int source = motionEvent.getSource(); return source == InputDevice.SOURCE_MOUSE || source == InputDevice.SOURCE_CLASS_POINTER; } + + public static boolean isExitEvent(String eventName) { + switch (eventName) { + case POINTER_UP: + case POINTER_LEAVE: + case POINTER_OUT: + return true; + default: + return false; + } + } + + // https://w3c.github.io/pointerevents/#dom-pointerevent-pressure + public static double getPressure(int buttonState, String eventName) { + if (isExitEvent(eventName)) { + return 0; + } + + // Assume we don't support pressure on our platform for now + // For hardware and platforms that do not support pressure, + // the value MUST be 0.5 when in the active buttons state + // and 0 otherwise. + boolean inActiveButtonState = buttonState != 0; + return inActiveButtonState ? 0.5 : 0; + } }