diff --git a/ReactAndroid/src/main/java/com/facebook/react/NativeModuleRegistryBuilder.java b/ReactAndroid/src/main/java/com/facebook/react/NativeModuleRegistryBuilder.java index b8898dc10..ba107f1a6 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/NativeModuleRegistryBuilder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/NativeModuleRegistryBuilder.java @@ -122,14 +122,7 @@ public class NativeModuleRegistryBuilder { } public NativeModuleRegistry build() { - ArrayList batchCompleteListenerModules = new ArrayList<>(); - for (Map.Entry entry : mModules.entrySet()) { - if (entry.getValue().hasOnBatchCompleteListener()) { - batchCompleteListenerModules.add(entry.getValue()); - } - } - return new NativeModuleRegistry( - mReactApplicationContext, mModules, batchCompleteListenerModules); + mReactApplicationContext, mModules); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.java index f1b67e7a8..469377543 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.java @@ -41,7 +41,6 @@ public class ModuleHolder { private final boolean mCanOverrideExistingModule; private final boolean mHasConstants; private final boolean mIsCxxModule; - private final boolean mHasOnBatchCompleteListener; private @Nullable Provider mProvider; // Outside of the constructur, these should only be checked or set when synchronized on this @@ -57,7 +56,6 @@ public class ModuleHolder { mCanOverrideExistingModule = moduleInfo.canOverrideExistingModule(); mHasConstants = moduleInfo.hasConstants(); mProvider = provider; - mHasOnBatchCompleteListener = moduleInfo.hasOnBatchCompleteListener(); mIsCxxModule = moduleInfo.isCxxModule(); if (moduleInfo.needsEagerInit()) { mModule = create(); @@ -69,7 +67,6 @@ public class ModuleHolder { mCanOverrideExistingModule = nativeModule.canOverrideExistingModule(); mHasConstants = true; mIsCxxModule = CxxModuleWrapper.class.isAssignableFrom(nativeModule.getClass()); - mHasOnBatchCompleteListener = OnBatchCompleteListener.class.isAssignableFrom(nativeModule.getClass()); mModule = nativeModule; PrinterHolder.getPrinter() .logMessage(ReactDebugOverlayTags.NATIVE_MODULE, "NativeModule init: %s", mName); @@ -121,8 +118,6 @@ public class ModuleHolder { public boolean isCxxModule() {return mIsCxxModule; } - public boolean hasOnBatchCompleteListener() {return mHasOnBatchCompleteListener; } - @DoNotStrip public NativeModule getModule() { NativeModule module; diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.java index ffd2e8ecf..f13f88fbb 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.java @@ -7,14 +7,12 @@ package com.facebook.react.bridge; +import com.facebook.infer.annotation.Assertions; +import com.facebook.systrace.Systrace; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.HashMap; - -import com.facebook.infer.annotation.Assertions; -import com.facebook.systrace.Systrace; /** * A set of Java APIs to expose to a particular JavaScript instance. @@ -23,15 +21,12 @@ public class NativeModuleRegistry { private final ReactApplicationContext mReactApplicationContext; private final Map mModules; - private final ArrayList mBatchCompleteListenerModules; public NativeModuleRegistry( ReactApplicationContext reactApplicationContext, - Map modules, - ArrayList batchCompleteListenerModules) { + Map modules) { mReactApplicationContext = reactApplicationContext; mModules = modules; - mBatchCompleteListenerModules = batchCompleteListenerModules; } /** @@ -45,10 +40,6 @@ public class NativeModuleRegistry { return mReactApplicationContext; } - private ArrayList getBatchCompleteListenerModules() { - return mBatchCompleteListenerModules; - } - /* package */ Collection getJavaModules( JSInstance jsInstance) { ArrayList javaModules = new ArrayList<>(); @@ -81,15 +72,11 @@ public class NativeModuleRegistry { "Extending native modules with non-matching application contexts."); Map newModules = newRegister.getModuleMap(); - ArrayList batchCompleteListeners = newRegister.getBatchCompleteListenerModules(); for (Map.Entry entry : newModules.entrySet()) { String key = entry.getKey(); if (!mModules.containsKey(key)) { ModuleHolder value = entry.getValue(); - if (batchCompleteListeners.contains(value)) { - mBatchCompleteListenerModules.add(value); - } mModules.put(key, value); } } @@ -129,10 +116,13 @@ public class NativeModuleRegistry { } public void onBatchComplete() { - for (ModuleHolder moduleHolder : mBatchCompleteListenerModules) { - if (moduleHolder.hasInstance()) { - ((OnBatchCompleteListener) moduleHolder.getModule()).onBatchComplete(); - } + // The only native module that uses the onBatchComplete is the UI Manager. Hence, instead of + // iterating over all the modules for find this one instance, and then calling it, we short-circuit + // the search, and simply call OnBatchComplete on the UI Manager. + // With Fabric, UIManager would no longer be a NativeModule, so this call would simply go away + ModuleHolder moduleHolder = mModules.get("com.facebook.react.uimanager.UIManagerModule"); + if (moduleHolder != null && moduleHolder.hasInstance()) { + ((OnBatchCompleteListener) moduleHolder.getModule()).onBatchComplete(); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/module/model/ReactModuleInfo.java b/ReactAndroid/src/main/java/com/facebook/react/module/model/ReactModuleInfo.java index 5cafdc44e..58b416df3 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/module/model/ReactModuleInfo.java +++ b/ReactAndroid/src/main/java/com/facebook/react/module/model/ReactModuleInfo.java @@ -16,21 +16,18 @@ public class ReactModuleInfo { private final boolean mNeedsEagerInit; private final boolean mHasConstants; private final boolean mIsCxxModule; - private final boolean mHasOnBatchCompleteListener; public ReactModuleInfo( String name, boolean canOverrideExistingModule, boolean needsEagerInit, boolean hasConstants, - boolean isCxxModule, - boolean hasOnBatchCompleteListener) { + boolean isCxxModule) { mName = name; mCanOverrideExistingModule = canOverrideExistingModule; mNeedsEagerInit = needsEagerInit; mHasConstants = hasConstants; mIsCxxModule = isCxxModule; - mHasOnBatchCompleteListener = hasOnBatchCompleteListener; } public String name() { @@ -51,7 +48,4 @@ public class ReactModuleInfo { public boolean isCxxModule() {return mIsCxxModule; } - public boolean hasOnBatchCompleteListener() { - return mHasOnBatchCompleteListener; - } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/module/processing/ReactModuleSpecProcessor.java b/ReactAndroid/src/main/java/com/facebook/react/module/processing/ReactModuleSpecProcessor.java index ab5dbe85e..7137e3944 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/module/processing/ReactModuleSpecProcessor.java +++ b/ReactAndroid/src/main/java/com/facebook/react/module/processing/ReactModuleSpecProcessor.java @@ -6,7 +6,6 @@ package com.facebook.react.module.processing; import com.facebook.react.bridge.CxxModuleWrapper; -import com.facebook.react.bridge.OnBatchCompleteListener; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Filer; import javax.annotation.processing.Messager; @@ -160,7 +159,6 @@ public class ReactModuleSpecProcessor extends AbstractProcessor { builder.addStatement("$T map = new $T()", MAP_TYPE, INSTANTIATED_MAP_TYPE); TypeMirror cxxModuleWrapperTypeMirror = mElements.getTypeElement(CxxModuleWrapper.class.getName()).asType(); - TypeMirror onBatchCompleteListenerTypeMirror = mElements.getTypeElement(OnBatchCompleteListener.class.getName()).asType(); for (String nativeModule : nativeModules) { String keyString = nativeModule; @@ -192,17 +190,6 @@ public class ReactModuleSpecProcessor extends AbstractProcessor { } boolean isCxxModule = mTypes.isAssignable(typeElement.asType(), cxxModuleWrapperTypeMirror); - boolean hasOnBatchCompleteListener = false; - try { - hasOnBatchCompleteListener = mTypes.isAssignable(typeElement.asType(), onBatchCompleteListenerTypeMirror); - } catch (RuntimeException e) { - // This is SUPER ugly, but we need to do this, especially for AsyncStorageModule which implements ModuleDataCleaner - // In the case of that specific class, we get the exception - // com.sun.tools.javac.code.Symbol$CompletionFailure: class file for ModuleDataCleaner not found. - // The exception is caused because the class is not loaded the first time. However, catching it and - // running it again the second time loads the class and does what the following statement originally intended - hasOnBatchCompleteListener = mTypes.isAssignable(typeElement.asType(), onBatchCompleteListenerTypeMirror); - } String valueString = new StringBuilder() .append("new ReactModuleInfo(") @@ -210,8 +197,7 @@ public class ReactModuleSpecProcessor extends AbstractProcessor { .append(reactModule.canOverrideExistingModule()).append(", ") .append(reactModule.needsEagerInit()).append(", ") .append(hasConstants).append(", ") - .append(isCxxModule).append(", ") - .append(hasOnBatchCompleteListener) + .append(isCxxModule) .append(")") .toString();