diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/network/NetworkRecordingModuleMock.java b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/network/NetworkRecordingModuleMock.java index 1a6db544aa..e6cb498904 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/network/NetworkRecordingModuleMock.java +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/network/NetworkRecordingModuleMock.java @@ -18,7 +18,6 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.module.annotations.ReactModule; -import com.facebook.react.modules.core.DeviceEventManagerModule; /** * Mock Networking module that records last request received by {@link #sendRequest} method and @@ -36,6 +35,7 @@ public class NetworkRecordingModuleMock extends ReactContextBaseJavaModule { public boolean mAbortedRequest; private boolean mCompleteRequest; + private ReactApplicationContext mContext; public NetworkRecordingModuleMock(ReactApplicationContext reactContext) { this(reactContext, true); @@ -44,6 +44,7 @@ public class NetworkRecordingModuleMock extends ReactContextBaseJavaModule { public NetworkRecordingModuleMock(ReactApplicationContext reactContext, boolean completeRequest) { super(reactContext); mCompleteRequest = completeRequest; + mContext = reactContext; } public interface RequestListener { @@ -120,7 +121,7 @@ public class NetworkRecordingModuleMock extends ReactContextBaseJavaModule { args.pushInt(requestId); args.pushString(data); - getEventEmitter().emit("didReceiveNetworkData", args); + mContext.emitDeviceEvent("didReceiveNetworkData", args); } private void onRequestComplete(int requestId, @Nullable String error) { @@ -128,7 +129,7 @@ public class NetworkRecordingModuleMock extends ReactContextBaseJavaModule { args.pushInt(requestId); args.pushString(error); - getEventEmitter().emit("didCompleteNetworkResponse", args); + mContext.emitDeviceEvent("didCompleteNetworkResponse", args); } private void onResponseReceived(int requestId, int code, WritableMap headers) { @@ -137,11 +138,6 @@ public class NetworkRecordingModuleMock extends ReactContextBaseJavaModule { args.pushInt(code); args.pushMap(headers); - getEventEmitter().emit("didReceiveNetworkResponse", args); - } - - private DeviceEventManagerModule.RCTDeviceEventEmitter getEventEmitter() { - return getReactApplicationContext() - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class); + mContext.emitDeviceEvent("didReceiveNetworkResponse", args); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index 6088f90546..2921c45924 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -554,9 +554,7 @@ public class ReactInstanceManager { private void toggleElementInspector() { ReactContext currentContext = getCurrentReactContext(); if (currentContext != null && currentContext.hasActiveReactInstance()) { - currentContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("toggleElementInspector", null); + currentContext.emitDeviceEvent("toggleElementInspector"); } else { ReactSoftExceptionLogger.logSoftException( TAG, diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index cb480570ef..8a232ada22 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -52,7 +52,6 @@ import com.facebook.react.bridge.WritableNativeMap; import com.facebook.react.common.annotations.VisibleForTesting; import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.modules.appregistry.AppRegistry; -import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.modules.deviceinfo.DeviceInfoModule; import com.facebook.react.surface.ReactStage; import com.facebook.react.uimanager.DisplayMetricsHolder; @@ -866,9 +865,7 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot { /* package */ void sendEvent(String eventName, @Nullable WritableMap params) { if (hasActiveReactInstance()) { - getCurrentReactContext() - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit(eventName, params); + getCurrentReactContext().emitDeviceEvent(eventName, params); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java index ed49e736c5..ce7520ee9b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java @@ -26,7 +26,6 @@ import com.facebook.react.bridge.UIManagerListener; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.annotations.VisibleForTesting; import com.facebook.react.module.annotations.ReactModule; -import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.modules.core.ReactChoreographer; import com.facebook.react.uimanager.GuardedFrameCallback; import com.facebook.react.uimanager.NativeViewHierarchyManager; @@ -566,9 +565,7 @@ public class NativeAnimatedModule extends NativeAnimatedModuleSpec ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn(); if (reactApplicationContext != null) { - reactApplicationContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("onAnimatedValueUpdate", onAnimatedValueData); + reactApplicationContext.emitDeviceEvent("onAnimatedValueUpdate", onAnimatedValueData); } } }; @@ -1090,9 +1087,8 @@ public class NativeAnimatedModule extends NativeAnimatedModuleSpec ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn(); if (reactApplicationContext != null) { - reactApplicationContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("onAnimatedValueUpdate", onAnimatedValueData); + reactApplicationContext.emitDeviceEvent( + "onAnimatedValueUpdate", onAnimatedValueData); } } }; diff --git a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java index bb626bed0b..0e91b3a1b4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java @@ -23,7 +23,6 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.UIManager; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.WritableMap; -import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.uimanager.UIManagerHelper; import com.facebook.react.uimanager.common.UIManagerType; import com.facebook.react.uimanager.events.Event; @@ -308,9 +307,8 @@ public class NativeAnimatedNodesManager implements EventDispatcherListener { WritableMap params = Arguments.createMap(); params.putInt("animationId", animation.mId); params.putBoolean("finished", false); - mReactApplicationContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("onNativeAnimatedModuleAnimationFinished", params); + mReactApplicationContext.emitDeviceEvent( + "onNativeAnimatedModuleAnimationFinished", params); } mActiveAnimations.removeAt(i); i--; @@ -339,9 +337,8 @@ public class NativeAnimatedNodesManager implements EventDispatcherListener { WritableMap params = Arguments.createMap(); params.putInt("animationId", animation.mId); params.putBoolean("finished", false); - mReactApplicationContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("onNativeAnimatedModuleAnimationFinished", params); + mReactApplicationContext.emitDeviceEvent( + "onNativeAnimatedModuleAnimationFinished", params); } mActiveAnimations.removeAt(i); return; @@ -474,9 +471,7 @@ public class NativeAnimatedNodesManager implements EventDispatcherListener { WritableMap params = Arguments.createMap(); params.putInt("tag", tag); params.putDouble("value", value); - mReactApplicationContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("onNativeAnimatedModuleGetValue", params); + mReactApplicationContext.emitDeviceEvent("onNativeAnimatedModuleGetValue", params); } @UiThread @@ -653,12 +648,8 @@ public class NativeAnimatedNodesManager implements EventDispatcherListener { WritableMap params = Arguments.createMap(); params.putInt("animationId", animation.mId); params.putBoolean("finished", true); - DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitter = - mReactApplicationContext.getJSModule( - DeviceEventManagerModule.RCTDeviceEventEmitter.class); - if (eventEmitter != null) { - eventEmitter.emit("onNativeAnimatedModuleAnimationFinished", params); - } + mReactApplicationContext.emitDeviceEvent( + "onNativeAnimatedModuleAnimationFinished", params); } mActiveAnimations.removeAt(i); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java index 29c20f9bdd..ea2b4b7297 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java @@ -24,7 +24,6 @@ import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.module.annotations.ReactModule; -import com.facebook.react.modules.core.DeviceEventManagerModule; /** * Module that monitors and provides information about the state of Touch Exploration service on the @@ -130,9 +129,7 @@ public class AccessibilityInfoModule extends NativeAccessibilityInfoSpec ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn(); if (reactApplicationContext != null) { - reactApplicationContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit(REDUCE_MOTION_EVENT_NAME, mReduceMotionEnabled); + reactApplicationContext.emitDeviceEvent(REDUCE_MOTION_EVENT_NAME, mReduceMotionEnabled); } } } @@ -144,8 +141,7 @@ public class AccessibilityInfoModule extends NativeAccessibilityInfoSpec ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn(); if (reactApplicationContext != null) { getReactApplicationContext() - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit(TOUCH_EXPLORATION_EVENT_NAME, mTouchExplorationEnabled); + .emitDeviceEvent(TOUCH_EXPLORATION_EVENT_NAME, mTouchExplorationEnabled); } } } @@ -157,8 +153,7 @@ public class AccessibilityInfoModule extends NativeAccessibilityInfoSpec ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn(); if (reactApplicationContext != null) { getReactApplicationContext() - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit(ACCESSIBILITY_SERVICE_EVENT_NAME, mAccessibilityServiceEnabled); + .emitDeviceEvent(ACCESSIBILITY_SERVICE_EVENT_NAME, mAccessibilityServiceEnabled); } } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.java index e64bbe122c..bda3ef7ec2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.java @@ -16,7 +16,6 @@ import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.WritableMap; import com.facebook.react.module.annotations.ReactModule; -import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter; /** Module that exposes the user's preferred color scheme. */ @ReactModule(name = NativeAppearanceSpec.NAME) @@ -108,9 +107,7 @@ public class AppearanceModule extends NativeAppearanceSpec { ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn(); if (reactApplicationContext != null) { - reactApplicationContext - .getJSModule(RCTDeviceEventEmitter.class) - .emit(APPEARANCE_CHANGED_EVENT_NAME, appearancePreferences); + reactApplicationContext.emitDeviceEvent(APPEARANCE_CHANGED_EVENT_NAME, appearancePreferences); } } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/appstate/AppStateModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/appstate/AppStateModule.java index aa9d02850d..e62bb0790e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/appstate/AppStateModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/appstate/AppStateModule.java @@ -16,7 +16,6 @@ import com.facebook.react.bridge.WindowFocusChangeListener; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.LifecycleState; import com.facebook.react.module.annotations.ReactModule; -import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter; import java.util.HashMap; import java.util.Map; import javax.annotation.Nullable; @@ -96,7 +95,7 @@ public class AppStateModule extends NativeAppStateSpec if (!reactApplicationContext.hasActiveReactInstance()) { return; } - reactApplicationContext.getJSModule(RCTDeviceEventEmitter.class).emit(eventName, data); + reactApplicationContext.emitDeviceEvent(eventName, data); } private void sendAppStateChangeEvent() { diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/core/DeviceEventManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/core/DeviceEventManagerModule.java index e6df30bb49..e8ba782cb5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/core/DeviceEventManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/core/DeviceEventManagerModule.java @@ -47,9 +47,7 @@ public class DeviceEventManagerModule extends NativeDeviceEventManagerSpec { ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn(); if (reactApplicationContext != null) { - reactApplicationContext - .getJSModule(RCTDeviceEventEmitter.class) - .emit("hardwareBackPress", null); + reactApplicationContext.emitDeviceEvent("hardwareBackPress", null); } } @@ -60,7 +58,7 @@ public class DeviceEventManagerModule extends NativeDeviceEventManagerSpec { if (reactApplicationContext != null) { WritableMap map = Arguments.createMap(); map.putString("url", uri.toString()); - reactApplicationContext.getJSModule(RCTDeviceEventEmitter.class).emit("url", map); + reactApplicationContext.emitDeviceEvent("url", map); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java index d330fbe2d4..ede03d57ab 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java @@ -15,7 +15,6 @@ import com.facebook.react.bridge.WritableMap; import com.facebook.react.devsupport.interfaces.DevOptionHandler; import com.facebook.react.devsupport.interfaces.DevSupportManager; import com.facebook.react.module.annotations.ReactModule; -import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter; /** * Module that exposes the URL to the source code map (used for exception stack trace parsing) to JS @@ -89,9 +88,7 @@ public class DevSettingsModule extends NativeDevSettingsSpec { getReactApplicationContextIfActiveOrWarn(); if (reactApplicationContext != null) { - reactApplicationContext - .getJSModule(RCTDeviceEventEmitter.class) - .emit("didPressMenuItem", data); + reactApplicationContext.emitDeviceEvent("didPressMenuItem", data); } } }); diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.java index f1bf37ee20..e8ff3bb772 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.java @@ -17,7 +17,6 @@ import com.facebook.react.bridge.ReactSoftExceptionLogger; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.facebook.react.module.annotations.ReactModule; -import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.uimanager.DisplayMetricsHolder; import java.util.HashMap; import java.util.Map; @@ -89,9 +88,7 @@ public class DeviceInfoModule extends NativeDeviceInfoSpec implements LifecycleE mPreviousDisplayMetrics = displayMetrics.copy(); } else if (!displayMetrics.equals(mPreviousDisplayMetrics)) { mPreviousDisplayMetrics = displayMetrics.copy(); - mReactApplicationContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("didUpdateDimensions", displayMetrics); + mReactApplicationContext.emitDeviceEvent("didUpdateDimensions", displayMetrics); } } else { ReactSoftExceptionLogger.logSoftException( diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java index 90fc846e93..1c4b373f12 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java @@ -23,7 +23,6 @@ import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.StandardCharsets; import com.facebook.react.common.network.OkHttpCallUtil; import com.facebook.react.module.annotations.ReactModule; -import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; @@ -246,10 +245,9 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { withCredentials); } catch (Throwable th) { FLog.e(TAG, "Failed to send url request: " + url, th); - final RCTDeviceEventEmitter eventEmitter = getEventEmitter("sendRequest error"); - if (eventEmitter != null) { - ResponseUtil.onRequestError(eventEmitter, requestId, th.getMessage(), th); - } + + ResponseUtil.onRequestError( + getReactApplicationContextIfActiveOrWarn(), requestId, th.getMessage(), th); } } @@ -264,8 +262,8 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { final boolean useIncrementalUpdates, int timeout, boolean withCredentials) { - final RCTDeviceEventEmitter eventEmitter = getEventEmitter("sendRequestInternal"); - + final ReactApplicationContext reactApplicationContext = + getReactApplicationContextIfActiveOrWarn(); try { Uri uri = Uri.parse(url); @@ -273,13 +271,13 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { for (UriHandler handler : mUriHandlers) { if (handler.supports(uri, responseType)) { WritableMap res = handler.fetch(uri); - ResponseUtil.onDataReceived(eventEmitter, requestId, res); - ResponseUtil.onRequestSuccess(eventEmitter, requestId); + ResponseUtil.onDataReceived(reactApplicationContext, requestId, res); + ResponseUtil.onRequestSuccess(reactApplicationContext, requestId); return; } } } catch (IOException e) { - ResponseUtil.onRequestError(eventEmitter, requestId, e.getMessage(), e); + ResponseUtil.onRequestError(reactApplicationContext, requestId, e.getMessage(), e); return; } @@ -287,7 +285,7 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { try { requestBuilder = new Request.Builder().url(url); } catch (Exception e) { - ResponseUtil.onRequestError(eventEmitter, requestId, e.getMessage(), null); + ResponseUtil.onRequestError(reactApplicationContext, requestId, e.getMessage(), null); return; } @@ -331,7 +329,7 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { return; } ResponseUtil.onDataReceivedProgress( - eventEmitter, requestId, bytesWritten, contentLength); + reactApplicationContext, requestId, bytesWritten, contentLength); last = now; } }); @@ -351,7 +349,8 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { Headers requestHeaders = extractHeaders(headers, data); if (requestHeaders == null) { - ResponseUtil.onRequestError(eventEmitter, requestId, "Unrecognized headers format", null); + ResponseUtil.onRequestError( + reactApplicationContext, requestId, "Unrecognized headers format", null); return; } String contentType = requestHeaders.get(CONTENT_TYPE_HEADER_NAME); @@ -379,7 +378,10 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { } else if (data.hasKey(REQUEST_BODY_KEY_STRING)) { if (contentType == null) { ResponseUtil.onRequestError( - eventEmitter, requestId, "Payload is set but no content-type header specified", null); + reactApplicationContext, + requestId, + "Payload is set but no content-type header specified", + null); return; } String body = data.getString(REQUEST_BODY_KEY_STRING); @@ -387,7 +389,8 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { if (RequestBodyUtil.isGzipEncoding(contentEncoding)) { requestBody = RequestBodyUtil.createGzip(contentMediaType, body); if (requestBody == null) { - ResponseUtil.onRequestError(eventEmitter, requestId, "Failed to gzip request body", null); + ResponseUtil.onRequestError( + reactApplicationContext, requestId, "Failed to gzip request body", null); return; } } else { @@ -403,7 +406,10 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { } else if (data.hasKey(REQUEST_BODY_KEY_BASE64)) { if (contentType == null) { ResponseUtil.onRequestError( - eventEmitter, requestId, "Payload is set but no content-type header specified", null); + reactApplicationContext, + requestId, + "Payload is set but no content-type header specified", + null); return; } String base64String = data.getString(REQUEST_BODY_KEY_BASE64); @@ -412,7 +418,10 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { } else if (data.hasKey(REQUEST_BODY_KEY_URI)) { if (contentType == null) { ResponseUtil.onRequestError( - eventEmitter, requestId, "Payload is set but no content-type header specified", null); + reactApplicationContext, + requestId, + "Payload is set but no content-type header specified", + null); return; } String uri = data.getString(REQUEST_BODY_KEY_URI); @@ -420,7 +429,7 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { RequestBodyUtil.getFileInputStream(getReactApplicationContext(), uri); if (fileInputStream == null) { ResponseUtil.onRequestError( - eventEmitter, requestId, "Could not retrieve file for uri " + uri, null); + reactApplicationContext, requestId, "Could not retrieve file for uri " + uri, null); return; } requestBody = RequestBodyUtil.create(MediaType.parse(contentType), fileInputStream); @@ -440,8 +449,7 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { requestBody = RequestBodyUtil.getEmptyBody(method); } - requestBuilder.method( - method, wrapRequestBodyWithProgressEmitter(requestBody, eventEmitter, requestId)); + requestBuilder.method(method, wrapRequestBodyWithProgressEmitter(requestBody, requestId)); addRequest(requestId); client @@ -458,7 +466,7 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { e.getMessage() != null ? e.getMessage() : "Error while executing request: " + e.getClass().getSimpleName(); - ResponseUtil.onRequestError(eventEmitter, requestId, errorMessage, e); + ResponseUtil.onRequestError(reactApplicationContext, requestId, errorMessage, e); } @Override @@ -469,7 +477,7 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { removeRequest(requestId); // Before we touch the body send headers to JS ResponseUtil.onResponseReceived( - eventEmitter, + reactApplicationContext, requestId, response.code(), translateHeaders(response.headers()), @@ -506,8 +514,8 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { for (ResponseHandler handler : mResponseHandlers) { if (handler.supports(responseType)) { WritableMap res = handler.toResponseData(responseBody); - ResponseUtil.onDataReceived(eventEmitter, requestId, res); - ResponseUtil.onRequestSuccess(eventEmitter, requestId); + ResponseUtil.onDataReceived(reactApplicationContext, requestId, res); + ResponseUtil.onRequestSuccess(reactApplicationContext, requestId); return; } } @@ -516,8 +524,8 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { // response, // periodically send response data updates to JS. if (useIncrementalUpdates && responseType.equals("text")) { - readWithProgress(eventEmitter, requestId, responseBody); - ResponseUtil.onRequestSuccess(eventEmitter, requestId); + readWithProgress(requestId, responseBody); + ResponseUtil.onRequestSuccess(reactApplicationContext, requestId); return; } @@ -534,28 +542,30 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { // Javascript layer. // Introduced to fix issue #7463. } else { - ResponseUtil.onRequestError(eventEmitter, requestId, e.getMessage(), e); + ResponseUtil.onRequestError( + reactApplicationContext, requestId, e.getMessage(), e); } } } else if (responseType.equals("base64")) { responseString = Base64.encodeToString(responseBody.bytes(), Base64.NO_WRAP); } - ResponseUtil.onDataReceived(eventEmitter, requestId, responseString); - ResponseUtil.onRequestSuccess(eventEmitter, requestId); + ResponseUtil.onDataReceived(reactApplicationContext, requestId, responseString); + ResponseUtil.onRequestSuccess(reactApplicationContext, requestId); } catch (IOException e) { - ResponseUtil.onRequestError(eventEmitter, requestId, e.getMessage(), e); + ResponseUtil.onRequestError( + reactApplicationContext, requestId, e.getMessage(), e); } } }); } private RequestBody wrapRequestBodyWithProgressEmitter( - final RequestBody requestBody, - final RCTDeviceEventEmitter eventEmitter, - final int requestId) { + final RequestBody requestBody, final int requestId) { if (requestBody == null) { return null; } + final ReactApplicationContext reactApplicationContext = + getReactApplicationContextIfActiveOrWarn(); return RequestBodyUtil.createProgressRequest( requestBody, new ProgressListener() { @@ -565,16 +575,15 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { public void onProgress(long bytesWritten, long contentLength, boolean done) { long now = System.nanoTime(); if (done || shouldDispatch(now, last)) { - ResponseUtil.onDataSend(eventEmitter, requestId, bytesWritten, contentLength); + ResponseUtil.onDataSend( + reactApplicationContext, requestId, bytesWritten, contentLength); last = now; } } }); } - private void readWithProgress( - RCTDeviceEventEmitter eventEmitter, int requestId, ResponseBody responseBody) - throws IOException { + private void readWithProgress(int requestId, ResponseBody responseBody) throws IOException { long totalBytesRead = -1; long contentLength = -1; try { @@ -595,9 +604,11 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { try { byte[] buffer = new byte[MAX_CHUNK_SIZE_BETWEEN_FLUSHES]; int read; + final ReactApplicationContext reactApplicationContext = + getReactApplicationContextIfActiveOrWarn(); while ((read = inputStream.read(buffer)) != -1) { ResponseUtil.onIncrementalDataReceived( - eventEmitter, + reactApplicationContext, requestId, streamDecoder.decodeNext(buffer, read), totalBytesRead, @@ -673,10 +684,12 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { private @Nullable MultipartBody.Builder constructMultipartBody( ReadableArray body, String contentType, int requestId) { - RCTDeviceEventEmitter eventEmitter = getEventEmitter("constructMultipartBody"); MultipartBody.Builder multipartBuilder = new MultipartBody.Builder(); multipartBuilder.setType(MediaType.parse(contentType)); + final ReactApplicationContext reactApplicationContext = + getReactApplicationContextIfActiveOrWarn(); + for (int i = 0, size = body.size(); i < size; i++) { ReadableMap bodyPart = body.getMap(i); @@ -685,7 +698,10 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { Headers headers = extractHeaders(headersArray, null); if (headers == null) { ResponseUtil.onRequestError( - eventEmitter, requestId, "Missing or invalid header format for FormData part.", null); + reactApplicationContext, + requestId, + "Missing or invalid header format for FormData part.", + null); return null; } MediaType partContentType = null; @@ -703,7 +719,10 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { } else if (bodyPart.hasKey(REQUEST_BODY_KEY_URI)) { if (partContentType == null) { ResponseUtil.onRequestError( - eventEmitter, requestId, "Binary FormData part needs a content-type header.", null); + reactApplicationContext, + requestId, + "Binary FormData part needs a content-type header.", + null); return null; } String fileContentUriStr = bodyPart.getString(REQUEST_BODY_KEY_URI); @@ -711,7 +730,7 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { RequestBodyUtil.getFileInputStream(getReactApplicationContext(), fileContentUriStr); if (fileInputStream == null) { ResponseUtil.onRequestError( - eventEmitter, + reactApplicationContext, requestId, "Could not retrieve file for uri " + fileContentUriStr, null); @@ -719,7 +738,8 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { } multipartBuilder.addPart(headers, RequestBodyUtil.create(partContentType, fileInputStream)); } else { - ResponseUtil.onRequestError(eventEmitter, requestId, "Unrecognized FormData part.", null); + ResponseUtil.onRequestError( + reactApplicationContext, requestId, "Unrecognized FormData part.", null); } } return multipartBuilder; @@ -758,14 +778,4 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { return headersBuilder.build(); } - - private RCTDeviceEventEmitter getEventEmitter(String reason) { - ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn(); - - if (reactApplicationContext != null) { - return getReactApplicationContext().getJSModule(RCTDeviceEventEmitter.class); - } - - return null; - } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/network/ResponseUtil.java b/ReactAndroid/src/main/java/com/facebook/react/modules/network/ResponseUtil.java index 8abf12b22b..003b54e612 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/network/ResponseUtil.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/network/ResponseUtil.java @@ -9,26 +9,26 @@ package com.facebook.react.modules.network; import androidx.annotation.Nullable; import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; -import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter; import java.net.SocketTimeoutException; /** Util methods to send network responses to JS. */ public class ResponseUtil { public static void onDataSend( - @Nullable RCTDeviceEventEmitter eventEmitter, int requestId, long progress, long total) { + @Nullable ReactApplicationContext reactContext, int requestId, long progress, long total) { WritableArray args = Arguments.createArray(); args.pushInt(requestId); args.pushInt((int) progress); args.pushInt((int) total); - if (eventEmitter != null) { - eventEmitter.emit("didSendNetworkData", args); + if (reactContext != null) { + reactContext.emitDeviceEvent("didSendNetworkData", args); } } public static void onIncrementalDataReceived( - @Nullable RCTDeviceEventEmitter eventEmitter, + @Nullable ReactApplicationContext reactContext, int requestId, String data, long progress, @@ -39,47 +39,47 @@ public class ResponseUtil { args.pushInt((int) progress); args.pushInt((int) total); - if (eventEmitter != null) { - eventEmitter.emit("didReceiveNetworkIncrementalData", args); + if (reactContext != null) { + reactContext.emitDeviceEvent("didReceiveNetworkIncrementalData", args); } } public static void onDataReceivedProgress( - @Nullable RCTDeviceEventEmitter eventEmitter, int requestId, long progress, long total) { + @Nullable ReactApplicationContext reactContext, int requestId, long progress, long total) { WritableArray args = Arguments.createArray(); args.pushInt(requestId); args.pushInt((int) progress); args.pushInt((int) total); - if (eventEmitter != null) { - eventEmitter.emit("didReceiveNetworkDataProgress", args); + if (reactContext != null) { + reactContext.emitDeviceEvent("didReceiveNetworkDataProgress", args); } } public static void onDataReceived( - @Nullable RCTDeviceEventEmitter eventEmitter, int requestId, String data) { + @Nullable ReactApplicationContext reactContext, int requestId, String data) { WritableArray args = Arguments.createArray(); args.pushInt(requestId); args.pushString(data); - if (eventEmitter != null) { - eventEmitter.emit("didReceiveNetworkData", args); + if (reactContext != null) { + reactContext.emitDeviceEvent("didReceiveNetworkData", args); } } public static void onDataReceived( - @Nullable RCTDeviceEventEmitter eventEmitter, int requestId, WritableMap data) { + @Nullable ReactApplicationContext reactContext, int requestId, WritableMap data) { WritableArray args = Arguments.createArray(); args.pushInt(requestId); args.pushMap(data); - if (eventEmitter != null) { - eventEmitter.emit("didReceiveNetworkData", args); + if (reactContext != null) { + reactContext.emitDeviceEvent("didReceiveNetworkData", args); } } public static void onRequestError( - @Nullable RCTDeviceEventEmitter eventEmitter, int requestId, String error, Throwable e) { + @Nullable ReactApplicationContext reactContext, int requestId, String error, Throwable e) { WritableArray args = Arguments.createArray(); args.pushInt(requestId); args.pushString(error); @@ -88,23 +88,24 @@ public class ResponseUtil { args.pushBoolean(true); // last argument is a time out boolean } - if (eventEmitter != null) { - eventEmitter.emit("didCompleteNetworkResponse", args); + if (reactContext != null) { + reactContext.emitDeviceEvent("didCompleteNetworkResponse", args); } } - public static void onRequestSuccess(@Nullable RCTDeviceEventEmitter eventEmitter, int requestId) { + public static void onRequestSuccess( + @Nullable ReactApplicationContext reactContext, int requestId) { WritableArray args = Arguments.createArray(); args.pushInt(requestId); args.pushNull(); - if (eventEmitter != null) { - eventEmitter.emit("didCompleteNetworkResponse", args); + if (reactContext != null) { + reactContext.emitDeviceEvent("didCompleteNetworkResponse", args); } } public static void onResponseReceived( - @Nullable RCTDeviceEventEmitter eventEmitter, + @Nullable ReactApplicationContext reactContext, int requestId, int statusCode, WritableMap headers, @@ -115,8 +116,8 @@ public class ResponseUtil { args.pushMap(headers); args.pushString(url); - if (eventEmitter != null) { - eventEmitter.emit("didReceiveNetworkResponse", args); + if (reactContext != null) { + reactContext.emitDeviceEvent("didReceiveNetworkResponse", args); } } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java index c88dfd58ff..ee1b2c85dc 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java @@ -19,7 +19,6 @@ import com.facebook.react.bridge.ReadableType; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.ReactConstants; import com.facebook.react.module.annotations.ReactModule; -import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.modules.network.ForwardingCookieHandler; import java.io.IOException; import java.net.URI; @@ -66,9 +65,7 @@ public final class WebSocketModule extends NativeWebSocketModuleSpec { private void sendEvent(String eventName, WritableMap params) { ReactApplicationContext reactApplicationContext = getReactApplicationContext(); if (reactApplicationContext.hasActiveReactInstance()) { - reactApplicationContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit(eventName, params); + reactApplicationContext.emitDeviceEvent(eventName, params); } } diff --git a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java index f4a57fe166..273b01af56 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java @@ -12,6 +12,7 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @@ -28,7 +29,6 @@ import com.facebook.react.bridge.ReactTestHelper; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.SystemClock; -import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.events.Event; @@ -91,7 +91,7 @@ public class RootViewTest { }); mCatalystInstanceMock = ReactTestHelper.createMockCatalystInstance(); - mReactContext = new ReactApplicationContext(RuntimeEnvironment.application); + mReactContext = spy(new ReactApplicationContext(RuntimeEnvironment.application)); mReactContext.initializeWithInstance(mCatalystInstanceMock); DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(mReactContext); @@ -217,11 +217,8 @@ public class RootViewTest { @Test public void testCheckForKeyboardEvents() { ReactInstanceManager instanceManager = mock(ReactInstanceManager.class); - RCTDeviceEventEmitter eventEmitterModuleMock = mock(RCTDeviceEventEmitter.class); when(instanceManager.getCurrentReactContext()).thenReturn(mReactContext); - when(mReactContext.getJSModule(RCTDeviceEventEmitter.class)).thenReturn(eventEmitterModuleMock); - ReactRootView rootView = new ReactRootView(mReactContext) { @Override @@ -250,6 +247,6 @@ public class RootViewTest { params.putMap("endCoordinates", endCoordinates); params.putString("easing", "keyboard"); - verify(eventEmitterModuleMock, Mockito.times(1)).emit("keyboardDidShow", params); + verify(mReactContext, Mockito.times(1)).emitDeviceEvent("keyboardDidShow", params); } } diff --git a/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.java b/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.java index 1d9644db98..51ac960579 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.java @@ -9,11 +9,11 @@ package com.facebook.react.modules.deviceinfo; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.powermock.api.mockito.PowerMockito.mockStatic; @@ -23,7 +23,6 @@ import com.facebook.react.bridge.JavaOnlyMap; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactTestHelper; import com.facebook.react.bridge.WritableMap; -import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.uimanager.DisplayMetricsHolder; import java.util.Arrays; import java.util.List; @@ -50,27 +49,22 @@ public class DeviceInfoModuleTest extends TestCase { @Rule public PowerMockRule rule = new PowerMockRule(); private DeviceInfoModule mDeviceInfoModule; - private DeviceEventManagerModule.RCTDeviceEventEmitter mRCTDeviceEventEmitterMock; private WritableMap fakePortraitDisplayMetrics; private WritableMap fakeLandscapeDisplayMetrics; + private ReactApplicationContext mContext; + @Before public void setUp() { initTestData(); mockStatic(DisplayMetricsHolder.class); - - mRCTDeviceEventEmitterMock = mock(DeviceEventManagerModule.RCTDeviceEventEmitter.class); - - final ReactApplicationContext context = - spy(new ReactApplicationContext(RuntimeEnvironment.application)); + mContext = spy(new ReactApplicationContext(RuntimeEnvironment.application)); CatalystInstance catalystInstanceMock = ReactTestHelper.createMockCatalystInstance(); - context.initializeWithInstance(catalystInstanceMock); - when(context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)) - .thenReturn(mRCTDeviceEventEmitterMock); + mContext.initializeWithInstance(catalystInstanceMock); - mDeviceInfoModule = new DeviceInfoModule(context); + mDeviceInfoModule = new DeviceInfoModule(mContext); } @After @@ -86,7 +80,7 @@ public class DeviceInfoModuleTest extends TestCase { mDeviceInfoModule.getTypedExportedConstants(); mDeviceInfoModule.emitUpdateDimensionsEvent(); - verifyNoMoreInteractions(mRCTDeviceEventEmitterMock); + verify(mContext, times(0)).emitDeviceEvent(anyString(), anyObject()); } @Test @@ -97,7 +91,7 @@ public class DeviceInfoModuleTest extends TestCase { givenDisplayMetricsHolderContains(fakeLandscapeDisplayMetrics); mDeviceInfoModule.emitUpdateDimensionsEvent(); - verifyUpdateDimensionsEventsEmitted(mRCTDeviceEventEmitterMock, fakeLandscapeDisplayMetrics); + verifyUpdateDimensionsEventsEmitted(mContext, fakeLandscapeDisplayMetrics); } @Test @@ -108,7 +102,7 @@ public class DeviceInfoModuleTest extends TestCase { mDeviceInfoModule.emitUpdateDimensionsEvent(); mDeviceInfoModule.emitUpdateDimensionsEvent(); - verifyUpdateDimensionsEventsEmitted(mRCTDeviceEventEmitterMock, fakeLandscapeDisplayMetrics); + verifyUpdateDimensionsEventsEmitted(mContext, fakeLandscapeDisplayMetrics); } @Test @@ -125,7 +119,7 @@ public class DeviceInfoModuleTest extends TestCase { mDeviceInfoModule.emitUpdateDimensionsEvent(); verifyUpdateDimensionsEventsEmitted( - mRCTDeviceEventEmitterMock, + mContext, fakeLandscapeDisplayMetrics, fakePortraitDisplayMetrics, fakeLandscapeDisplayMetrics); @@ -136,11 +130,11 @@ public class DeviceInfoModuleTest extends TestCase { } private static void verifyUpdateDimensionsEventsEmitted( - DeviceEventManagerModule.RCTDeviceEventEmitter emitter, WritableMap... expectedEvents) { + ReactApplicationContext context, WritableMap... expectedEvents) { List expectedEventList = Arrays.asList(expectedEvents); ArgumentCaptor captor = ArgumentCaptor.forClass(WritableMap.class); - verify(emitter, times(expectedEventList.size())) - .emit(eq("didUpdateDimensions"), captor.capture()); + verify(context, times(expectedEventList.size())) + .emitDeviceEvent(eq("didUpdateDimensions"), captor.capture()); List actualEvents = captor.getAllValues(); assertThat(actualEvents).isEqualTo(expectedEventList); diff --git a/ReactAndroid/src/test/java/com/facebook/react/modules/network/NetworkingModuleTest.java b/ReactAndroid/src/test/java/com/facebook/react/modules/network/NetworkingModuleTest.java index 1e353f8f23..d1dc438930 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/modules/network/NetworkingModuleTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/modules/network/NetworkingModuleTest.java @@ -25,7 +25,6 @@ import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.StandardCharsets; import com.facebook.react.common.network.OkHttpCallUtil; -import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter; import java.io.InputStream; import java.util.Arrays; import java.util.List; @@ -70,7 +69,7 @@ import org.robolectric.RobolectricTestRunner; public class NetworkingModuleTest { private NetworkingModule mNetworkingModule; private OkHttpClient mHttpClient; - private RCTDeviceEventEmitter mEmitter; + private ReactApplicationContext mContext; @Rule public PowerMockRule rule = new PowerMockRule(); @@ -91,14 +90,12 @@ public class NetworkingModuleTest { PowerMockito.when(clientBuilder.build()).thenReturn(mHttpClient); when(mHttpClient.newBuilder()).thenReturn(clientBuilder); - mEmitter = mock(RCTDeviceEventEmitter.class); - CatalystInstance reactInstance = mock(CatalystInstance.class); - ReactApplicationContext reactContext = mock(ReactApplicationContext.class); - when(reactContext.getCatalystInstance()).thenReturn(reactInstance); - when(reactContext.hasActiveReactInstance()).thenReturn(true); - when(reactContext.getJSModule(any(Class.class))).thenReturn(mEmitter); - mNetworkingModule = new NetworkingModule(reactContext, "", mHttpClient); + + mContext = mock(ReactApplicationContext.class); + when(mContext.getCatalystInstance()).thenReturn(reactInstance); + when(mContext.hasActiveReactInstance()).thenReturn(true); + mNetworkingModule = new NetworkingModule(mContext, "", mHttpClient); } @Test @@ -139,7 +136,7 @@ public class NetworkingModuleTest { /* timeout */ 0, /* withCredentials */ false); - verifyErrorEmit(mEmitter, 0); + verifyErrorEmit(mContext, 0); } @Test @@ -160,7 +157,7 @@ public class NetworkingModuleTest { /* timeout */ 0, /* withCredentials */ false); - verifyErrorEmit(mEmitter, 0); + verifyErrorEmit(mContext, 0); } @Test @@ -178,12 +175,12 @@ public class NetworkingModuleTest { /* timeout */ 0, /* withCredentials */ false); - verifyErrorEmit(mEmitter, 0); + verifyErrorEmit(mContext, 0); } - private static void verifyErrorEmit(RCTDeviceEventEmitter emitter, int requestId) { + private static void verifyErrorEmit(ReactApplicationContext context, int requestId) { ArgumentCaptor captor = ArgumentCaptor.forClass(WritableArray.class); - verify(emitter).emit(eq("didCompleteNetworkResponse"), captor.capture()); + verify(context).emitDeviceEvent(eq("didCompleteNetworkResponse"), captor.capture()); WritableArray array = captor.getValue(); assertThat(array.getInt(0)).isEqualTo(requestId);