From a07c31bb4b45fd248df7cf698ccc2cfaaf2d4ddf Mon Sep 17 00:00:00 2001 From: Lulu Wu Date: Mon, 25 Sep 2023 14:54:04 -0700 Subject: [PATCH] Add DefaultReactHost for Template (#39585) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/39585 So that to enable Bridgeless in Template android we only need to override the ReactHostInterface variable in Template's application, see D49464580 Changelog: [Android][Changed] - Add DefaultReactHost Reviewed By: cortinico Differential Revision: D49463901 fbshipit-source-id: ff6ef1bef8626996a3658597d1519eec310c77c3 --- .../react/defaults/DefaultReactHost.kt | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHost.kt diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHost.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHost.kt new file mode 100644 index 00000000000..cb8ce917c46 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHost.kt @@ -0,0 +1,59 @@ +/* + * 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.defaults + +import android.content.Context +import com.facebook.react.ReactPackage +import com.facebook.react.bridge.JSBundleLoader +import com.facebook.react.common.annotations.UnstableReactNativeAPI +import com.facebook.react.fabric.ComponentFactory +import com.facebook.react.interfaces.ReactHost +import com.facebook.react.interfaces.exceptionmanager.ReactJsExceptionHandler +import com.facebook.react.runtime.JSCInstance +import com.facebook.react.runtime.ReactHostImpl +import com.facebook.react.runtime.hermes.HermesInstance + +@UnstableReactNativeAPI +object DefaultReactHost { + private var reactHost: ReactHost? = null + + @JvmStatic + fun getDefaultReactHost( + context: Context, + packageList: List, + jsMainModulePath: String = "index", + jsBundleAssetPath: String = "index", + isHermesEnabled: Boolean = true + ): ReactHost { + if (reactHost == null) { + val jsBundleLoader = + JSBundleLoader.createAssetLoader(context, "assets://$jsBundleAssetPath", true) + val jsEngineInstance = if (isHermesEnabled) HermesInstance() else JSCInstance() + val defaultReactHostDelegate = + DefaultReactHostDelegate( + jsMainModulePath = jsMainModulePath, + jsBundleLoader = jsBundleLoader, + reactPackages = packageList, + jsEngineInstance = jsEngineInstance, + turboModuleManagerDelegateBuilder = DefaultTurboModuleManagerDelegate.Builder()) + val reactJsExceptionHandler = ReactJsExceptionHandler { _ -> } + val componentFactory = ComponentFactory() + DefaultComponentsRegistry.register(componentFactory) + // TODO: T164788699 find alternative of accessing ReactHostImpl for initialising reactHost + reactHost = + ReactHostImpl( + context, + defaultReactHostDelegate, + componentFactory, + true, + reactJsExceptionHandler, + true) + } + return reactHost as ReactHost + } +}