diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/Event.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/Event.java index bd3b06b16e6..e8976cce961 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/Event.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/Event.java @@ -38,6 +38,15 @@ public abstract class Event { private long mTimestampMs; private int mUniqueID = sUniqueID++; + // Android native Event times use 'uptimeMillis', and historically we've used `uptimeMillis` + // throughout this Event class as the coalescing key for events, and for other purposes. + // To get an accurate(ish) absolute UNIX time for the event, we store the initial clock time here. + // uptimeMillis can then be added to this to get an accurate UNIX time. + // However, we still default to uptimeMillis: you must explicitly request UNIX time if you want + // that; see `getUnixTimestampMs`. + public static final long sInitialClockTimeUnixOffset = + SystemClock.currentTimeMillis() - SystemClock.uptimeMillis(); + protected Event() {} @Deprecated @@ -58,8 +67,10 @@ public abstract class Event { protected void init(int surfaceId, int viewTag) { mSurfaceId = surfaceId; mViewTag = viewTag; - mTimestampMs = SystemClock.uptimeMillis(); mInitialized = true; + + // This is a *relative* time. See `getUnixTimestampMs`. + mTimestampMs = SystemClock.uptimeMillis(); } /** @return the view id for the view that generated this event */ @@ -80,6 +91,11 @@ public abstract class Event { return mTimestampMs; } + /** @return the time at which the event happened as a UNIX timestamp, in milliseconds. */ + public final long getUnixTimestampMs() { + return sInitialClockTimeUnixOffset + mTimestampMs; + } + /** @return false if this Event can *never* be coalesced */ public boolean canCoalesce() { return true; diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.java index 187e6121160..b67f6e3eff0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.java @@ -64,7 +64,7 @@ public class TouchesHelper { touch.putDouble(LOCATION_Y_KEY, PixelUtil.toDIPFromPixel(locationY)); touch.putInt(TARGET_SURFACE_KEY, surfaceId); touch.putInt(TARGET_KEY, reactTarget); - touch.putDouble(TIMESTAMP_KEY, event.getTimestampMs()); + touch.putDouble(TIMESTAMP_KEY, event.getUnixTimestampMs()); touch.putDouble(POINTER_IDENTIFIER_KEY, motionEvent.getPointerId(index)); touches.pushMap(touch); }