Use emitDeviceEvent in core ReactAndroid code (#36280)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/36280

[Changelog][Internal]

As a follow-up to adding `ReactContext.emitDeviceEvent` (D43534174 (a8f0a4dc62)) this makes it used in the OSS part of RN.

Reviewed By: NickGerleman

Differential Revision: D43494167

fbshipit-source-id: c3d56bde53fb1ce1297a48597b97470ff10f4dc0
This commit is contained in:
Ruslan Shestopalyuk 2023-02-27 07:34:15 -08:00 коммит произвёл Facebook GitHub Bot
Родитель ad686b0ce1
Коммит b108cbbff8
17 изменённых файлов: 144 добавлений и 187 удалений

Просмотреть файл

@ -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);
}
}

Просмотреть файл

@ -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,

Просмотреть файл

@ -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);
}
}

Просмотреть файл

@ -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);
}
}
};

Просмотреть файл

@ -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);
}

Просмотреть файл

@ -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);
}
}
}

Просмотреть файл

@ -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);
}
}
}

Просмотреть файл

@ -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() {

Просмотреть файл

@ -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);
}
}

Просмотреть файл

@ -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);
}
}
});

Просмотреть файл

@ -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(

Просмотреть файл

@ -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;
}
}

Просмотреть файл

@ -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);
}
}
}

Просмотреть файл

@ -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);
}
}

Просмотреть файл

@ -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);
}
}

Просмотреть файл

@ -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<WritableMap> expectedEventList = Arrays.asList(expectedEvents);
ArgumentCaptor<WritableMap> 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<WritableMap> actualEvents = captor.getAllValues();
assertThat(actualEvents).isEqualTo(expectedEventList);

Просмотреть файл

@ -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<WritableArray> 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);