From 90997c26e37187a27336748fbd95d91a2c9db5d6 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Tue, 16 Jun 2020 14:58:01 -0700 Subject: [PATCH] RN: Cleanup `ImageLoadEvent` Logic (Android) Summary: Cleans up `ImageLoadEvent` to minimize constructor confusion and to make the dispatching logic more predictable. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D22023141 fbshipit-source-id: 17e66de867f51121a3f9a6b782dbad700a54231a --- .../react/views/image/ImageLoadEvent.java | 77 ++++++++++--------- .../react/views/image/ReactImageView.java | 13 +--- 2 files changed, 46 insertions(+), 44 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 b1326335e3d622..271f6838e8c547 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 @@ -30,41 +30,45 @@ public class ImageLoadEvent extends Event { public static final int ON_PROGRESS = 5; private final int mEventType; - private final @Nullable String mImageUri; + private final @Nullable String mErrorMessage; + private final @Nullable String mSourceUri; private final int mWidth; private final int mHeight; - private final @Nullable String mImageError; - public ImageLoadEvent(int viewId, @ImageEventType int eventType) { - this(viewId, eventType, null); + public static final ImageLoadEvent createLoadStartEvent(int viewId) { + return new ImageLoadEvent(viewId, ON_LOAD_START); } - public ImageLoadEvent(int viewId, @ImageEventType int eventType, boolean error, String message) { - this(viewId, eventType, null, 0, 0, message); + public static final ImageLoadEvent createLoadEvent( + int viewId, @Nullable String imageUri, int width, int height) { + return new ImageLoadEvent(viewId, ON_LOAD, null, imageUri, width, height); } - public ImageLoadEvent(int viewId, @ImageEventType int eventType, String imageUri) { - this(viewId, eventType, imageUri, 0, 0, null); + public static final ImageLoadEvent createErrorEvent(int viewId, Throwable throwable) { + return new ImageLoadEvent(viewId, ON_ERROR, throwable.getMessage(), null, 0, 0); } - public ImageLoadEvent( - int viewId, @ImageEventType int eventType, @Nullable String imageUri, int width, int height) { - this(viewId, eventType, imageUri, width, height, null); + public static final ImageLoadEvent createLoadEndEvent(int viewId) { + return new ImageLoadEvent(viewId, ON_LOAD_END); } - public ImageLoadEvent( + private ImageLoadEvent(int viewId, @ImageEventType int eventType) { + this(viewId, eventType, null, null, 0, 0); + } + + private ImageLoadEvent( int viewId, @ImageEventType int eventType, - @Nullable String imageUri, + @Nullable String errorMessage, + @Nullable String sourceUri, int width, - int height, - @Nullable String message) { + int height) { super(viewId); mEventType = eventType; - mImageUri = imageUri; + mErrorMessage = errorMessage; + mSourceUri = sourceUri; mWidth = width; mHeight = height; - mImageError = message; } public static String eventNameForType(@ImageEventType int eventType) { @@ -100,26 +104,29 @@ public short getCoalescingKey() { public void dispatch(RCTEventEmitter rctEventEmitter) { WritableMap eventData = null; - if (mImageUri != null || (mEventType == ON_LOAD || mEventType == ON_ERROR)) { - eventData = Arguments.createMap(); - - if (mImageUri != null) { - eventData.putString("uri", mImageUri); - } - - if (mEventType == ON_LOAD) { - WritableMap source = Arguments.createMap(); - source.putDouble("width", mWidth); - source.putDouble("height", mHeight); - if (mImageUri != null) { - source.putString("url", mImageUri); - } - eventData.putMap("source", source); - } else if (mEventType == ON_ERROR) { - eventData.putString("error", mImageError); - } + switch (mEventType) { + case ON_LOAD: + eventData = Arguments.createMap(); + // TODO: Remove this (to be less redundant and to be consistent with iOS). + eventData.putString("uri", mSourceUri); + eventData.putMap("source", createEventDataSource()); + break; + case ON_ERROR: + eventData = Arguments.createMap(); + // TODO: Remove this (to be less redundant and to be consistent with iOS). + eventData.putString("uri", mSourceUri); + eventData.putString("error", mErrorMessage); + break; } rctEventEmitter.receiveEvent(getViewTag(), getEventName(), eventData); } + + private WritableMap createEventDataSource() { + WritableMap source = Arguments.createMap(); + source.putDouble("width", mWidth); + source.putDouble("height", mHeight); + source.putString("url", mSourceUri); + return source; + } } 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 515b2c4c419c20..d2dde40b443f74 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 @@ -240,8 +240,7 @@ public void setShouldNotifyLoadEvents(boolean shouldNotify) { new BaseControllerListener() { @Override public void onSubmit(String id, Object callerContext) { - mEventDispatcher.dispatchEvent( - new ImageLoadEvent(getId(), ImageLoadEvent.ON_LOAD_START)); + mEventDispatcher.dispatchEvent(ImageLoadEvent.createLoadStartEvent(getId())); } @Override @@ -249,22 +248,18 @@ public void onFinalImageSet( String id, @Nullable final ImageInfo imageInfo, @Nullable Animatable animatable) { if (imageInfo != null) { mEventDispatcher.dispatchEvent( - new ImageLoadEvent( + ImageLoadEvent.createLoadEvent( getId(), - ImageLoadEvent.ON_LOAD, mImageSource.getSource(), imageInfo.getWidth(), imageInfo.getHeight())); - mEventDispatcher.dispatchEvent( - new ImageLoadEvent(getId(), ImageLoadEvent.ON_LOAD_END)); + mEventDispatcher.dispatchEvent(ImageLoadEvent.createLoadEndEvent(getId())); } } @Override public void onFailure(String id, Throwable throwable) { - mEventDispatcher.dispatchEvent( - new ImageLoadEvent( - getId(), ImageLoadEvent.ON_ERROR, true, throwable.getMessage())); + mEventDispatcher.dispatchEvent(ImageLoadEvent.createErrorEvent(getId(), throwable)); } }; }