diff --git a/ReactAndroid/src/main/java/com/facebook/react/BridgeCorePackage.java b/ReactAndroid/src/main/java/com/facebook/react/BridgeCorePackage.java index c4698ffab..7554c223f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/BridgeCorePackage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/BridgeCorePackage.java @@ -9,24 +9,22 @@ package com.facebook.react; -import javax.inject.Provider; - -import java.util.ArrayList; -import java.util.List; - import com.facebook.react.bridge.ModuleSpec; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.module.annotations.ReactModuleList; import com.facebook.react.module.model.ReactModuleInfoProvider; -import com.facebook.react.modules.core.HeadlessJsTaskSupportModule; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.modules.core.ExceptionsManagerModule; +import com.facebook.react.modules.core.HeadlessJsTaskSupportModule; import com.facebook.react.modules.core.Timing; import com.facebook.react.modules.debug.SourceCodeModule; import com.facebook.react.modules.deviceinfo.DeviceInfoModule; import com.facebook.react.modules.systeminfo.AndroidInfoModule; +import java.util.ArrayList; +import java.util.List; +import javax.inject.Provider; /** * Package defining core framework modules for basic JS interop. @@ -61,54 +59,68 @@ import com.facebook.react.modules.systeminfo.AndroidInfoModule; List moduleSpecList = new ArrayList<>(); moduleSpecList.add( - new ModuleSpec(AndroidInfoModule.class, new Provider() { - @Override - public NativeModule get() { - return new AndroidInfoModule(); - } - })); + ModuleSpec.nativeModuleSpec( + AndroidInfoModule.class, + new Provider() { + @Override + public NativeModule get() { + return new AndroidInfoModule(); + } + })); moduleSpecList.add( - new ModuleSpec(DeviceEventManagerModule.class, new Provider() { - @Override - public NativeModule get() { - return new DeviceEventManagerModule(reactContext, mHardwareBackBtnHandler); - } - })); + ModuleSpec.nativeModuleSpec( + DeviceEventManagerModule.class, + new Provider() { + @Override + public NativeModule get() { + return new DeviceEventManagerModule(reactContext, mHardwareBackBtnHandler); + } + })); moduleSpecList.add( - new ModuleSpec(ExceptionsManagerModule.class, new Provider() { - @Override - public NativeModule get() { - return new ExceptionsManagerModule(mReactInstanceManager.getDevSupportManager()); - } - })); - moduleSpecList - .add(new ModuleSpec(HeadlessJsTaskSupportModule.class, new Provider() { - @Override - public NativeModule get() { - return new HeadlessJsTaskSupportModule(reactContext); - } - })); + ModuleSpec.nativeModuleSpec( + ExceptionsManagerModule.class, + new Provider() { + @Override + public NativeModule get() { + return new ExceptionsManagerModule(mReactInstanceManager.getDevSupportManager()); + } + })); moduleSpecList.add( - new ModuleSpec(SourceCodeModule.class, new Provider() { - @Override - public NativeModule get() { - return new SourceCodeModule(reactContext); - } - })); + ModuleSpec.nativeModuleSpec( + HeadlessJsTaskSupportModule.class, + new Provider() { + @Override + public NativeModule get() { + return new HeadlessJsTaskSupportModule(reactContext); + } + })); moduleSpecList.add( - new ModuleSpec(Timing.class, new Provider() { - @Override - public NativeModule get() { - return new Timing(reactContext, mReactInstanceManager.getDevSupportManager()); - } - })); + ModuleSpec.nativeModuleSpec( + SourceCodeModule.class, + new Provider() { + @Override + public NativeModule get() { + return new SourceCodeModule(reactContext); + } + })); moduleSpecList.add( - new ModuleSpec(DeviceInfoModule.class, new Provider() { - @Override - public NativeModule get() { - return new DeviceInfoModule(reactContext); - } - })); + ModuleSpec.nativeModuleSpec( + Timing.class, + new Provider() { + @Override + public NativeModule get() { + return new Timing(reactContext, mReactInstanceManager.getDevSupportManager()); + } + })); + moduleSpecList.add( + ModuleSpec.nativeModuleSpec( + DeviceInfoModule.class, + new Provider() { + @Override + public NativeModule get() { + return new DeviceInfoModule(reactContext); + } + })); return moduleSpecList; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackage.java b/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackage.java index 2d9bdac57..187cabf2a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackage.java @@ -98,16 +98,16 @@ public class CompositeReactPackage extends ReactInstancePackage return new ArrayList<>(viewManagerMap.values()); } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ @Override - public List getViewManagerNames(ReactApplicationContext reactContext) { + public List getViewManagerNames( + ReactApplicationContext reactContext, boolean loadClasses) { Set uniqueNames = new HashSet<>(); for (ReactPackage reactPackage : mChildReactPackages) { if (reactPackage instanceof ViewManagerOnDemandReactPackage) { List names = - ((ViewManagerOnDemandReactPackage) reactPackage).getViewManagerNames(reactContext); + ((ViewManagerOnDemandReactPackage) reactPackage) + .getViewManagerNames(reactContext, loadClasses); if (names != null) { uniqueNames.addAll(names); } @@ -116,18 +116,17 @@ public class CompositeReactPackage extends ReactInstancePackage return new ArrayList<>(uniqueNames); } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ @Override public @Nullable ViewManager createViewManager( - ReactApplicationContext reactContext, String viewManagerName) { + ReactApplicationContext reactContext, String viewManagerName, boolean loadClasses) { ListIterator iterator = mChildReactPackages.listIterator(mChildReactPackages.size()); while (iterator.hasPrevious()) { ReactPackage reactPackage = iterator.previous(); if (reactPackage instanceof ViewManagerOnDemandReactPackage) { ViewManager viewManager = - ((ViewManagerOnDemandReactPackage) reactPackage).createViewManager(reactContext, viewManagerName); + ((ViewManagerOnDemandReactPackage) reactPackage) + .createViewManager(reactContext, viewManagerName, loadClasses); if (viewManager != null) { return viewManager; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java b/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java index 7f0386629..293ca70b5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java @@ -93,86 +93,107 @@ import javax.inject.Provider; List moduleSpecList = new ArrayList<>(); moduleSpecList.add( - new ModuleSpec(AndroidInfoModule.class, new Provider() { - @Override - public NativeModule get() { - return new AndroidInfoModule(); - } - })); + ModuleSpec.nativeModuleSpec( + AndroidInfoModule.class, + new Provider() { + @Override + public NativeModule get() { + return new AndroidInfoModule(); + } + })); moduleSpecList.add( - new ModuleSpec(AnimationsDebugModule.class, new Provider() { - @Override - public NativeModule get() { - return new AnimationsDebugModule( - reactContext, - mReactInstanceManager.getDevSupportManager().getDevSettings()); - } - })); + ModuleSpec.nativeModuleSpec( + AnimationsDebugModule.class, + new Provider() { + @Override + public NativeModule get() { + return new AnimationsDebugModule( + reactContext, mReactInstanceManager.getDevSupportManager().getDevSettings()); + } + })); moduleSpecList.add( - new ModuleSpec(DeviceEventManagerModule.class, new Provider() { - @Override - public NativeModule get() { - return new DeviceEventManagerModule(reactContext, mHardwareBackBtnHandler); - } - })); + ModuleSpec.nativeModuleSpec( + DeviceEventManagerModule.class, + new Provider() { + @Override + public NativeModule get() { + return new DeviceEventManagerModule(reactContext, mHardwareBackBtnHandler); + } + })); moduleSpecList.add( - new ModuleSpec(ExceptionsManagerModule.class, new Provider() { - @Override - public NativeModule get() { - return new ExceptionsManagerModule(mReactInstanceManager.getDevSupportManager()); - } - })); - moduleSpecList - .add(new ModuleSpec(HeadlessJsTaskSupportModule.class, new Provider() { - @Override - public NativeModule get() { - return new HeadlessJsTaskSupportModule(reactContext); - } - })); + ModuleSpec.nativeModuleSpec( + ExceptionsManagerModule.class, + new Provider() { + @Override + public NativeModule get() { + return new ExceptionsManagerModule(mReactInstanceManager.getDevSupportManager()); + } + })); moduleSpecList.add( - new ModuleSpec(SourceCodeModule.class, new Provider() { - @Override - public NativeModule get() { - return new SourceCodeModule(reactContext); - } - })); + ModuleSpec.nativeModuleSpec( + HeadlessJsTaskSupportModule.class, + new Provider() { + @Override + public NativeModule get() { + return new HeadlessJsTaskSupportModule(reactContext); + } + })); moduleSpecList.add( - new ModuleSpec(Timing.class, new Provider() { - @Override - public NativeModule get() { - return new Timing(reactContext, mReactInstanceManager.getDevSupportManager()); - } - })); + ModuleSpec.nativeModuleSpec( + SourceCodeModule.class, + new Provider() { + @Override + public NativeModule get() { + return new SourceCodeModule(reactContext); + } + })); moduleSpecList.add( - new ModuleSpec(UIManagerModule.class, new Provider() { - @Override - public NativeModule get() { - return createUIManager(reactContext); - } - })); + ModuleSpec.nativeModuleSpec( + Timing.class, + new Provider() { + @Override + public NativeModule get() { + return new Timing(reactContext, mReactInstanceManager.getDevSupportManager()); + } + })); moduleSpecList.add( - new ModuleSpec(DeviceInfoModule.class, new Provider() { - @Override - public NativeModule get() { - return new DeviceInfoModule(reactContext); - } - })); + ModuleSpec.nativeModuleSpec( + UIManagerModule.class, + new Provider() { + @Override + public NativeModule get() { + return createUIManager(reactContext); + } + })); + moduleSpecList.add( + ModuleSpec.nativeModuleSpec( + DeviceInfoModule.class, + new Provider() { + @Override + public NativeModule get() { + return new DeviceInfoModule(reactContext); + } + })); if (ReactBuildConfig.DEBUG) { moduleSpecList.add( - new ModuleSpec(JSCHeapCapture.class, new Provider() { - @Override - public NativeModule get() { - return new JSCHeapCapture(reactContext); - } - })); + ModuleSpec.nativeModuleSpec( + JSCHeapCapture.class, + new Provider() { + @Override + public NativeModule get() { + return new JSCHeapCapture(reactContext); + } + })); moduleSpecList.add( - new ModuleSpec(JSCSamplingProfiler.class, new Provider() { - @Override - public NativeModule get() { - return new JSCSamplingProfiler(reactContext); - } - })); + ModuleSpec.nativeModuleSpec( + JSCSamplingProfiler.class, + new Provider() { + @Override + public NativeModule get() { + return new JSCSamplingProfiler(reactContext); + } + })); } return moduleSpecList; diff --git a/ReactAndroid/src/main/java/com/facebook/react/DebugCorePackage.java b/ReactAndroid/src/main/java/com/facebook/react/DebugCorePackage.java index 15466d97a..f847c5cd8 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/DebugCorePackage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/DebugCorePackage.java @@ -9,11 +9,6 @@ package com.facebook.react; -import javax.inject.Provider; - -import java.util.ArrayList; -import java.util.List; - import com.facebook.react.bridge.ModuleSpec; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; @@ -21,6 +16,9 @@ import com.facebook.react.devsupport.JSCHeapCapture; import com.facebook.react.devsupport.JSCSamplingProfiler; import com.facebook.react.module.annotations.ReactModuleList; import com.facebook.react.module.model.ReactModuleInfoProvider; +import java.util.ArrayList; +import java.util.List; +import javax.inject.Provider; /** * Package defining core framework modules (e.g. UIManager). It should be used for modules that @@ -42,19 +40,23 @@ import com.facebook.react.module.model.ReactModuleInfoProvider; public List getNativeModules(final ReactApplicationContext reactContext) { List moduleSpecList = new ArrayList<>(); moduleSpecList.add( - new ModuleSpec(JSCHeapCapture.class, new Provider() { - @Override - public NativeModule get() { - return new JSCHeapCapture(reactContext); - } - })); + ModuleSpec.nativeModuleSpec( + JSCHeapCapture.class, + new Provider() { + @Override + public NativeModule get() { + return new JSCHeapCapture(reactContext); + } + })); moduleSpecList.add( - new ModuleSpec(JSCSamplingProfiler.class, new Provider() { - @Override - public NativeModule get() { - return new JSCSamplingProfiler(reactContext); - } - })); + ModuleSpec.nativeModuleSpec( + JSCSamplingProfiler.class, + new Provider() { + @Override + public NativeModule get() { + return new JSCSamplingProfiler(reactContext); + } + })); return moduleSpecList; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index 868f058ad..ab850f9cf 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -112,27 +112,27 @@ import javax.annotation.Nullable; public class ReactInstanceManager { private static final String TAG = ReactInstanceManager.class.getSimpleName(); - /** * Listener interface for react instance events. */ public interface ReactInstanceEventListener { + /** * Called when the react context is initialized (all modules registered). Always called on the * UI thread. */ void onReactContextInitialized(ReactContext context); } - private final List mAttachedRootViews = Collections.synchronizedList( new ArrayList()); private volatile LifecycleState mLifecycleState; + private @Nullable @ThreadConfined(UI) ReactContextInitParams mPendingReactContextInitParams; private volatile @Nullable Thread mCreateReactContextThread; - /* accessed from any thread */ private final JavaScriptExecutorFactory mJavaScriptExecutorFactory; + private final @Nullable JSBundleLoader mBundleLoader; private final @Nullable String mJSMainModulePath; /* path to JS bundle root on packager server */ private final List mPackages; @@ -157,6 +157,7 @@ public class ReactInstanceManager { private final @Nullable NativeModuleCallExceptionHandler mNativeModuleCallExceptionHandler; private final boolean mLazyNativeModulesEnabled; private final boolean mLazyViewManagersEnabled; + private final boolean mDelayViewManagerClassLoadsEnabled; private final boolean mUseSeparateUIBackgroundThread; private final int mMinNumShakes; private final int mMinTimeLeftInFrameForNonBatchedOperationMs; @@ -231,6 +232,7 @@ public class ReactInstanceManager { @Nullable RedBoxHandler redBoxHandler, boolean lazyNativeModulesEnabled, boolean lazyViewManagersEnabled, + boolean delayViewManagerClassLoadsEnabled, @Nullable DevBundleDownloadListener devBundleDownloadListener, boolean useSeparateUIBackgroundThread, int minNumShakes, @@ -266,18 +268,19 @@ public class ReactInstanceManager { mNativeModuleCallExceptionHandler = nativeModuleCallExceptionHandler; mLazyNativeModulesEnabled = lazyNativeModulesEnabled; mLazyViewManagersEnabled = lazyViewManagersEnabled; + mDelayViewManagerClassLoadsEnabled = delayViewManagerClassLoadsEnabled; mMinTimeLeftInFrameForNonBatchedOperationMs = minTimeLeftInFrameForNonBatchedOperationMs; mUseSeparateUIBackgroundThread = useSeparateUIBackgroundThread; mMinNumShakes = minNumShakes; synchronized (mPackages) { if (!splitPackagesEnabled) { CoreModulesPackage coreModulesPackage = - new CoreModulesPackage( - this, - mBackBtnHandler, - mUIImplementationProvider, - mLazyViewManagersEnabled, - mMinTimeLeftInFrameForNonBatchedOperationMs); + new CoreModulesPackage( + this, + mBackBtnHandler, + mUIImplementationProvider, + mLazyViewManagersEnabled, + mMinTimeLeftInFrameForNonBatchedOperationMs); mPackages.add(coreModulesPackage); } else { PrinterHolder.getPrinter().logMessage(ReactDebugOverlayTags.RN_CORE, "RNCore: Use Split Packages"); @@ -286,11 +289,12 @@ public class ReactInstanceManager { mPackages.add(new DebugCorePackage()); } if (!useOnlyDefaultPackages) { - mPackages.add(new ReactNativeCorePackage( - this, - mUIImplementationProvider, - mLazyViewManagersEnabled, - mMinTimeLeftInFrameForNonBatchedOperationMs)); + mPackages.add( + new ReactNativeCorePackage( + this, + mUIImplementationProvider, + mLazyViewManagersEnabled, + mMinTimeLeftInFrameForNonBatchedOperationMs)); } } mPackages.addAll(packages); @@ -793,8 +797,8 @@ public class ReactInstanceManager { for (ReactPackage reactPackage : mPackages) { if (reactPackage instanceof ViewManagerOnDemandReactPackage) { ViewManager viewManager = - ((ViewManagerOnDemandReactPackage) reactPackage) - .createViewManager(context, viewManagerName); + ((ViewManagerOnDemandReactPackage) reactPackage) + .createViewManager(context, viewManagerName, !mDelayViewManagerClassLoadsEnabled); if (viewManager != null) { return viewManager; } @@ -812,7 +816,8 @@ public class ReactInstanceManager { for (ReactPackage reactPackage : mPackages) { if (reactPackage instanceof ViewManagerOnDemandReactPackage) { List names = - ((ViewManagerOnDemandReactPackage) reactPackage).getViewManagerNames(context); + ((ViewManagerOnDemandReactPackage) reactPackage) + .getViewManagerNames(context, !mDelayViewManagerClassLoadsEnabled); if (names != null) { uniqueNames.addAll(names); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java index 607a17945..59eaa71e7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java @@ -6,7 +6,6 @@ import static com.facebook.react.modules.systeminfo.AndroidInfoHelpers.getFriend import android.app.Activity; import android.app.Application; -import android.os.Build; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.JSBundleLoader; import com.facebook.react.bridge.JSCJavaScriptExecutorFactory; @@ -44,6 +43,7 @@ public class ReactInstanceManagerBuilder { private @Nullable RedBoxHandler mRedBoxHandler; private boolean mLazyNativeModulesEnabled; private boolean mLazyViewManagersEnabled; + private boolean mDelayViewManagerClassLoadsEnabled; private @Nullable DevBundleDownloadListener mDevBundleDownloadListener; private @Nullable JavaScriptExecutorFactory mJavaScriptExecutorFactory; private boolean mUseSeparateUIBackgroundThread; @@ -204,6 +204,12 @@ public class ReactInstanceManagerBuilder { return this; } + public ReactInstanceManagerBuilder setDelayViewManagerClassLoadsEnabled( + boolean delayViewManagerClassLoadsEnabled) { + mDelayViewManagerClassLoadsEnabled = delayViewManagerClassLoadsEnabled; + return this; + } + public ReactInstanceManagerBuilder setDevBundleDownloadListener( @Nullable DevBundleDownloadListener listener) { mDevBundleDownloadListener = listener; @@ -290,6 +296,7 @@ public class ReactInstanceManagerBuilder { mRedBoxHandler, mLazyNativeModulesEnabled, mLazyViewManagersEnabled, + mDelayViewManagerClassLoadsEnabled, mDevBundleDownloadListener, mUseSeparateUIBackgroundThread, mMinNumShakes, diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactNativeCorePackage.java b/ReactAndroid/src/main/java/com/facebook/react/ReactNativeCorePackage.java index 3149f1a7a..0e7b36edb 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactNativeCorePackage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactNativeCorePackage.java @@ -22,7 +22,7 @@ import com.facebook.react.uimanager.UIImplementationProvider; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.ViewManager; import com.facebook.systrace.Systrace; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; import javax.annotation.Nullable; import javax.inject.Provider; @@ -57,17 +57,15 @@ public class ReactNativeCorePackage extends LazyReactPackage { @Override public List getNativeModules(final ReactApplicationContext reactContext) { - List moduleSpecList = new ArrayList<>(); - - moduleSpecList.add( - new ModuleSpec(UIManagerModule.class, new Provider() { - @Override - public NativeModule get() { - return createUIManager(reactContext); - } - })); - - return moduleSpecList; + return Collections.singletonList( + ModuleSpec.nativeModuleSpec( + UIManagerModule.class, + new Provider() { + @Override + public NativeModule get() { + return createUIManager(reactContext); + } + })); } @Override diff --git a/ReactAndroid/src/main/java/com/facebook/react/ViewManagerOnDemandReactPackage.java b/ReactAndroid/src/main/java/com/facebook/react/ViewManagerOnDemandReactPackage.java index 0abf83568..1e0ee9570 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ViewManagerOnDemandReactPackage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ViewManagerOnDemandReactPackage.java @@ -18,11 +18,17 @@ public interface ViewManagerOnDemandReactPackage { /** * Provides a list of names of ViewManagers with which these modules can be accessed from JS. * Typically, this is ViewManager.getName(). + * + * @param loadClasses defines if View Managers classes should be loaded or be avoided. */ - List getViewManagerNames(ReactApplicationContext reactContext); + List getViewManagerNames(ReactApplicationContext reactContext, boolean loadClasses); /** - * Creates and returns a ViewManager with a specific name {@param viewManagerName}. It's up to - * an implementing package how to interpret the name. + * Creates and returns a ViewManager with a specific name {@param viewManagerName}. It's up to an + * implementing package how to interpret the name. + * + * @param loadClasses defines if View Managers classes should be loaded or be avoided. */ - @Nullable ViewManager createViewManager(ReactApplicationContext reactContext, String viewManagerName); + @Nullable + ViewManager createViewManager( + ReactApplicationContext reactContext, String viewManagerName, boolean loadClasses); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleSpec.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleSpec.java index 7c2704aef..6eddfe56f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleSpec.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleSpec.java @@ -9,13 +9,11 @@ package com.facebook.react.bridge; +import com.facebook.react.common.build.ReactBuildConfig; +import java.lang.reflect.Constructor; import javax.annotation.Nullable; import javax.inject.Provider; -import java.lang.reflect.Constructor; - -import com.facebook.react.common.build.ReactBuildConfig; - /** * A specification for a native module. This exists so that we don't have to pay the cost * for creation until/if the module is used. @@ -27,7 +25,7 @@ public class ModuleSpec { private static final Class[] EMPTY_SIGNATURE = {}; private static final Class[] CONTEXT_SIGNATURE = { ReactApplicationContext.class }; - private final Class mType; + private final @Nullable Class mType; private final Provider mProvider; /** @@ -64,12 +62,22 @@ public class ModuleSpec { }); } - public ModuleSpec(Class type, Provider provider) { + public static ModuleSpec viewManagerSpec(Provider provider) { + return new ModuleSpec(null, provider); + } + + public static ModuleSpec nativeModuleSpec( + Class type, Provider provider) { + return new ModuleSpec(type, provider); + } + + private ModuleSpec( + @Nullable Class type, Provider provider) { mType = type; mProvider = provider; } - public Class getType() { + public @Nullable Class getType() { return mType; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/shell/MainReactPackage.java b/ReactAndroid/src/main/java/com/facebook/react/shell/MainReactPackage.java index 052150617..a37e42edd 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/shell/MainReactPackage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/shell/MainReactPackage.java @@ -100,7 +100,7 @@ public class MainReactPackage extends LazyReactPackage { @Override public List getNativeModules(final ReactApplicationContext context) { return Arrays.asList( - new ModuleSpec( + ModuleSpec.nativeModuleSpec( AccessibilityInfoModule.class, new Provider() { @Override @@ -108,7 +108,7 @@ public class MainReactPackage extends LazyReactPackage { return new AccessibilityInfoModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( AppStateModule.class, new Provider() { @Override @@ -116,7 +116,7 @@ public class MainReactPackage extends LazyReactPackage { return new AppStateModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( BlobModule.class, new Provider() { @Override @@ -124,7 +124,7 @@ public class MainReactPackage extends LazyReactPackage { return new BlobModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( AsyncStorageModule.class, new Provider() { @Override @@ -132,7 +132,7 @@ public class MainReactPackage extends LazyReactPackage { return new AsyncStorageModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( CameraRollManager.class, new Provider() { @Override @@ -140,7 +140,7 @@ public class MainReactPackage extends LazyReactPackage { return new CameraRollManager(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( ClipboardModule.class, new Provider() { @Override @@ -148,7 +148,7 @@ public class MainReactPackage extends LazyReactPackage { return new ClipboardModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( DatePickerDialogModule.class, new Provider() { @Override @@ -156,7 +156,7 @@ public class MainReactPackage extends LazyReactPackage { return new DatePickerDialogModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( DialogModule.class, new Provider() { @Override @@ -164,7 +164,7 @@ public class MainReactPackage extends LazyReactPackage { return new DialogModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( FrescoModule.class, new Provider() { @Override @@ -173,7 +173,7 @@ public class MainReactPackage extends LazyReactPackage { context, true, mConfig != null ? mConfig.getFrescoConfig() : null); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( I18nManagerModule.class, new Provider() { @Override @@ -181,7 +181,7 @@ public class MainReactPackage extends LazyReactPackage { return new I18nManagerModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( ImageEditingManager.class, new Provider() { @Override @@ -189,7 +189,7 @@ public class MainReactPackage extends LazyReactPackage { return new ImageEditingManager(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( ImageLoaderModule.class, new Provider() { @Override @@ -197,7 +197,7 @@ public class MainReactPackage extends LazyReactPackage { return new ImageLoaderModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( ImageStoreManager.class, new Provider() { @Override @@ -205,7 +205,7 @@ public class MainReactPackage extends LazyReactPackage { return new ImageStoreManager(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( IntentModule.class, new Provider() { @Override @@ -213,7 +213,7 @@ public class MainReactPackage extends LazyReactPackage { return new IntentModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( LocationModule.class, new Provider() { @Override @@ -221,7 +221,7 @@ public class MainReactPackage extends LazyReactPackage { return new LocationModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( NativeAnimatedModule.class, new Provider() { @Override @@ -229,7 +229,7 @@ public class MainReactPackage extends LazyReactPackage { return new NativeAnimatedModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( NetworkingModule.class, new Provider() { @Override @@ -237,7 +237,7 @@ public class MainReactPackage extends LazyReactPackage { return new NetworkingModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( NetInfoModule.class, new Provider() { @Override @@ -245,7 +245,7 @@ public class MainReactPackage extends LazyReactPackage { return new NetInfoModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( PermissionsModule.class, new Provider() { @Override @@ -253,7 +253,7 @@ public class MainReactPackage extends LazyReactPackage { return new PermissionsModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( ShareModule.class, new Provider() { @Override @@ -261,7 +261,7 @@ public class MainReactPackage extends LazyReactPackage { return new ShareModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( StatusBarModule.class, new Provider() { @Override @@ -269,7 +269,7 @@ public class MainReactPackage extends LazyReactPackage { return new StatusBarModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( TimePickerDialogModule.class, new Provider() { @Override @@ -277,7 +277,7 @@ public class MainReactPackage extends LazyReactPackage { return new TimePickerDialogModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( ToastModule.class, new Provider() { @Override @@ -285,7 +285,7 @@ public class MainReactPackage extends LazyReactPackage { return new ToastModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( VibrationModule.class, new Provider() { @Override @@ -293,7 +293,7 @@ public class MainReactPackage extends LazyReactPackage { return new VibrationModule(context); } }), - new ModuleSpec( + ModuleSpec.nativeModuleSpec( WebSocketModule.class, new Provider() { @Override