From 0b6e9bf0d8be1d0d3d7ec21c47602c22ecfa41c3 Mon Sep 17 00:00:00 2001 From: FabianSolheim Date: Wed, 23 Aug 2023 08:33:41 -0700 Subject: [PATCH] Converted RNTesterReactHostDelegate.java to RNTesterReactHostDelegate.kt (#38978) Summary: This PR converts RNTesterReactHostDelegate into Kotlin as requested in https://github.com/facebook/react-native/issues/38825 . ## Changelog: [INTERNAL] [CHANGED] - Convert to RNTesterReactHostDelegate.java => Kotlin Pull Request resolved: https://github.com/facebook/react-native/pull/38978 Test Plan: Run yarn && yarn android All tests should pass Reviewed By: huntie, rshest Differential Revision: D48598018 Pulled By: cortinico fbshipit-source-id: f29eaa32c63835e090baf60bbde6c0c72b9041c2 --- .../uiapp/RNTesterReactHostDelegate.java | 180 ------------------ .../react/uiapp/RNTesterReactHostDelegate.kt | 124 ++++++++++++ 2 files changed, 124 insertions(+), 180 deletions(-) delete mode 100644 packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.java create mode 100644 packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.java b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.java deleted file mode 100644 index 0f0a68f84a5..00000000000 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.react.uiapp; - -import android.content.Context; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import com.facebook.fbreact.specs.SampleLegacyModule; -import com.facebook.fbreact.specs.SampleTurboModule; -import com.facebook.react.JSEngineResolutionAlgorithm; -import com.facebook.react.ReactPackage; -import com.facebook.react.ReactPackageTurboModuleManagerDelegate; -import com.facebook.react.TurboReactPackage; -import com.facebook.react.bridge.JSBundleLoader; -import com.facebook.react.bridge.NativeModule; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridgeless.BindingsInstaller; -import com.facebook.react.bridgeless.JSCInstance; -import com.facebook.react.bridgeless.JSEngineInstance; -import com.facebook.react.bridgeless.ReactHostDelegate; -import com.facebook.react.bridgeless.ReactHostImpl; -import com.facebook.react.bridgeless.hermes.HermesInstance; -import com.facebook.react.common.annotations.UnstableReactNativeAPI; -import com.facebook.react.config.ReactFeatureFlags; -import com.facebook.react.defaults.DefaultTurboModuleManagerDelegate; -import com.facebook.react.fabric.ReactNativeConfig; -import com.facebook.react.module.model.ReactModuleInfo; -import com.facebook.react.module.model.ReactModuleInfoProvider; -import com.facebook.react.shell.MainReactPackage; -import com.facebook.react.turbomodule.core.TurboModuleManager; -import com.facebook.react.uiapp.component.MyLegacyViewManager; -import com.facebook.react.uiapp.component.MyNativeViewManager; -import com.facebook.react.uimanager.ViewManager; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@UnstableReactNativeAPI -public class RNTesterReactHostDelegate implements ReactHostDelegate { - private final Context mContext; - private @Nullable ReactHostImpl mReactHost; - private @Nullable List mReactPackages; - - RNTesterReactHostDelegate(Context context) { - this.mContext = context; - } - - public void setReactHost(ReactHostImpl reactHost) { - mReactHost = reactHost; - } - - @Override - public String getJsMainModulePath() { - return "js/RNTesterApp.android"; - } - - @Override - public JSBundleLoader getJsBundleLoader() { - return JSBundleLoader.createAssetLoader(mContext, "assets://RNTesterApp.android.bundle", true); - } - - @Override - public synchronized BindingsInstaller getBindingsInstaller() { - return null; - } - - @NonNull - @Override - public ReactPackageTurboModuleManagerDelegate.Builder getTurboModuleManagerDelegateBuilder() { - return new DefaultTurboModuleManagerDelegate.Builder(); - } - - @Override - public JSEngineInstance getJsEngineInstance() { - if (mReactHost.getJSEngineResolutionAlgorithm() == JSEngineResolutionAlgorithm.JSC) { - return new JSCInstance(); - } else { - return new HermesInstance(); - } - } - - @Override - public void handleInstanceException(Exception e) {} - - @Override - public ReactNativeConfig getReactNativeConfig(TurboModuleManager turboModuleManager) { - return ReactNativeConfig.DEFAULT_CONFIG; - } - - @Override - public List getReactPackages() { - if (mReactPackages == null) { - mReactPackages = - Arrays.asList( - new MainReactPackage(), - new TurboReactPackage() { - public NativeModule getModule( - final String name, final ReactApplicationContext reactContext) { - if (!ReactFeatureFlags.useTurboModules) { - return null; - } - - if (SampleTurboModule.NAME.equals(name)) { - return new SampleTurboModule(reactContext); - } - - if (SampleLegacyModule.NAME.equals(name)) { - return new SampleLegacyModule(reactContext); - } - - return null; - } - - // Note: Specialized annotation processor for @ReactModule isn't configured in OSS - // yet. For now, hardcode this information, though it's not necessary for most - // modules. - public ReactModuleInfoProvider getReactModuleInfoProvider() { - return new ReactModuleInfoProvider() { - public Map getReactModuleInfos() { - final Map moduleInfos = new HashMap<>(); - if (ReactFeatureFlags.useTurboModules) { - moduleInfos.put( - SampleTurboModule.NAME, - new ReactModuleInfo( - SampleTurboModule.NAME, - "SampleTurboModule", - false, // canOverrideExistingModule - false, // needsEagerInit - true, // hasConstants - false, // isCxxModule - true // isTurboModule - )); - - moduleInfos.put( - SampleLegacyModule.NAME, - new ReactModuleInfo( - SampleLegacyModule.NAME, - "SampleLegacyModule", - false, // canOverrideExistingModule - false, // needsEagerInit - true, // hasConstants - false, // isCxxModule - false // isTurboModule - )); - } - return moduleInfos; - } - }; - } - }, - new ReactPackage() { - @NonNull - @Override - public List createNativeModules( - @NonNull ReactApplicationContext reactContext) { - return Collections.emptyList(); - } - - @NonNull - @Override - public List createViewManagers( - @NonNull ReactApplicationContext reactContext) { - List viewManagers = new ArrayList<>(); - viewManagers.add(new MyNativeViewManager()); - viewManagers.add(new MyLegacyViewManager(reactContext)); - return viewManagers; - } - }); - } - return mReactPackages; - } -} diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt new file mode 100644 index 00000000000..7bbb30e1471 --- /dev/null +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt @@ -0,0 +1,124 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.uiapp + +import android.content.Context +import com.facebook.fbreact.specs.SampleLegacyModule +import com.facebook.fbreact.specs.SampleTurboModule +import com.facebook.react.JSEngineResolutionAlgorithm +import com.facebook.react.ReactPackage +import com.facebook.react.ReactPackageTurboModuleManagerDelegate +import com.facebook.react.TurboReactPackage +import com.facebook.react.bridge.JSBundleLoader +import com.facebook.react.bridge.NativeModule +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridgeless.BindingsInstaller +import com.facebook.react.bridgeless.JSCInstance +import com.facebook.react.bridgeless.JSEngineInstance +import com.facebook.react.bridgeless.ReactHostDelegate +import com.facebook.react.bridgeless.ReactHostImpl +import com.facebook.react.bridgeless.hermes.HermesInstance +import com.facebook.react.common.annotations.UnstableReactNativeAPI +import com.facebook.react.config.ReactFeatureFlags +import com.facebook.react.defaults.DefaultTurboModuleManagerDelegate +import com.facebook.react.fabric.ReactNativeConfig +import com.facebook.react.module.model.ReactModuleInfo +import com.facebook.react.module.model.ReactModuleInfoProvider +import com.facebook.react.shell.MainReactPackage +import com.facebook.react.turbomodule.core.TurboModuleManager +import com.facebook.react.uiapp.component.MyLegacyViewManager +import com.facebook.react.uiapp.component.MyNativeViewManager +import com.facebook.react.uimanager.ViewManager + +@UnstableReactNativeAPI +class RNTesterReactHostDelegate internal constructor(context: Context) : ReactHostDelegate { + var reactHost: ReactHostImpl? = null + + override val jsMainModulePath: String = "js/RNTesterApp.android" + + override val jsBundleLoader: JSBundleLoader = + JSBundleLoader.createAssetLoader(context, "assets://RNTesterApp.android.bundle", true) + + @get:Synchronized override val bindingsInstaller: BindingsInstaller? = null + + override val turboModuleManagerDelegateBuilder: ReactPackageTurboModuleManagerDelegate.Builder = + DefaultTurboModuleManagerDelegate.Builder() + + override val jsEngineInstance: JSEngineInstance = + if (reactHost?.jsEngineResolutionAlgorithm == JSEngineResolutionAlgorithm.JSC) { + JSCInstance() + } else { + HermesInstance() + } + + override fun handleInstanceException(error: Exception) {} + + override fun getReactNativeConfig(turboModuleManager: TurboModuleManager): ReactNativeConfig = + ReactNativeConfig.DEFAULT_CONFIG + + override val reactPackages: List by lazy { + listOf( + MainReactPackage(), + object : TurboReactPackage() { + override fun getModule( + name: String, + reactContext: ReactApplicationContext + ): NativeModule? = + when { + !ReactFeatureFlags.useTurboModules -> null + name == SampleTurboModule.NAME -> SampleTurboModule(reactContext) + name == SampleLegacyModule.NAME -> SampleLegacyModule(reactContext) + else -> null + } + + // Note: Specialized annotation processor for @ReactModule isn't + // configured in OSS + // yet. For now, hardcode this information, though it's not necessary + // for most modules + override fun getReactModuleInfoProvider(): ReactModuleInfoProvider = + ReactModuleInfoProvider { + if (ReactFeatureFlags.useTurboModules) { + mapOf( + SampleTurboModule.NAME to + ReactModuleInfo( + SampleTurboModule.NAME, + "SampleTurboModule", + false, // canOverrideExistingModule + false, // needsEagerInit + true, // hasConstants + false, // isCxxModule + true // isTurboModule + ), + SampleLegacyModule.NAME to + ReactModuleInfo( + SampleLegacyModule.NAME, + "SampleLegacyModule", + false, // canOverrideExistingModule + false, // needsEagerInit + true, // hasConstants + false, // isCxxModule + false // isTurboModule + ), + ) + } else { + emptyMap() + } + } + }, + object : ReactPackage { + override fun createNativeModules( + reactContext: ReactApplicationContext + ): List = emptyList() + + override fun createViewManagers( + reactContext: ReactApplicationContext + ): List> = + listOf(MyNativeViewManager(), MyLegacyViewManager(reactContext)) + }) + } +}