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
This commit is contained in:
Lulu Wu
2021-02-16 10:09:53 -08:00
committed by Facebook GitHub Bot
parent 099f67cf8a
commit eaedb10755
7 changed files with 34 additions and 23 deletions
@@ -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);
@@ -67,7 +67,7 @@ public class UIImplementation {
public UIImplementation(
ReactApplicationContext reactContext,
UIManagerModule.ViewManagerResolver viewManagerResolver,
ViewManagerResolver viewManagerResolver,
EventDispatcher eventDispatcher,
int minTimeLeftInFrameForNonBatchedOperationMs) {
this(
@@ -18,7 +18,7 @@ public class UIImplementationProvider {
public UIImplementation createUIImplementation(
ReactApplicationContext reactContext,
UIManagerModule.ViewManagerResolver viewManagerResolver,
ViewManagerResolver viewManagerResolver,
EventDispatcher eventDispatcher,
int minTimeLeftInFrameForNonBatchedOperationMs) {
Systrace.beginSection(
@@ -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<String> 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. */
@@ -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<String, Object> createConstants(
UIManagerModule.ViewManagerResolver resolver) {
/* package */ static Map<String, Object> createConstants(ViewManagerResolver resolver) {
Map<String, Object> constants = UIManagerModuleConstants.getConstants();
constants.put("ViewManagerNames", resolver.getViewManagerNames());
constants.put("LazyViewManagersEnabled", true);
@@ -19,9 +19,9 @@ import java.util.Map;
public final class ViewManagerRegistry {
private final Map<String, ViewManager> 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;
}
@@ -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<String> getViewManagerNames();
}