diff --git a/packages/rn-tester/android/app/build.gradle b/packages/rn-tester/android/app/build.gradle index feea8e53d0d..2e70e9014a3 100644 --- a/packages/rn-tester/android/app/build.gradle +++ b/packages/rn-tester/android/app/build.gradle @@ -154,6 +154,7 @@ android { testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' buildConfigField("boolean", "ENABLE_FABRIC", "$enableFabric") + buildConfigField("boolean", "ENABLE_TURBOMODULE", "$enableCodegen") // If using codegen, assume using TurboModule } signingConfigs { release { diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterActivity.java b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterActivity.java index d7a315ca26d..4cbb384cded 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterActivity.java +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterActivity.java @@ -7,8 +7,6 @@ package com.facebook.react.uiapp; -import static com.facebook.react.uiapp.RNTesterApplication.IS_FABRIC_ENABLED; - import android.content.res.Configuration; import android.os.Bundle; import androidx.annotation.Nullable; @@ -31,7 +29,7 @@ public class RNTesterActivity extends ReactActivity { @Override protected ReactRootView createRootView() { ReactRootView reactRootView = new ReactRootView(getContext()); - reactRootView.setIsFabric(IS_FABRIC_ENABLED); + reactRootView.setIsFabric(BuildConfig.ENABLE_FABRIC); return reactRootView; } diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java index e9a946ee224..c191ecaec94 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java @@ -7,16 +7,14 @@ package com.facebook.react.uiapp; -import static com.facebook.react.uiapp.BuildConfig.ENABLE_FABRIC; - import android.app.Application; import android.content.Context; import androidx.annotation.Nullable; -import com.facebook.react.BuildConfig; import com.facebook.react.ReactApplication; import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.JSIModule; import com.facebook.react.bridge.JSIModulePackage; import com.facebook.react.bridge.JSIModuleProvider; import com.facebook.react.bridge.JSIModuleSpec; @@ -24,11 +22,13 @@ import com.facebook.react.bridge.JSIModuleType; import com.facebook.react.bridge.JavaScriptContextHolder; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.UIManager; +import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.fabric.ComponentFactory; import com.facebook.react.fabric.CoreComponentsRegistry; import com.facebook.react.fabric.FabricJSIModuleProvider; import com.facebook.react.fabric.ReactNativeConfig; import com.facebook.react.shell.MainReactPackage; +import com.facebook.react.turbomodule.core.TurboModuleManager; import com.facebook.react.views.text.ReactFontManager; import com.facebook.soloader.SoLoader; import java.lang.reflect.InvocationTargetException; @@ -38,8 +38,6 @@ import java.util.List; public class RNTesterApplication extends Application implements ReactApplication { - static final boolean IS_FABRIC_ENABLED = ENABLE_FABRIC; - private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override @@ -65,7 +63,7 @@ public class RNTesterApplication extends Application implements ReactApplication @Nullable @Override protected JSIModulePackage getJSIModulePackage() { - if (!IS_FABRIC_ENABLED) { + if (!BuildConfig.ENABLE_FABRIC && !ReactFeatureFlags.useTurboModules) { return null; } @@ -75,44 +73,81 @@ public class RNTesterApplication extends Application implements ReactApplication final ReactApplicationContext reactApplicationContext, final JavaScriptContextHolder jsContext) { List specs = new ArrayList<>(); - specs.add( - new JSIModuleSpec() { - @Override - public JSIModuleType getJSIModuleType() { - return JSIModuleType.UIManager; - } - @Override - public JSIModuleProvider getJSIModuleProvider() { - ComponentFactory ComponentFactory = new ComponentFactory(); - CoreComponentsRegistry.register(ComponentFactory); - return new FabricJSIModuleProvider( - reactApplicationContext, - ComponentFactory, - // TODO: T71362667 add ReactNativeConfig's support in RNTester - new ReactNativeConfig() { - @Override - public boolean getBool(String s) { - return true; - } + // Install the new native module system. + if (ReactFeatureFlags.useTurboModules) { + specs.add( + new JSIModuleSpec() { + @Override + public JSIModuleType getJSIModuleType() { + return JSIModuleType.TurboModuleManager; + } - @Override - public int getInt64(String s) { - return 0; - } + @Override + public JSIModuleProvider getJSIModuleProvider() { + return new JSIModuleProvider() { + @Override + public JSIModule get() { + ReactInstanceManager reactInstanceManager = getReactInstanceManager(); + List packages = reactInstanceManager.getPackages(); - @Override - public String getString(String s) { - return ""; - } + return new TurboModuleManager( + jsContext, + new RNTesterTurboModuleManagerDelegate( + reactApplicationContext, packages), + reactApplicationContext + .getCatalystInstance() + .getJSCallInvokerHolder(), + reactApplicationContext + .getCatalystInstance() + .getNativeCallInvokerHolder()); + } + }; + } + }); + } - @Override - public double getDouble(String s) { - return 0; - } - }); - } - }); + // Install the new renderer. + if (BuildConfig.ENABLE_FABRIC) { + specs.add( + new JSIModuleSpec() { + @Override + public JSIModuleType getJSIModuleType() { + return JSIModuleType.UIManager; + } + + @Override + public JSIModuleProvider getJSIModuleProvider() { + ComponentFactory ComponentFactory = new ComponentFactory(); + CoreComponentsRegistry.register(ComponentFactory); + return new FabricJSIModuleProvider( + reactApplicationContext, + ComponentFactory, + // TODO: T71362667 add ReactNativeConfig's support in RNTester + new ReactNativeConfig() { + @Override + public boolean getBool(String s) { + return false; + } + + @Override + public int getInt64(String s) { + return 0; + } + + @Override + public String getString(String s) { + return ""; + } + + @Override + public double getDouble(String s) { + return 0; + } + }); + } + }); + } return specs; } @@ -122,6 +157,8 @@ public class RNTesterApplication extends Application implements ReactApplication @Override public void onCreate() { + // Set `USE_CODEGEN` env var when building RNTester to enable TurboModule. + ReactFeatureFlags.useTurboModules = BuildConfig.ENABLE_TURBOMODULE; ReactFontManager.getInstance().addCustomFont(this, "Rubik", R.font.rubik); super.onCreate(); SoLoader.init(this, /* native exopackage */ false); diff --git a/packages/rn-tester/android/app/src/main/jni/RNTesterAppModuleProvider.cpp b/packages/rn-tester/android/app/src/main/jni/RNTesterAppModuleProvider.cpp index d16c9e6dee8..493d8267e3c 100644 --- a/packages/rn-tester/android/app/src/main/jni/RNTesterAppModuleProvider.cpp +++ b/packages/rn-tester/android/app/src/main/jni/RNTesterAppModuleProvider.cpp @@ -18,6 +18,54 @@ std::shared_ptr RNTesterAppModuleProvider(const std::string moduleN if (module != nullptr) { return module; } + + // TODO: fix up the ReactAndroidSpec_ModuleProvider() to avoid the Android prefix. + if (moduleName == "DatePicker") { + return std::make_shared(params); + } + if (moduleName == "DialogManager") { + return std::make_shared(params); + } + if (moduleName == "ImageLoader") { + return std::make_shared(params); + } + if (moduleName == "Networking") { + return std::make_shared(params); + } + if (moduleName == "Permissions") { + return std::make_shared(params); + } + if (moduleName == "PlatformConstants") { + return std::make_shared(params); + } + if (moduleName == "StatusBarManager") { + return std::make_shared(params); + } + if (moduleName == "Toast") { + return std::make_shared(params); + } + + // TODO: handle some special case naming. + if (moduleName == "IntentAndroid") { + return std::make_shared(params); + } + + // TODO: Animated module has special cases. + if ("NativeAnimatedModule" == moduleName) { + return std::make_shared(params); + } + if ("NativeAnimatedTurboModule" == moduleName) { + return std::make_shared(params); + } + + // TODO: handle multiple names for one spec. + if ("AsyncLocalStorage" == moduleName) { + return std::make_shared(params); + } + if ("AsyncSQLiteDBStorage" == moduleName) { + return std::make_shared(params); + } + return ReactAndroidSpec_ModuleProvider(moduleName, params); }