123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- package com.trust.ywx.multiple
- import android.content.Intent
- import android.content.pm.ActivityInfo
- import android.content.res.Configuration
- import android.os.Build
- import android.os.Bundle
- import android.util.Log
- import android.view.KeyEvent
- import com.facebook.react.ReactActivity
- import com.facebook.react.ReactDelegate
- import com.facebook.react.ReactInstanceEventListener
- import com.facebook.react.ReactInstanceManager
- import com.facebook.react.ReactRootView
- import com.facebook.react.bridge.JSBundleLoader
- import com.facebook.react.bridge.ReactContext
- import com.facebook.react.common.annotations.DeprecatedInNewArchitecture
- import com.facebook.react.defaults.DefaultReactActivityDelegate
- import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags.enableBridgelessArchitecture
- import com.facebook.react.runtime.ReactHostHelper
- import com.facebook.react.runtime.ReactHostImpl
- import com.trust.ywx.utils.FileHelper
- class MultipleReactActivityDelegate(
- activity: ReactActivity,
- mainComponentName: String,
- fabricEnabled: Boolean,
- ) : DefaultReactActivityDelegate(activity, mainComponentName, fabricEnabled) {
- private var mReactDelegate: ReactDelegate? = null
- override fun onCreate(savedInstanceState: Bundle?) {
- val helper = ReactHostHelper(reactHost as ReactHostImpl)
- val mainComponentName = this.mainComponentName
- val launchOptions = this.composeLaunchOptions()
- val activity = reactActivity
- if (Build.VERSION.SDK_INT >= 26 && this.isWideColorGamutEnabled) {
- activity.window.colorMode = ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT
- }
- if (enableBridgelessArchitecture()) {
- this.mReactDelegate =
- ReactDelegate(
- this.plainActivity,
- this.reactHost,
- mainComponentName,
- launchOptions,
- )
- reactHost?.start()?.waitForCompletion()
- val result =
- helper.loadBundle(
- JSBundleLoader.createFileLoader(
- FileHelper.getFilePath(
- "buz.android.bundle",
- this.reactActivity.applicationContext,
- "bundles"
- )
- ),
- )
- this.loadApp(mainComponentName)
- } else {
- this.mReactDelegate =
- object : ReactDelegate(
- this.plainActivity,
- this.reactNativeHost,
- mainComponentName,
- launchOptions,
- this.isFabricEnabled,
- ) {
- override fun createRootView(): ReactRootView {
- var rootView: ReactRootView? =
- this@MultipleReactActivityDelegate.createRootView()
- if (rootView == null) {
- rootView = super.createRootView()
- }
- return rootView!!
- }
- }
- reactNativeHost.reactInstanceManager.addReactInstanceEventListener(
- object : ReactInstanceEventListener {
- override fun onReactContextInitialized(context: ReactContext) {
- Log.i("TestApp", "Multiple onReactContextInitialized")
- val instance =
- reactNativeHost.reactInstanceManager.currentReactContext?.catalystInstance
- val fileName = FileHelper.getFilePath(
- "$mainComponentName.android.bundle",
- reactActivity.applicationContext,
- "bundles"
- )
- instance?.loadScriptFromFile(
- fileName,
- fileName,
- false
- )
- Log.i("TestApp", "loaded biz bundle")
- if (mainComponentName != null) {
- try {
- this@MultipleReactActivityDelegate.loadApp(mainComponentName)
- } catch (e: Exception) {
- Log.e("TestApp", "load app $mainComponentName")
- }
- }
- }
- },
- )
- reactNativeHost.reactInstanceManager.createReactContextInBackground()
- }
- }
- private fun loadAppOldWay() {
- }
- override fun getReactDelegate(): ReactDelegate = mReactDelegate!!
- @DeprecatedInNewArchitecture(message = "Use getReactHost()")
- override fun getReactInstanceManager(): ReactInstanceManager =
- mReactDelegate!!.reactInstanceManager
- override fun loadApp(appKey: String?) {
- mReactDelegate!!.loadApp(appKey)
- plainActivity.setContentView(mReactDelegate!!.reactRootView)
- }
- override fun onUserLeaveHint() {
- if (mReactDelegate != null) {
- mReactDelegate!!.onUserLeaveHint()
- }
- }
- override fun onPause() {
- mReactDelegate!!.onHostPause()
- }
- override fun onResume() {
- mReactDelegate!!.onHostResume()
- // if (mPermissionsCallback != null) {
- // mPermissionsCallback!!.invoke()
- // mPermissionsCallback = null
- // }
- }
- override fun onDestroy() {
- mReactDelegate!!.onHostDestroy()
- }
- override fun onActivityResult(
- requestCode: Int,
- resultCode: Int,
- data: Intent?,
- ) {
- mReactDelegate!!.onActivityResult(requestCode, resultCode, data, true)
- }
- override fun onKeyDown(
- keyCode: Int,
- event: KeyEvent?,
- ): Boolean = mReactDelegate!!.onKeyDown(keyCode, event)
- override fun onKeyUp(
- keyCode: Int,
- event: KeyEvent?,
- ): Boolean = mReactDelegate!!.shouldShowDevMenuOrReload(keyCode, event)
- override fun onKeyLongPress(
- keyCode: Int,
- event: KeyEvent?,
- ): Boolean = mReactDelegate!!.onKeyLongPress(keyCode)
- override fun onBackPressed(): Boolean = mReactDelegate!!.onBackPressed()
- override fun onNewIntent(intent: Intent?): Boolean = mReactDelegate!!.onNewIntent(intent)
- override fun onWindowFocusChanged(hasFocus: Boolean) {
- mReactDelegate!!.onWindowFocusChanged(hasFocus)
- }
- override fun onConfigurationChanged(newConfig: Configuration?) {
- mReactDelegate!!.onConfigurationChanged(newConfig)
- }
- /**
- * Get the current [ReactContext] from ReactHost or ReactInstanceManager
- *
- *
- * Do not store a reference to this, if the React instance is reloaded or destroyed, this
- * context will no longer be valid.
- */
- override fun getCurrentReactContext(): ReactContext = mReactDelegate!!.currentReactContext!!
- }
|