Implement lazy discovery for ViewManagers.

Reviewed By: kathryngray

Differential Revision: D5865095

fbshipit-source-id: c94970e4cd7aafb20cf844c48feea053ac8b6b0f
This commit is contained in:
Dmitry Zakharov
2017-09-28 09:40:39 -07:00
committed by Facebook Github Bot
parent c4f7ce9afd
commit da30b04703
24 changed files with 469 additions and 169 deletions

View File

@@ -9,23 +9,25 @@
package com.facebook.react;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
/**
* {@code CompositeReactPackage} allows to create a single package composed of views and modules
* from several other packages.
*/
public class CompositeReactPackage extends ReactInstancePackage {
public class CompositeReactPackage extends ReactInstancePackage
implements ViewManagerOnDemandReactPackage {
private final List<ReactPackage> mChildReactPackages = new ArrayList<>();
@@ -39,9 +41,7 @@ public class CompositeReactPackage extends ReactInstancePackage {
mChildReactPackages.add(arg1);
mChildReactPackages.add(arg2);
for (ReactPackage reactPackage: args) {
mChildReactPackages.add(reactPackage);
}
Collections.addAll(mChildReactPackages, args);
}
/**
@@ -56,7 +56,7 @@ public class CompositeReactPackage extends ReactInstancePackage {
moduleMap.put(nativeModule.getName(), nativeModule);
}
}
return new ArrayList(moduleMap.values());
return new ArrayList<>(moduleMap.values());
}
/**
@@ -81,7 +81,7 @@ public class CompositeReactPackage extends ReactInstancePackage {
moduleMap.put(nativeModule.getName(), nativeModule);
}
}
return new ArrayList(moduleMap.values());
return new ArrayList<>(moduleMap.values());
}
/**
@@ -95,6 +95,44 @@ public class CompositeReactPackage extends ReactInstancePackage {
viewManagerMap.put(viewManager.getName(), viewManager);
}
}
return new ArrayList(viewManagerMap.values());
return new ArrayList<>(viewManagerMap.values());
}
/**
* {@inheritDoc}
*/
@Override
public List<String> getViewManagerNames(ReactApplicationContext reactContext) {
Set<String> uniqueNames = new HashSet<>();
for (ReactPackage reactPackage : mChildReactPackages) {
if (reactPackage instanceof ViewManagerOnDemandReactPackage) {
List<String> names =
((ViewManagerOnDemandReactPackage) reactPackage).getViewManagerNames(reactContext);
if (names != null) {
uniqueNames.addAll(names);
}
}
}
return new ArrayList<>(uniqueNames);
}
/**
* {@inheritDoc}
*/
@Override
public @Nullable ViewManager createViewManager(
ReactApplicationContext reactContext, String viewManagerName) {
ListIterator<ReactPackage> iterator = mChildReactPackages.listIterator(mChildReactPackages.size());
while (iterator.hasPrevious()) {
ReactPackage reactPackage = iterator.previous();
if (reactPackage instanceof ViewManagerOnDemandReactPackage) {
ViewManager viewManager =
((ViewManagerOnDemandReactPackage) reactPackage).createViewManager(reactContext, viewManagerName);
if (viewManager != null) {
return viewManager;
}
}
}
return null;
}
}