Files
react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerRegistry.java
T
Andrei Shikov c2b75901cf Change the order of handling exception and clearing react instance manager
Summary:
Changelog: [Internal]
Added better explanation to help debugging ViewManager crashes

Reviewed By: makovkastar

Differential Revision: D24539229

fbshipit-source-id: 36a010324cbf29dfe63784682715b963394a87fb
2020-10-28 17:42:05 -07:00

95 lines
3.3 KiB
Java

/*
* 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 androidx.annotation.Nullable;
import com.facebook.react.common.MapBuilder;
import java.util.List;
import java.util.Map;
/**
* Class that stores the mapping between native view name used in JS and the corresponding instance
* of {@link ViewManager}.
*/
public final class ViewManagerRegistry {
private final Map<String, ViewManager> mViewManagers;
private final @Nullable UIManagerModule.ViewManagerResolver mViewManagerResolver;
public ViewManagerRegistry(UIManagerModule.ViewManagerResolver viewManagerResolver) {
mViewManagers = MapBuilder.newHashMap();
mViewManagerResolver = viewManagerResolver;
}
public ViewManagerRegistry(List<ViewManager> viewManagerList) {
Map<String, ViewManager> viewManagerMap = MapBuilder.newHashMap();
for (ViewManager viewManager : viewManagerList) {
viewManagerMap.put(viewManager.getName(), viewManager);
}
mViewManagers = viewManagerMap;
mViewManagerResolver = null;
}
public ViewManagerRegistry(Map<String, ViewManager> viewManagerMap) {
mViewManagers =
viewManagerMap != null ? viewManagerMap : MapBuilder.<String, ViewManager>newHashMap();
mViewManagerResolver = null;
}
/**
* @param className {@link String} that identifies the {@link ViewManager} inside the {@link
* ViewManagerRegistry}. This methods {@throws IllegalViewOperationException} if there is no
* view manager registered for the className received as a parameter.
* @return the {@link ViewManager} registered to the className received as a parameter
*/
public ViewManager get(String className) {
ViewManager viewManager = mViewManagers.get(className);
if (viewManager != null) {
return viewManager;
}
if (mViewManagerResolver != null) {
viewManager = getViewManagerFromResolver(className);
if (viewManager != null) return viewManager;
throw new IllegalViewOperationException(
"ViewManagerResolver returned null for "
+ className
+ ", existing names are: "
+ mViewManagerResolver.getViewManagerNames());
}
throw new IllegalViewOperationException("No ViewManager found for class " + className);
}
private @Nullable ViewManager getViewManagerFromResolver(String className) {
@Nullable ViewManager viewManager;
viewManager = mViewManagerResolver.getViewManager(className);
if (viewManager != null) {
mViewManagers.put(className, viewManager);
}
return viewManager;
}
/**
* @param className {@link String} that identifies the {@link ViewManager} inside the {@link
* ViewManagerRegistry}.
* @return the {@link ViewManager} registered to the className received as a parameter or null if
* there is no ViewManager associated to the className received as a parameter.
*/
@Nullable
ViewManager getViewManagerIfExists(String className) {
ViewManager viewManager = mViewManagers.get(className);
if (viewManager != null) {
return viewManager;
}
if (mViewManagerResolver != null) {
return getViewManagerFromResolver(className);
}
return null;
}
}