From adc1a95a3bc7b2a1bca4abd240b52481bcda1854 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Fri, 11 Jan 2019 18:42:46 -0800 Subject: [PATCH] Reuse ViewManagerRegistry between UIManagerModule and FabricUIManager Summary: This diff reuses the ViewManager registry between UIManagerModule and Fabric, previously View Managers were being initialized twice (one for each UIManager), increasing Fabric TTI by ~77ms Reviewed By: shergin Differential Revision: D13640912 fbshipit-source-id: d7a9591084c66e4a2fc2384b2dae1b7fc5a228d0 --- .../react/uimanager/UIImplementation.java | 2 +- .../uimanager/UIImplementationProvider.java | 12 ++++++++++++ .../react/uimanager/UIManagerModule.java | 17 +++++++++++++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java index fd3448e86..aceed54ef 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -87,7 +87,7 @@ public class UIImplementation { minTimeLeftInFrameForNonBatchedOperationMs); } - private UIImplementation( + UIImplementation( ReactApplicationContext reactContext, ViewManagerRegistry viewManagers, EventDispatcher eventDispatcher, diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementationProvider.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementationProvider.java index 379bf9716..e5256d046 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementationProvider.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementationProvider.java @@ -39,4 +39,16 @@ public class UIImplementationProvider { eventDispatcher, minTimeLeftInFrameForNonBatchedOperationMs); } + + UIImplementation createUIImplementation( + ReactApplicationContext reactContext, + ViewManagerRegistry viewManagerRegistry, + EventDispatcher eventDispatcher, + int minTimeLeftInFrameForNonBatchedOperationMs) { + return new UIImplementation( + reactContext, + viewManagerRegistry, + eventDispatcher, + minTimeLeftInFrameForNonBatchedOperationMs); + } } 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 bd2a33555..ad289196d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -34,6 +34,7 @@ import com.facebook.react.bridge.UIManager; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.MapBuilder; import com.facebook.react.common.ReactConstants; +import com.facebook.react.common.annotations.VisibleForTesting; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.uimanager.common.MeasureSpecProvider; import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; @@ -112,6 +113,7 @@ public class UIManagerModule extends ReactContextBaseJavaModule private final EventDispatcher mEventDispatcher; private final Map mModuleConstants; private final Map mCustomDirectEvents; + private final ViewManagerRegistry mViewManagerRegistry; private final UIImplementation mUIImplementation; private final MemoryTrimCallback mMemoryTrimCallback = new MemoryTrimCallback(); private final List mListeners = new ArrayList<>(); @@ -155,10 +157,11 @@ public class UIManagerModule extends ReactContextBaseJavaModule mEventDispatcher = new EventDispatcher(reactContext); mModuleConstants = createConstants(viewManagerResolver); mCustomDirectEvents = UIManagerModuleConstants.getDirectEventTypeConstants(); + mViewManagerRegistry = new ViewManagerRegistry(viewManagerResolver); mUIImplementation = uiImplementationProvider.createUIImplementation( reactContext, - viewManagerResolver, + mViewManagerRegistry, mEventDispatcher, minTimeLeftInFrameForNonBatchedOperationMs); @@ -176,10 +179,11 @@ public class UIManagerModule extends ReactContextBaseJavaModule mEventDispatcher = new EventDispatcher(reactContext); mCustomDirectEvents = MapBuilder.newHashMap(); mModuleConstants = createConstants(viewManagersList, null, mCustomDirectEvents); + mViewManagerRegistry = new ViewManagerRegistry(viewManagersList); mUIImplementation = uiImplementationProvider.createUIImplementation( reactContext, - viewManagersList, + mViewManagerRegistry, mEventDispatcher, minTimeLeftInFrameForNonBatchedOperationMs); @@ -237,6 +241,15 @@ public class UIManagerModule extends ReactContextBaseJavaModule ViewManagerPropertyUpdater.clear(); } + /** + * This method is intended to reuse the {@link ViewManagerRegistry} with FabricUIManager. + * Do not use this method as this will be removed in the near future. + */ + @Deprecated + public ViewManagerRegistry getViewManagerRegistry_DO_NOT_USE() { + return mViewManagerRegistry; + } + private static Map createConstants(ViewManagerResolver viewManagerResolver) { ReactMarker.logMarker(CREATE_UI_MANAGER_MODULE_CONSTANTS_START); SystraceMessage.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "CreateUIManagerConstants")