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
This commit is contained in:
Joshua Gross 2021-01-22 19:29:00 -08:00 коммит произвёл Facebook GitHub Bot
Родитель 62f0dee235
Коммит ddabf3fd56
2 изменённых файлов: 69 добавлений и 17 удалений

Просмотреть файл

@ -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<ImageLoadEvent> {
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<ImageLoadEvent> {
* @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<ImageLoadEvent> {
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<ImageLoadEvent> {
@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<ImageLoadEvent> {
break;
}
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), eventData);
return eventData;
}
private WritableMap createEventDataSource() {

Просмотреть файл

@ -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));
}
};
}