Skip to content

Commit 5fc980b

Browse files
committed
feat: handle events on Android
1 parent 4374336 commit 5fc980b

File tree

7 files changed

+215
-23
lines changed

7 files changed

+215
-23
lines changed

android/src/main/java/com/dylanvann/fastimage/FastImageRequestListener.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,15 @@
77
import com.bumptech.glide.request.RequestListener;
88
import com.bumptech.glide.request.target.ImageViewTarget;
99
import com.bumptech.glide.request.target.Target;
10+
import com.dylanvann.fastimage.events.OnErrorEvent;
11+
import com.dylanvann.fastimage.events.OnLoadEndEvent;
12+
import com.dylanvann.fastimage.events.OnLoadEvent;
13+
import com.dylanvann.fastimage.events.OnLoadStartEvent;
1014
import com.facebook.react.bridge.WritableMap;
1115
import com.facebook.react.bridge.WritableNativeMap;
1216
import com.facebook.react.uimanager.ThemedReactContext;
17+
import com.facebook.react.uimanager.UIManagerHelper;
18+
import com.facebook.react.uimanager.events.EventDispatcher;
1319
import com.facebook.react.uimanager.events.RCTEventEmitter;
1420

1521
public class FastImageRequestListener implements RequestListener<Drawable> {
@@ -22,13 +28,6 @@ public class FastImageRequestListener implements RequestListener<Drawable> {
2228
this.key = key;
2329
}
2430

25-
private static WritableMap mapFromResource(Drawable resource) {
26-
WritableMap resourceData = new WritableNativeMap();
27-
resourceData.putInt("width", resource.getIntrinsicWidth());
28-
resourceData.putInt("height", resource.getIntrinsicHeight());
29-
return resourceData;
30-
}
31-
3231
@Override
3332
public boolean onLoadFailed(@androidx.annotation.Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
3433
FastImageOkHttpProgressGlideModule.forget(key);
@@ -37,10 +36,14 @@ public boolean onLoadFailed(@androidx.annotation.Nullable GlideException e, Obje
3736
}
3837
FastImageViewWithUrl view = (FastImageViewWithUrl) ((ImageViewTarget) target).getView();
3938
ThemedReactContext context = (ThemedReactContext) view.getContext();
40-
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
4139
int viewId = view.getId();
42-
eventEmitter.receiveEvent(viewId, REACT_ON_ERROR_EVENT, new WritableNativeMap());
43-
eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_END_EVENT, new WritableNativeMap());
40+
EventDispatcher eventDispatcher =
41+
UIManagerHelper.getEventDispatcherForReactTag(context, viewId);
42+
if (eventDispatcher == null) {
43+
return false;
44+
}
45+
eventDispatcher.dispatchEvent(new OnErrorEvent(viewId));
46+
eventDispatcher.dispatchEvent(new OnLoadEndEvent(viewId));
4447
return false;
4548
}
4649

@@ -51,10 +54,14 @@ public boolean onResourceReady(Drawable resource, Object model, Target<Drawable>
5154
}
5255
FastImageViewWithUrl view = (FastImageViewWithUrl) ((ImageViewTarget) target).getView();
5356
ThemedReactContext context = (ThemedReactContext) view.getContext();
54-
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
5557
int viewId = view.getId();
56-
eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_EVENT, mapFromResource(resource));
57-
eventEmitter.receiveEvent(viewId, REACT_ON_LOAD_END_EVENT, new WritableNativeMap());
58+
EventDispatcher eventDispatcher =
59+
UIManagerHelper.getEventDispatcherForReactTag(context, viewId);
60+
if (eventDispatcher == null) {
61+
return false;
62+
}
63+
eventDispatcher.dispatchEvent(new OnLoadEvent(viewId, resource.getIntrinsicWidth(), resource.getIntrinsicHeight()));
64+
eventDispatcher.dispatchEvent(new OnLoadEndEvent(viewId));
5865
return false;
5966
}
6067
}

android/src/main/java/com/dylanvann/fastimage/FastImageViewManager.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,20 @@
1414

1515
import com.bumptech.glide.Glide;
1616
import com.bumptech.glide.RequestManager;
17+
import com.dylanvann.fastimage.events.OnLoadEndEvent;
18+
import com.dylanvann.fastimage.events.OnLoadEvent;
19+
import com.dylanvann.fastimage.events.OnLoadStartEvent;
20+
import com.dylanvann.fastimage.events.OnErrorEvent;
21+
import com.dylanvann.fastimage.events.OnProgressEvent;
1722
import com.facebook.react.bridge.ReadableMap;
1823
import com.facebook.react.bridge.WritableMap;
1924
import com.facebook.react.bridge.WritableNativeMap;
2025
import com.facebook.react.common.MapBuilder;
2126
import com.facebook.react.uimanager.SimpleViewManager;
2227
import com.facebook.react.uimanager.ThemedReactContext;
28+
import com.facebook.react.uimanager.UIManagerHelper;
2329
import com.facebook.react.uimanager.annotations.ReactProp;
30+
import com.facebook.react.uimanager.events.EventDispatcher;
2431
import com.facebook.react.uimanager.events.RCTEventEmitter;
2532
import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper;
2633
import com.facebook.react.uimanager.ViewManagerDelegate;
@@ -123,11 +130,11 @@ public void onDropViewInstance(@NonNull FastImageViewWithUrl view) {
123130
@Override
124131
public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
125132
return MapBuilder.<String, Object>builder()
126-
.put(REACT_ON_LOAD_START_EVENT, MapBuilder.of("registrationName", REACT_ON_LOAD_START_EVENT))
127-
.put(REACT_ON_PROGRESS_EVENT, MapBuilder.of("registrationName", REACT_ON_PROGRESS_EVENT))
128-
.put(REACT_ON_LOAD_EVENT, MapBuilder.of("registrationName", REACT_ON_LOAD_EVENT))
129-
.put(REACT_ON_ERROR_EVENT, MapBuilder.of("registrationName", REACT_ON_ERROR_EVENT))
130-
.put(REACT_ON_LOAD_END_EVENT, MapBuilder.of("registrationName", REACT_ON_LOAD_END_EVENT))
133+
.put(OnLoadStartEvent.EVENT_NAME, MapBuilder.of("registrationName", REACT_ON_LOAD_START_EVENT))
134+
.put(OnProgressEvent.EVENT_NAME, MapBuilder.of("registrationName", REACT_ON_PROGRESS_EVENT))
135+
.put(OnLoadEvent.EVENT_NAME, MapBuilder.of("registrationName", REACT_ON_LOAD_EVENT))
136+
.put(OnErrorEvent.EVENT_NAME, MapBuilder.of("registrationName", REACT_ON_ERROR_EVENT))
137+
.put(OnLoadEndEvent.EVENT_NAME, MapBuilder.of("registrationName", REACT_ON_LOAD_END_EVENT))
131138
.build();
132139
}
133140

@@ -136,13 +143,14 @@ public void onProgress(String key, long bytesRead, long expectedLength) {
136143
List<FastImageViewWithUrl> viewsForKey = VIEWS_FOR_URLS.get(key);
137144
if (viewsForKey != null) {
138145
for (FastImageViewWithUrl view : viewsForKey) {
139-
WritableMap event = new WritableNativeMap();
140-
event.putInt("loaded", (int) bytesRead);
141-
event.putInt("total", (int) expectedLength);
142146
ThemedReactContext context = (ThemedReactContext) view.getContext();
143-
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
144147
int viewId = view.getId();
145-
eventEmitter.receiveEvent(viewId, REACT_ON_PROGRESS_EVENT, event);
148+
EventDispatcher eventDispatcher =
149+
UIManagerHelper.getEventDispatcherForReactTag(context, viewId);
150+
if (eventDispatcher == null) {
151+
return;
152+
}
153+
eventDispatcher.dispatchEvent(new OnProgressEvent(viewId, bytesRead, expectedLength));
146154
}
147155
}
148156
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.dylanvann.fastimage.events;
2+
3+
import com.facebook.react.bridge.Arguments;
4+
import com.facebook.react.uimanager.events.Event;
5+
import com.facebook.react.uimanager.events.RCTEventEmitter;
6+
7+
public class OnErrorEvent extends Event {
8+
9+
public static final String EVENT_NAME = "topFastImageError";
10+
11+
public OnErrorEvent(int viewId) {
12+
super(viewId);
13+
}
14+
15+
@Override
16+
public String getEventName() {
17+
return EVENT_NAME;
18+
}
19+
20+
@Override
21+
public short getCoalescingKey() {
22+
// All events for a given view can be coalesced.
23+
return 0;
24+
}
25+
26+
@Override
27+
public void dispatch(RCTEventEmitter rctEventEmitter) {
28+
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), Arguments.createMap());
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.dylanvann.fastimage.events;
2+
3+
import com.facebook.react.bridge.Arguments;
4+
import com.facebook.react.uimanager.events.Event;
5+
import com.facebook.react.uimanager.events.RCTEventEmitter;
6+
7+
public class OnLoadEndEvent extends Event {
8+
9+
public static final String EVENT_NAME = "topFastImageLoadEnd";
10+
11+
public OnLoadEndEvent(int viewId) {
12+
super(viewId);
13+
}
14+
15+
@Override
16+
public String getEventName() {
17+
return EVENT_NAME;
18+
}
19+
20+
@Override
21+
public short getCoalescingKey() {
22+
// All events for a given view can be coalesced.
23+
return 0;
24+
}
25+
26+
@Override
27+
public void dispatch(RCTEventEmitter rctEventEmitter) {
28+
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), Arguments.createMap());
29+
}
30+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.dylanvann.fastimage.events;
2+
3+
import com.facebook.react.bridge.Arguments;
4+
import com.facebook.react.bridge.WritableMap;
5+
import com.facebook.react.uimanager.events.Event;
6+
import com.facebook.react.uimanager.events.RCTEventEmitter;
7+
8+
public class OnLoadEvent extends Event {
9+
10+
public static final String EVENT_NAME = "topFastImageLoad";
11+
12+
private final int mWidth;
13+
private final int mHeight;
14+
15+
public OnLoadEvent(int viewId, int width, int height) {
16+
super(viewId);
17+
mWidth = width;
18+
mHeight = height;
19+
}
20+
21+
@Override
22+
public String getEventName() {
23+
return EVENT_NAME;
24+
}
25+
26+
@Override
27+
public short getCoalescingKey() {
28+
// All events for a given view can be coalesced.
29+
return 0;
30+
}
31+
32+
@Override
33+
public void dispatch(RCTEventEmitter rctEventEmitter) {
34+
WritableMap args = Arguments.createMap();
35+
args.putInt("width", mWidth);
36+
args.putInt("height", mHeight);
37+
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), args);
38+
}
39+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.dylanvann.fastimage.events;
2+
3+
import com.facebook.react.bridge.Arguments;
4+
import com.facebook.react.bridge.WritableMap;
5+
import com.facebook.react.uimanager.events.Event;
6+
import com.facebook.react.uimanager.events.RCTEventEmitter;
7+
8+
public class OnLoadStartEvent extends Event {
9+
10+
public static final String EVENT_NAME = "topFastImageLoadStart";
11+
12+
private final long mBytesRead;
13+
private final long mExpectedLength;
14+
15+
public OnLoadStartEvent(int viewId, long bytesRead, long expectedLength) {
16+
super(viewId);
17+
mBytesRead = bytesRead;
18+
mExpectedLength = expectedLength;
19+
}
20+
21+
@Override
22+
public String getEventName() {
23+
return EVENT_NAME;
24+
}
25+
26+
@Override
27+
public short getCoalescingKey() {
28+
// All events for a given view can be coalesced.
29+
return 0;
30+
}
31+
32+
@Override
33+
public void dispatch(RCTEventEmitter rctEventEmitter) {
34+
WritableMap args = Arguments.createMap();
35+
args.putInt("loaded", (int) mBytesRead);
36+
args.putInt("total", (int) mExpectedLength);
37+
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), args);
38+
}
39+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.dylanvann.fastimage.events;
2+
3+
import com.facebook.react.bridge.Arguments;
4+
import com.facebook.react.bridge.WritableMap;
5+
import com.facebook.react.uimanager.events.Event;
6+
import com.facebook.react.uimanager.events.RCTEventEmitter;
7+
8+
public class OnProgressEvent extends Event {
9+
10+
public static final String EVENT_NAME = "topFastImageProgress";
11+
12+
private final long mBytesRead;
13+
private final long mExpectedLength;
14+
15+
public OnProgressEvent(int viewId, long bytesRead, long expectedLength) {
16+
super(viewId);
17+
mBytesRead = bytesRead;
18+
mExpectedLength = expectedLength;
19+
}
20+
21+
@Override
22+
public String getEventName() {
23+
return EVENT_NAME;
24+
}
25+
26+
@Override
27+
public short getCoalescingKey() {
28+
// All events for a given view can be coalesced.
29+
return 0;
30+
}
31+
32+
@Override
33+
public void dispatch(RCTEventEmitter rctEventEmitter) {
34+
WritableMap args = Arguments.createMap();
35+
args.putInt("loaded", (int) mBytesRead);
36+
args.putInt("total", (int) mExpectedLength);
37+
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), args);
38+
}
39+
}

0 commit comments

Comments
 (0)