From ddabf3fd567e8c24fe5862172844693d4ebaa1eb Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Fri, 22 Jan 2021 19:29:00 -0800 Subject: [PATCH] Support RCTModernEventEmitter in ImageLoadEvent Summary: Support RCTEventEmitterV2 in ImageLoadEvent for optimal Fabric perf. Backwards-compatible with non-Fabric renderer. Changelog: [Changed][Android] Old native ImageLoadEvent creation APIs have changed, and will be removed in the (distant) future. The old methods will work for now with minor perf implications for Fabric. Reviewed By: mdvacca Differential Revision: D26029773 fbshipit-source-id: c8e00e06a2f9d6682367f9099bdf7f5fc12890e0 --- .../react/views/image/ImageLoadEvent.java | 66 +++++++++++++++---- .../react/views/image/ReactImageView.java | 20 ++++-- 2 files changed, 69 insertions(+), 17 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageLoadEvent.java b/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageLoadEvent.java index 69778f028f..bfb8c6d8e3 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageLoadEvent.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageLoadEvent.java @@ -13,6 +13,7 @@ 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; +import com.facebook.react.uimanager.events.RCTModernEventEmitter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -35,8 +36,35 @@ public class ImageLoadEvent extends Event { private final int mLoaded; private final int mTotal; + @Deprecated public static final ImageLoadEvent createLoadStartEvent(int viewId) { - return new ImageLoadEvent(viewId, ON_LOAD_START); + return createLoadStartEvent(-1, viewId); + } + + @Deprecated + public static final ImageLoadEvent createProgressEvent( + int viewId, @Nullable String imageUri, int loaded, int total) { + return createProgressEvent(-1, viewId, imageUri, loaded, total); + } + + @Deprecated + public static final ImageLoadEvent createLoadEvent( + int viewId, @Nullable String imageUri, int width, int height) { + return createLoadEvent(-1, viewId, imageUri, width, height); + } + + @Deprecated + public static final ImageLoadEvent createErrorEvent(int viewId, Throwable throwable) { + return createErrorEvent(-1, viewId, throwable); + } + + @Deprecated + public static final ImageLoadEvent createLoadEndEvent(int viewId) { + return createLoadEndEvent(-1, viewId); + } + + public static final ImageLoadEvent createLoadStartEvent(int surfaceId, int viewId) { + return new ImageLoadEvent(surfaceId, viewId, ON_LOAD_START); } /** @@ -45,28 +73,31 @@ public class ImageLoadEvent extends Event { * @param total Amount that `loaded` will be when the image is fully loaded. */ public static final ImageLoadEvent createProgressEvent( - int viewId, @Nullable String imageUri, int loaded, int total) { - return new ImageLoadEvent(viewId, ON_PROGRESS, null, imageUri, 0, 0, loaded, total); + int surfaceId, int viewId, @Nullable String imageUri, int loaded, int total) { + return new ImageLoadEvent(surfaceId, viewId, ON_PROGRESS, null, imageUri, 0, 0, loaded, total); } public static final ImageLoadEvent createLoadEvent( - int viewId, @Nullable String imageUri, int width, int height) { - return new ImageLoadEvent(viewId, ON_LOAD, null, imageUri, width, height, 0, 0); + int surfaceId, int viewId, @Nullable String imageUri, int width, int height) { + return new ImageLoadEvent(surfaceId, viewId, ON_LOAD, null, imageUri, width, height, 0, 0); } - public static final ImageLoadEvent createErrorEvent(int viewId, Throwable throwable) { - return new ImageLoadEvent(viewId, ON_ERROR, throwable.getMessage(), null, 0, 0, 0, 0); + public static final ImageLoadEvent createErrorEvent( + int surfaceId, int viewId, Throwable throwable) { + return new ImageLoadEvent( + surfaceId, viewId, ON_ERROR, throwable.getMessage(), null, 0, 0, 0, 0); } - public static final ImageLoadEvent createLoadEndEvent(int viewId) { - return new ImageLoadEvent(viewId, ON_LOAD_END); + public static final ImageLoadEvent createLoadEndEvent(int surfaceId, int viewId) { + return new ImageLoadEvent(surfaceId, viewId, ON_LOAD_END); } - private ImageLoadEvent(int viewId, @ImageEventType int eventType) { - this(viewId, eventType, null, null, 0, 0, 0, 0); + private ImageLoadEvent(int surfaceId, int viewId, @ImageEventType int eventType) { + this(surfaceId, viewId, eventType, null, null, 0, 0, 0, 0); } private ImageLoadEvent( + int surfaceId, int viewId, @ImageEventType int eventType, @Nullable String errorMessage, @@ -75,7 +106,7 @@ public class ImageLoadEvent extends Event { int height, int loaded, int total) { - super(viewId); + super(surfaceId, viewId); mEventType = eventType; mErrorMessage = errorMessage; mSourceUri = sourceUri; @@ -116,6 +147,15 @@ public class ImageLoadEvent extends Event { @Override public void dispatch(RCTEventEmitter rctEventEmitter) { + rctEventEmitter.receiveEvent(getViewTag(), getEventName(), getEventData()); + } + + @Override + public void dispatchV2(RCTModernEventEmitter rctEventEmitter) { + rctEventEmitter.receiveEvent(getSurfaceId(), getViewTag(), getEventName(), getEventData()); + } + + private WritableMap getEventData() { WritableMap eventData = null; switch (mEventType) { @@ -134,7 +174,7 @@ public class ImageLoadEvent extends Event { break; } - rctEventEmitter.receiveEvent(getViewTag(), getEventName(), eventData); + return eventData; } private WritableMap createEventDataSource() { diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java index 9869fe878d..e7cee6b635 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java @@ -51,6 +51,7 @@ import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.modules.fresco.ReactNetworkImageRequest; import com.facebook.react.uimanager.FloatUtil; import com.facebook.react.uimanager.PixelUtil; +import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.UIManagerHelper; import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.react.views.imagehelper.ImageSource; @@ -250,12 +251,18 @@ public class ReactImageView extends GenericDraweeView { // TODO: Somehow get image size and convert `loaded` and `total` to image bytes. mEventDispatcher.dispatchEvent( ImageLoadEvent.createProgressEvent( - getId(), mImageSource.getSource(), loaded, total)); + UIManagerHelper.getSurfaceId(ReactImageView.this), + getId(), + mImageSource.getSource(), + loaded, + total)); } @Override public void onSubmit(String id, Object callerContext) { - mEventDispatcher.dispatchEvent(ImageLoadEvent.createLoadStartEvent(getId())); + mEventDispatcher.dispatchEvent( + ImageLoadEvent.createLoadStartEvent( + UIManagerHelper.getSurfaceId(ReactImageView.this), getId())); } @Override @@ -264,17 +271,22 @@ public class ReactImageView extends GenericDraweeView { if (imageInfo != null) { mEventDispatcher.dispatchEvent( ImageLoadEvent.createLoadEvent( + UIManagerHelper.getSurfaceId(ReactImageView.this), getId(), mImageSource.getSource(), imageInfo.getWidth(), imageInfo.getHeight())); - mEventDispatcher.dispatchEvent(ImageLoadEvent.createLoadEndEvent(getId())); + mEventDispatcher.dispatchEvent( + ImageLoadEvent.createLoadEndEvent( + UIManagerHelper.getSurfaceId(ReactImageView.this), getId())); } } @Override public void onFailure(String id, Throwable throwable) { - mEventDispatcher.dispatchEvent(ImageLoadEvent.createErrorEvent(getId(), throwable)); + mEventDispatcher.dispatchEvent( + ImageLoadEvent.createErrorEvent( + UIManagerHelper.getSurfaceId(ReactImageView.this), getId(), throwable)); } }; }