Skip to content

Commit b280204

Browse files
feat: bridgeless mode (#16)
* feat: bridgeless mode * refactor: remove logs
1 parent f1a7b2f commit b280204

File tree

8 files changed

+182
-36
lines changed

8 files changed

+182
-36
lines changed

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@
88
import com.bumptech.glide.request.target.ImageViewTarget;
99
import com.bumptech.glide.request.target.Target;
1010
import com.facebook.react.bridge.WritableMap;
11+
import com.dylanvann.fastimage.events.FastImageErrorEvent;
12+
import com.dylanvann.fastimage.events.FastImageLoadEndEvent;
13+
import com.dylanvann.fastimage.events.FastImageLoadEvent;
14+
import com.dylanvann.fastimage.events.FastImageProgressEvent;
1115
import com.facebook.react.bridge.WritableNativeMap;
1216
import com.facebook.react.uimanager.ThemedReactContext;
13-
import com.facebook.react.uimanager.events.RCTEventEmitter;
17+
import com.facebook.react.uimanager.UIManagerHelper;
18+
import com.facebook.react.uimanager.events.EventDispatcher;
1419

1520
public class FastImageRequestListener implements RequestListener<Drawable> {
1621
static final String REACT_ON_ERROR_EVENT = "onFastImageError";
@@ -37,10 +42,13 @@ public boolean onLoadFailed(@androidx.annotation.Nullable GlideException e, Obje
3742
}
3843
FastImageViewWithUrl view = (FastImageViewWithUrl) ((ImageViewTarget) target).getView();
3944
ThemedReactContext context = (ThemedReactContext) view.getContext();
40-
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
41-
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());
45+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.getId());
46+
int surfaceId = UIManagerHelper.getSurfaceId(view);
47+
48+
if (dispatcher != null) {
49+
dispatcher.dispatchEvent(new FastImageErrorEvent(surfaceId, view.getId(), null));
50+
dispatcher.dispatchEvent(new FastImageLoadEndEvent(surfaceId, view.getId()));
51+
}
4452
return false;
4553
}
4654

@@ -51,10 +59,13 @@ public boolean onResourceReady(Drawable resource, Object model, Target<Drawable>
5159
}
5260
FastImageViewWithUrl view = (FastImageViewWithUrl) ((ImageViewTarget) target).getView();
5361
ThemedReactContext context = (ThemedReactContext) view.getContext();
54-
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
55-
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());
62+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.getId());
63+
int surfaceId = UIManagerHelper.getSurfaceId(view);
64+
65+
if (dispatcher != null) {
66+
dispatcher.dispatchEvent(new FastImageLoadEvent(surfaceId, view.getId()));
67+
dispatcher.dispatchEvent(new FastImageLoadEndEvent(surfaceId, view.getId()));
68+
}
5869
return false;
5970
}
6071
}

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,19 @@
1414

1515
import com.bumptech.glide.Glide;
1616
import com.bumptech.glide.RequestManager;
17+
import com.dylanvann.fastimage.events.FastImageProgressEvent;
18+
import com.facebook.react.bridge.ReactApplicationContext;
19+
import com.facebook.react.bridge.ReactContext;
1720
import com.facebook.react.bridge.ReadableMap;
1821
import com.facebook.react.bridge.WritableMap;
1922
import com.facebook.react.bridge.WritableNativeMap;
2023
import com.facebook.react.common.MapBuilder;
2124
import com.facebook.react.uimanager.SimpleViewManager;
2225
import com.facebook.react.uimanager.ThemedReactContext;
26+
import com.facebook.react.uimanager.UIManagerHelper;
27+
import com.facebook.react.uimanager.common.ViewUtil;
28+
import com.facebook.react.uimanager.events.EventDispatcher;
2329
import com.facebook.react.uimanager.annotations.ReactProp;
24-
import com.facebook.react.uimanager.events.RCTEventEmitter;
2530
import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper;
2631

2732
import java.util.List;
@@ -117,13 +122,17 @@ public void onProgress(String key, long bytesRead, long expectedLength) {
117122
List<FastImageViewWithUrl> viewsForKey = VIEWS_FOR_URLS.get(key);
118123
if (viewsForKey != null) {
119124
for (FastImageViewWithUrl view : viewsForKey) {
120-
WritableMap event = new WritableNativeMap();
121-
event.putInt("loaded", (int) bytesRead);
122-
event.putInt("total", (int) expectedLength);
123-
ThemedReactContext context = (ThemedReactContext) view.getContext();
124-
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
125-
int viewId = view.getId();
126-
eventEmitter.receiveEvent(viewId, REACT_ON_PROGRESS_EVENT, event);
125+
ReactContext context = getReactApplicationContext();
126+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.getId());
127+
FastImageProgressEvent event = new FastImageProgressEvent(
128+
ViewUtil.NO_SURFACE_ID,
129+
view.getId(),
130+
(int) bytesRead,
131+
(int) expectedLength);
132+
133+
if (dispatcher != null) {
134+
dispatcher.dispatchEvent(event);
135+
}
127136
}
128137
}
129138
}

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

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414
import com.bumptech.glide.load.model.GlideUrl;
1515
import com.bumptech.glide.request.Request;
1616
import com.facebook.react.bridge.ReadableMap;
17-
import com.facebook.react.bridge.WritableMap;
18-
import com.facebook.react.bridge.WritableNativeMap;
17+
import com.dylanvann.fastimage.events.FastImageErrorEvent;
18+
import com.dylanvann.fastimage.events.FastImageLoadStartEvent;
1919
import com.facebook.react.uimanager.ThemedReactContext;
20-
import com.facebook.react.uimanager.events.RCTEventEmitter;
20+
import com.facebook.react.uimanager.UIManagerHelper;
21+
import com.facebook.react.uimanager.events.EventDispatcher;
2122

2223
import java.util.ArrayList;
2324
import java.util.Collections;
@@ -75,12 +76,9 @@ public void onAfterUpdate(
7576
setImageDrawable(null);
7677

7778
ThemedReactContext context = (ThemedReactContext) getContext();
78-
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
79-
int viewId = getId();
80-
WritableMap event = new WritableNativeMap();
81-
event.putString("message", "Image source uri cannot be empty or null:" + mSource);
82-
eventEmitter.receiveEvent(viewId, REACT_ON_ERROR_EVENT, event);
83-
79+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, getId());
80+
int surfaceId = UIManagerHelper.getSurfaceId(this);
81+
FastImageErrorEvent event = new FastImageErrorEvent(surfaceId, getId(), mSource);
8482
return;
8583
}
8684

@@ -89,12 +87,13 @@ public void onAfterUpdate(
8987

9088
if (imageSource != null && imageSource.getUri().toString().length() == 0) {
9189
ThemedReactContext context = (ThemedReactContext) getContext();
92-
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
93-
int viewId = getId();
94-
WritableMap event = new WritableNativeMap();
95-
event.putString("message", "Invalid source prop: " + mSource);
96-
eventEmitter.receiveEvent(viewId, REACT_ON_ERROR_EVENT, event);
90+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, getId());
91+
int surfaceId = UIManagerHelper.getSurfaceId(this);
92+
FastImageErrorEvent event = new FastImageErrorEvent(surfaceId, getId(), mSource);
9793

94+
if (dispatcher != null) {
95+
dispatcher.dispatchEvent(event);
96+
}
9897
// Cancel existing requests.
9998
clearView(requestManager);
10099

@@ -129,12 +128,14 @@ public void onAfterUpdate(
129128
ThemedReactContext context = (ThemedReactContext) getContext();
130129
if (imageSource != null) {
131130
// This is an orphan even without a load/loadend when only loading a placeholder
132-
RCTEventEmitter eventEmitter = context.getJSModule(RCTEventEmitter.class);
133-
int viewId = this.getId();
131+
// This is an orphan event without a load/loadend when only loading a placeholder
132+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, getId());
133+
int surfaceId = UIManagerHelper.getSurfaceId(this);
134+
FastImageLoadStartEvent event = new FastImageLoadStartEvent(surfaceId, getId());
134135

135-
eventEmitter.receiveEvent(viewId,
136-
FastImageViewManager.REACT_ON_LOAD_START_EVENT,
137-
new WritableNativeMap());
136+
if (dispatcher != null) {
137+
dispatcher.dispatchEvent(event);
138+
}
138139
}
139140

140141
if (requestManager != null) {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.dylanvann.fastimage.events;
2+
3+
import androidx.annotation.NonNull;
4+
import androidx.annotation.Nullable;
5+
6+
import com.facebook.react.bridge.Arguments;
7+
import com.facebook.react.bridge.ReadableMap;
8+
import com.facebook.react.bridge.WritableMap;
9+
import com.facebook.react.uimanager.events.Event;
10+
11+
public class FastImageErrorEvent extends Event<FastImageErrorEvent> {
12+
13+
@Nullable
14+
private final ReadableMap mSource;
15+
16+
public FastImageErrorEvent(int surfaceId, int viewTag, @Nullable ReadableMap source) {
17+
super(surfaceId, viewTag);
18+
mSource = source;
19+
}
20+
@NonNull
21+
@Override
22+
public String getEventName() {
23+
return "onFastImageError";
24+
}
25+
26+
@Override
27+
protected WritableMap getEventData() {
28+
WritableMap eventData = Arguments.createMap();
29+
if (mSource != null) {
30+
eventData.putString("message", "Invalid source prop:" + mSource);
31+
}
32+
return eventData;
33+
}
34+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.dylanvann.fastimage.events;
2+
3+
import androidx.annotation.NonNull;
4+
5+
import com.facebook.react.uimanager.events.Event;
6+
7+
public class FastImageLoadEndEvent extends Event<FastImageLoadEndEvent> {
8+
9+
public FastImageLoadEndEvent(int surfaceId, int viewTag) {
10+
super(surfaceId, viewTag);
11+
}
12+
13+
@NonNull
14+
@Override
15+
public String getEventName() {
16+
return "onFastImageLoadEnd";
17+
}
18+
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.dylanvann.fastimage.events;
2+
3+
import androidx.annotation.NonNull;
4+
5+
import com.facebook.react.uimanager.events.Event;
6+
7+
public class FastImageLoadEvent extends Event<FastImageLoadEvent> {
8+
9+
public FastImageLoadEvent(int surfaceId, int viewTag) {
10+
super(surfaceId, viewTag);
11+
}
12+
13+
@NonNull
14+
@Override
15+
public String getEventName() {
16+
return "onFastImageLoad";
17+
}
18+
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.dylanvann.fastimage.events;
2+
3+
import androidx.annotation.NonNull;
4+
5+
import com.facebook.react.uimanager.events.Event;
6+
7+
public class FastImageLoadStartEvent extends Event<FastImageLoadStartEvent> {
8+
9+
public FastImageLoadStartEvent(int surfaceId, int viewTag) {
10+
super(surfaceId, viewTag);
11+
}
12+
13+
@NonNull
14+
@Override
15+
public String getEventName() {
16+
return "onFastImageLoadStart";
17+
}
18+
19+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.dylanvann.fastimage.events;
2+
3+
import androidx.annotation.NonNull;
4+
5+
import com.facebook.react.bridge.Arguments;
6+
import com.facebook.react.bridge.WritableMap;
7+
import com.facebook.react.uimanager.events.Event;
8+
9+
public class FastImageProgressEvent extends Event<FastImageProgressEvent> {
10+
11+
private final int mBytesRead;
12+
private final int mExpectedLength;
13+
14+
public FastImageProgressEvent(int surfaceId, int viewTag, int bytesRead, int expectedLength) {
15+
super(surfaceId, viewTag);
16+
this.mBytesRead = bytesRead;
17+
this.mExpectedLength = expectedLength;
18+
}
19+
20+
@NonNull
21+
@Override
22+
public String getEventName() {
23+
return "onFastImageProgress";
24+
}
25+
26+
@Override
27+
protected WritableMap getEventData() {
28+
WritableMap eventData = Arguments.createMap();
29+
eventData.putInt("loaded", mBytesRead);
30+
eventData.putInt("total", mExpectedLength);
31+
return eventData;
32+
}
33+
34+
}

0 commit comments

Comments
 (0)