diff --git a/Libraries/ReactNative/requireNativeComponent.js b/Libraries/ReactNative/requireNativeComponent.js index 7034d871ad9987..03fff7e0bceb45 100644 --- a/Libraries/ReactNative/requireNativeComponent.js +++ b/Libraries/ReactNative/requireNativeComponent.js @@ -12,6 +12,7 @@ */ 'use strict'; +const Platform = require('Platform'); const ReactNativeBridgeEventPlugin = require('ReactNativeBridgeEventPlugin'); const ReactNativeStyleAttributes = require('ReactNativeStyleAttributes'); const UIManager = require('UIManager'); @@ -47,35 +48,30 @@ const warning = require('fbjs/lib/warning'); */ import type {ComponentInterface} from 'verifyPropTypes'; +let hasAttachedDefaultEventTypes: boolean = false; + function requireNativeComponent( viewName: string, componentInterface?: ?ComponentInterface, extraConfig?: ?{nativeOnly?: Object}, ): React$ComponentType | string { - function attachBubblingEventTypes(viewConfig) { - if (UIManager.genericBubblingEventTypes) { - viewConfig.bubblingEventTypes = merge( - viewConfig.bubblingEventTypes, - UIManager.genericBubblingEventTypes, - ); - // As genericBubblingEventTypes do not change over time, and there's - // merge of all the events happening in Fiber, we need to pass - // genericBubblingEventTypes to Fiber only once. Therefore, we can delete - // it and forget about it. - delete UIManager.genericBubblingEventTypes; - } - } - - function attachDirectEventTypes(viewConfig) { - if (UIManager.genericDirectEventTypes) { - viewConfig.directEventTypes = merge( - viewConfig.directEventTypes, - UIManager.genericDirectEventTypes, - ); - // As genericDirectEventTypes do not change over time, and there's merge - // of all the events happening in Fiber, we need to pass genericDirectEventTypes - // to Fiber only once. Therefore, we can delete it and forget about it. - delete UIManager.genericDirectEventTypes; + function attachDefaultEventTypes(viewConfig: any) { + if (Platform.OS === 'android') { + // This is supported on Android platform only, + // as lazy view managers discovery is Android-specific. + if (UIManager.ViewManagerNames) { + // Lazy view managers enabled. + viewConfig = merge(viewConfig, UIManager.getDefaultEventTypes()); + } else { + viewConfig.bubblingEventTypes = merge( + viewConfig.bubblingEventTypes, + UIManager.genericBubblingEventTypes, + ); + viewConfig.directEventTypes = merge( + viewConfig.directEventTypes, + UIManager.genericDirectEventTypes, + ); + } } } @@ -184,8 +180,10 @@ function requireNativeComponent( ); } - attachBubblingEventTypes(viewConfig); - attachDirectEventTypes(viewConfig); + if (!hasAttachedDefaultEventTypes) { + attachDefaultEventTypes(viewConfig); + hasAttachedDefaultEventTypes = true; + } // Register this view's event types with the ReactNative renderer. // This enables view managers to be initialized lazily, improving perf, diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java index 1cfef61aee14c4..1591127cf97479 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -17,7 +17,6 @@ import com.facebook.common.logging.FLog; import com.facebook.debug.holder.PrinterHolder; import com.facebook.debug.tags.ReactDebugOverlayTags; -import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.animation.Animation; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; @@ -44,7 +43,7 @@ import java.util.Map; import javax.annotation.Nullable; - /** +/** *

Native module to allow JS to create and update native Views.

* *

@@ -117,11 +116,6 @@ public interface CustomEventNamesResolver { private int mBatchId = 0; - // Defines if events were already exported to JS. We do not send them more - // than once as they are stored and mixed in with Fiber for every ViewManager - // on JS side. - private boolean mEventsWereSentToJS = false; - public UIManagerModule( ReactApplicationContext reactContext, ViewManagerResolver viewManagerResolver, @@ -235,7 +229,6 @@ private static Map createConstants( } } - @DoNotStrip @ReactMethod(isBlockingSynchronousMethod = true) public @Nullable WritableMap getConstantsForViewManager(final String viewManagerName) { ViewManager targetView = @@ -252,13 +245,8 @@ private static Map createConstants( try { Map viewManagerConstants = UIManagerModuleConstantsHelper.createConstantsForViewManager( - targetView, - mEventsWereSentToJS ? null : UIManagerModuleConstants.getBubblingEventTypeConstants(), - mEventsWereSentToJS ? null : UIManagerModuleConstants.getDirectEventTypeConstants(), - null, - mCustomDirectEvents); + targetView, null, null, null, mCustomDirectEvents); if (viewManagerConstants != null) { - mEventsWereSentToJS = true; return Arguments.makeNativeMap(viewManagerConstants); } return null; @@ -267,9 +255,12 @@ private static Map createConstants( } } - /** - * Resolves Direct Event name exposed to JS from the one known to the Native side. - */ + @ReactMethod(isBlockingSynchronousMethod = true) + public WritableMap getDefaultEventTypes() { + return Arguments.makeNativeMap(UIManagerModuleConstantsHelper.getDefaultExportableEventTypes()); + } + + /** Resolves Direct Event name exposed to JS from the one known to the Native side. */ public CustomEventNamesResolver getDirectEventNamesResolver() { return new CustomEventNamesResolver() { @Override diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java index 28b108a2a2a2ce..76e0b9ecea2d20 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java @@ -24,6 +24,9 @@ */ /* package */ class UIManagerModuleConstantsHelper { + private static final String BUBBLING_EVENTS_KEY = "bubblingEventTypes"; + private static final String DIRECT_EVENTS_KEY = "directEventTypes"; + /** * Generates a lazy discovery enabled version of {@link UIManagerModule} constants. It only * contains a list of view manager names, so that JS side is aware of the managers there are. @@ -38,6 +41,12 @@ return constants; } + /* package */ static Map getDefaultExportableEventTypes() { + return MapBuilder.of( + BUBBLING_EVENTS_KEY, UIManagerModuleConstants.getBubblingEventTypeConstants(), + DIRECT_EVENTS_KEY, UIManagerModuleConstants.getDirectEventTypeConstants()); + } + /** * Generates map of constants that is then exposed by {@link UIManagerModule}. * Provided list of {@param viewManagers} is then used to populate content of @@ -107,9 +116,6 @@ @Nullable Map defaultDirectEvents, @Nullable Map cumulativeBubblingEventTypes, @Nullable Map cumulativeDirectEventTypes) { - final String BUBBLING_EVENTS_KEY = "bubblingEventTypes"; - final String DIRECT_EVENTS_KEY = "directEventTypes"; - Map viewManagerConstants = MapBuilder.newHashMap(); Map viewManagerBubblingEvents = viewManager.getExportedCustomBubblingEventTypeConstants();