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
This commit is contained in:
Lulu Wu 2023-09-25 14:54:04 -07:00 коммит произвёл Facebook GitHub Bot
Родитель 3f1ee478bb
Коммит a07c31bb4b
1 изменённых файлов: 59 добавлений и 0 удалений

Просмотреть файл

@ -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<ReactPackage>,
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
}
}