From eaedb107551b614b8cb7ff39762d934657ca813f Mon Sep 17 00:00:00 2001 From: Lulu Wu Date: Tue, 16 Feb 2021 10:09:53 -0800 Subject: [PATCH] Switch to using ViewManagerResolver for view managers Summary: Right now the FbReactInstanceDelegate provides a list of view managers to the instance during initialization, this means that we're basically eagerly loading all of the view manager classes. In this change we use ViewManagerResolver instead. Changelog: [Android][Changed] - Move ViewManagerResolver into a seperate file Reviewed By: mdvacca Differential Revision: D26424214 fbshipit-source-id: 550ade31c256a56d6e32c463f112ea16dd55a218 --- .../facebook/react/CoreModulesPackage.java | 5 ++-- .../react/uimanager/UIImplementation.java | 2 +- .../uimanager/UIImplementationProvider.java | 2 +- .../react/uimanager/UIManagerModule.java | 15 ----------- .../UIManagerModuleConstantsHelper.java | 3 +-- .../react/uimanager/ViewManagerRegistry.java | 4 +-- .../react/uimanager/ViewManagerResolver.java | 26 +++++++++++++++++++ 7 files changed, 34 insertions(+), 23 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerResolver.java diff --git a/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java b/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java index 36fb15b0a52..59c5c7759c5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java @@ -35,6 +35,7 @@ import com.facebook.react.turbomodule.core.interfaces.TurboModule; import com.facebook.react.uimanager.UIImplementationProvider; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.ViewManager; +import com.facebook.react.uimanager.ViewManagerResolver; import com.facebook.systrace.Systrace; import java.util.HashMap; import java.util.List; @@ -175,8 +176,8 @@ public class CoreModulesPackage extends TurboReactPackage implements ReactPackag Systrace.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "createUIManagerModule"); try { if (mLazyViewManagersEnabled) { - UIManagerModule.ViewManagerResolver resolver = - new UIManagerModule.ViewManagerResolver() { + ViewManagerResolver resolver = + new ViewManagerResolver() { @Override public @Nullable ViewManager getViewManager(String viewManagerName) { return mReactInstanceManager.createViewManager(viewManagerName); 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 924bdf99940..ae025211f7a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -67,7 +67,7 @@ public class UIImplementation { public UIImplementation( ReactApplicationContext reactContext, - UIManagerModule.ViewManagerResolver viewManagerResolver, + ViewManagerResolver viewManagerResolver, EventDispatcher eventDispatcher, int minTimeLeftInFrameForNonBatchedOperationMs) { this( 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 dd51fe3a32f..efc7703918e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementationProvider.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementationProvider.java @@ -18,7 +18,7 @@ public class UIImplementationProvider { public UIImplementation createUIImplementation( ReactApplicationContext reactContext, - UIManagerModule.ViewManagerResolver viewManagerResolver, + ViewManagerResolver viewManagerResolver, EventDispatcher eventDispatcher, int minTimeLeftInFrameForNonBatchedOperationMs) { Systrace.beginSection( 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 13a790fff86..1d49251377d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -89,21 +89,6 @@ public class UIManagerModule extends ReactContextBaseJavaModule implements OnBatchCompleteListener, LifecycleEventListener, UIManager { public static final String TAG = UIManagerModule.class.getSimpleName(); - /** Enables lazy discovery of a specific {@link ViewManager} by its name. */ - public interface ViewManagerResolver { - /** - * {@class UIManagerModule} class uses this method to get a ViewManager by its name. This is the - * same name that comes from JS by {@code UIManager.ViewManagerName} call. - */ - @Nullable - ViewManager getViewManager(String viewManagerName); - - /** - * Provides a list of view manager names to register in JS as {@code UIManager.ViewManagerName} - */ - List getViewManagerNames(); - } - /** Resolves a name coming from native side to a name of the event that is exposed to JS. */ public interface CustomEventNamesResolver { /** Returns custom event name by the provided event name. */ 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 19e887b87cd..40a3730b7cb 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java @@ -31,8 +31,7 @@ import java.util.Map; * UIManager.getViewManagerConfig('SpecificViewManager')} call happens. The View Manager is then * registered on the JS side with the help of {@code UIManagerModule.getConstantsForViewManager}. */ - /* package */ static Map createConstants( - UIManagerModule.ViewManagerResolver resolver) { + /* package */ static Map createConstants(ViewManagerResolver resolver) { Map constants = UIManagerModuleConstants.getConstants(); constants.put("ViewManagerNames", resolver.getViewManagerNames()); constants.put("LazyViewManagersEnabled", true); diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerRegistry.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerRegistry.java index a6ceb3e395a..b01234dbb6d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerRegistry.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerRegistry.java @@ -19,9 +19,9 @@ import java.util.Map; public final class ViewManagerRegistry { private final Map mViewManagers; - private final @Nullable UIManagerModule.ViewManagerResolver mViewManagerResolver; + private final @Nullable ViewManagerResolver mViewManagerResolver; - public ViewManagerRegistry(UIManagerModule.ViewManagerResolver viewManagerResolver) { + public ViewManagerRegistry(ViewManagerResolver viewManagerResolver) { mViewManagers = MapBuilder.newHashMap(); mViewManagerResolver = viewManagerResolver; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerResolver.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerResolver.java new file mode 100644 index 00000000000..d00b30fe804 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerResolver.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.uimanager; + +import java.util.List; +import javax.annotation.Nullable; + +/** Enables lazy discovery of a specific {@link ViewManager} by its name. */ +public interface ViewManagerResolver { + /** + * {@class UIManagerModule} class uses this method to get a ViewManager by its name. This is the + * same name that comes from JS by {@code UIManager.ViewManagerName} call. + */ + @Nullable + ViewManager getViewManager(String viewManagerName); + + /** + * Provides a list of view manager names to register in JS as {@code UIManager.ViewManagerName} + */ + List getViewManagerNames(); +}