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:
Родитель
62f0dee235
Коммит
ddabf3fd56
|
@ -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));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче