From 70073664abc7ca7a2a3c7668fa021d4faaa6db72 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Thu, 28 Jan 2021 14:01:07 -0800 Subject: [PATCH] Support RCTModernEventEmitter+RCTEventEmitter in OnLayoutEvent Event class Summary: Support RCTModernEventEmitter +RCTEventEmitter in an Event class(es). This improves perf in Fabric. Migrate any constructor callsites to the new constructor and deprecate the previous one. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D26054856 fbshipit-source-id: 228cc08a624e793aff4caf36e1df8285f3b3519d --- .../react/uimanager/OnLayoutEvent.java | 23 ++++++++++++++----- .../react/uimanager/UIImplementation.java | 1 + .../react/uimanager/UIViewOperationQueue.java | 8 ++++++- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/OnLayoutEvent.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/OnLayoutEvent.java index 1278dc253d0..d7eb8de6860 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/OnLayoutEvent.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/OnLayoutEvent.java @@ -7,11 +7,11 @@ package com.facebook.react.uimanager; +import androidx.annotation.Nullable; import androidx.core.util.Pools; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.WritableMap; import com.facebook.react.uimanager.events.Event; -import com.facebook.react.uimanager.events.RCTEventEmitter; /** Event used to notify JS component about changes of its position or dimensions */ public class OnLayoutEvent extends Event { @@ -21,12 +21,18 @@ public class OnLayoutEvent extends Event { private int mX, mY, mWidth, mHeight; + @Deprecated public static OnLayoutEvent obtain(int viewTag, int x, int y, int width, int height) { + return obtain(-1, viewTag, x, y, width, height); + } + + public static OnLayoutEvent obtain( + int surfaceId, int viewTag, int x, int y, int width, int height) { OnLayoutEvent event = EVENTS_POOL.acquire(); if (event == null) { event = new OnLayoutEvent(); } - event.init(viewTag, x, y, width, height); + event.init(surfaceId, viewTag, x, y, width, height); return event; } @@ -37,8 +43,13 @@ public class OnLayoutEvent extends Event { private OnLayoutEvent() {} + @Deprecated protected void init(int viewTag, int x, int y, int width, int height) { - super.init(viewTag); + init(-1, viewTag, x, y, width, height); + } + + protected void init(int surfaceId, int viewTag, int x, int y, int width, int height) { + super.init(surfaceId, viewTag); mX = x; mY = y; mWidth = width; @@ -50,8 +61,9 @@ public class OnLayoutEvent extends Event { return "topLayout"; } + @Nullable @Override - public void dispatch(RCTEventEmitter rctEventEmitter) { + protected WritableMap getEventData() { WritableMap layout = Arguments.createMap(); layout.putDouble("x", PixelUtil.toDIPFromPixel(mX)); layout.putDouble("y", PixelUtil.toDIPFromPixel(mY)); @@ -61,7 +73,6 @@ public class OnLayoutEvent extends Event { WritableMap event = Arguments.createMap(); event.putMap("layout", layout); event.putInt("target", getViewTag()); - - rctEventEmitter.receiveEvent(getViewTag(), getEventName(), event); + return event; } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java index 08ae573089a..e0fb11950fa 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -958,6 +958,7 @@ public class UIImplementation { if (frameDidChange && cssNode.shouldNotifyOnLayout()) { mEventDispatcher.dispatchEvent( OnLayoutEvent.obtain( + -1, /* surfaceId not used in classic renderer */ tag, cssNode.getScreenX(), cssNode.getScreenY(), diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java index bb3df5f827e..da69ca8c055 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java @@ -118,7 +118,13 @@ public class UIViewOperationQueue { uiManager .getEventDispatcher() .dispatchEvent( - OnLayoutEvent.obtain(mTag, mScreenX, mScreenY, mScreenWidth, mScreenHeight)); + OnLayoutEvent.obtain( + -1 /* SurfaceId not used in classic renderer */, + mTag, + mScreenX, + mScreenY, + mScreenWidth, + mScreenHeight)); } } }