android: add ReactInstancePackage abstract class to pass down ReactInstanceManager to create modules

Summary:
At times, ReactPackage needs to get information from the ReactInstanceManager, e.g. to get the DevSupportManager for debugging purpose. This allows passing down the instance manager to create the native modules, in addition to just ReactApplicationContext. It is then up to the Package to use it or not.

To use this, you must make your package class extends ReactInstancePackage, instead of just implementing ReactPackage interface.

Reviewed By: mmmulani

Differential Revision: D4641997

fbshipit-source-id: 497c4408a7d2b773c49f08bff7c1bf8f9d372edb
This commit is contained in:
Kevin Gozali
2017-03-06 15:15:15 -08:00
committed by Facebook Github Bot
parent 4c79df9970
commit 7acf74122d
5 changed files with 76 additions and 3 deletions

View File

@@ -25,7 +25,7 @@ import com.facebook.react.uimanager.ViewManager;
* {@code CompositeReactPackage} allows to create a single package composed of views and modules
* from several other packages.
*/
public class CompositeReactPackage implements ReactPackage {
public class CompositeReactPackage extends ReactInstancePackage {
private final List<ReactPackage> mChildReactPackages = new ArrayList<>();
@@ -49,6 +49,7 @@ public class CompositeReactPackage implements ReactPackage {
*/
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
// This is for backward compatibility.
final Map<String, NativeModule> moduleMap = new HashMap<>();
for (ReactPackage reactPackage: mChildReactPackages) {
for (NativeModule nativeModule: reactPackage.createNativeModules(reactContext)) {
@@ -58,6 +59,31 @@ public class CompositeReactPackage implements ReactPackage {
return new ArrayList(moduleMap.values());
}
/**
* {@inheritDoc}
*/
@Override
public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext,
ReactInstanceManager reactInstanceManager) {
final Map<String, NativeModule> moduleMap = new HashMap<>();
for (ReactPackage reactPackage: mChildReactPackages) {
List<NativeModule> nativeModules;
if (reactPackage instanceof ReactInstancePackage) {
ReactInstancePackage reactInstancePackage = (ReactInstancePackage) reactPackage;
nativeModules = reactInstancePackage.createNativeModules(
reactContext,
reactInstanceManager);
} else {
nativeModules = reactPackage.createNativeModules(reactContext);
}
for (NativeModule nativeModule: nativeModules) {
moduleMap.put(nativeModule.getName(), nativeModule);
}
}
return new ArrayList(moduleMap.values());
}
/**
* {@inheritDoc}
*/