MultipleReactActivityDelegate.kt 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package com.trust.ywx.multiple
  2. import android.content.Intent
  3. import android.content.pm.ActivityInfo
  4. import android.content.res.Configuration
  5. import android.os.Build
  6. import android.os.Bundle
  7. import android.util.Log
  8. import android.view.KeyEvent
  9. import com.facebook.react.ReactActivity
  10. import com.facebook.react.ReactDelegate
  11. import com.facebook.react.ReactInstanceEventListener
  12. import com.facebook.react.ReactInstanceManager
  13. import com.facebook.react.ReactRootView
  14. import com.facebook.react.bridge.JSBundleLoader
  15. import com.facebook.react.bridge.ReactContext
  16. import com.facebook.react.common.annotations.DeprecatedInNewArchitecture
  17. import com.facebook.react.defaults.DefaultReactActivityDelegate
  18. import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags.enableBridgelessArchitecture
  19. import com.facebook.react.runtime.ReactHostHelper
  20. import com.facebook.react.runtime.ReactHostImpl
  21. import com.trust.ywx.utils.FileHelper
  22. class MultipleReactActivityDelegate(
  23. activity: ReactActivity,
  24. mainComponentName: String,
  25. fabricEnabled: Boolean,
  26. ) : DefaultReactActivityDelegate(activity, mainComponentName, fabricEnabled) {
  27. private var mReactDelegate: ReactDelegate? = null
  28. override fun onCreate(savedInstanceState: Bundle?) {
  29. val helper = ReactHostHelper(reactHost as ReactHostImpl)
  30. val mainComponentName = this.mainComponentName
  31. val launchOptions = this.composeLaunchOptions()
  32. val activity = reactActivity
  33. if (Build.VERSION.SDK_INT >= 26 && this.isWideColorGamutEnabled) {
  34. activity.window.colorMode = ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT
  35. }
  36. if (enableBridgelessArchitecture()) {
  37. this.mReactDelegate =
  38. ReactDelegate(
  39. this.plainActivity,
  40. this.reactHost,
  41. mainComponentName,
  42. launchOptions,
  43. )
  44. reactHost?.start()?.waitForCompletion()
  45. val result =
  46. helper.loadBundle(
  47. JSBundleLoader.createFileLoader(
  48. FileHelper.getFilePath(
  49. "buz.android.bundle",
  50. this.reactActivity.applicationContext,
  51. "bundles"
  52. )
  53. ),
  54. )
  55. this.loadApp(mainComponentName)
  56. } else {
  57. this.mReactDelegate =
  58. object : ReactDelegate(
  59. this.plainActivity,
  60. this.reactNativeHost,
  61. mainComponentName,
  62. launchOptions,
  63. this.isFabricEnabled,
  64. ) {
  65. override fun createRootView(): ReactRootView {
  66. var rootView: ReactRootView? =
  67. this@MultipleReactActivityDelegate.createRootView()
  68. if (rootView == null) {
  69. rootView = super.createRootView()
  70. }
  71. return rootView!!
  72. }
  73. }
  74. reactNativeHost.reactInstanceManager.addReactInstanceEventListener(
  75. object : ReactInstanceEventListener {
  76. override fun onReactContextInitialized(context: ReactContext) {
  77. Log.i("TestApp", "Multiple onReactContextInitialized")
  78. val instance =
  79. reactNativeHost.reactInstanceManager.currentReactContext?.catalystInstance
  80. val fileName = FileHelper.getFilePath(
  81. "$mainComponentName.android.bundle",
  82. reactActivity.applicationContext,
  83. "bundles"
  84. )
  85. instance?.loadScriptFromFile(
  86. fileName,
  87. fileName,
  88. false
  89. )
  90. Log.i("TestApp", "loaded biz bundle")
  91. if (mainComponentName != null) {
  92. try {
  93. this@MultipleReactActivityDelegate.loadApp(mainComponentName)
  94. } catch (e: Exception) {
  95. Log.e("TestApp", "load app $mainComponentName")
  96. }
  97. }
  98. }
  99. },
  100. )
  101. reactNativeHost.reactInstanceManager.createReactContextInBackground()
  102. }
  103. }
  104. private fun loadAppOldWay() {
  105. }
  106. override fun getReactDelegate(): ReactDelegate = mReactDelegate!!
  107. @DeprecatedInNewArchitecture(message = "Use getReactHost()")
  108. override fun getReactInstanceManager(): ReactInstanceManager =
  109. mReactDelegate!!.reactInstanceManager
  110. override fun loadApp(appKey: String?) {
  111. mReactDelegate!!.loadApp(appKey)
  112. plainActivity.setContentView(mReactDelegate!!.reactRootView)
  113. }
  114. override fun onUserLeaveHint() {
  115. if (mReactDelegate != null) {
  116. mReactDelegate!!.onUserLeaveHint()
  117. }
  118. }
  119. override fun onPause() {
  120. mReactDelegate!!.onHostPause()
  121. }
  122. override fun onResume() {
  123. mReactDelegate!!.onHostResume()
  124. // if (mPermissionsCallback != null) {
  125. // mPermissionsCallback!!.invoke()
  126. // mPermissionsCallback = null
  127. // }
  128. }
  129. override fun onDestroy() {
  130. mReactDelegate!!.onHostDestroy()
  131. }
  132. override fun onActivityResult(
  133. requestCode: Int,
  134. resultCode: Int,
  135. data: Intent?,
  136. ) {
  137. mReactDelegate!!.onActivityResult(requestCode, resultCode, data, true)
  138. }
  139. override fun onKeyDown(
  140. keyCode: Int,
  141. event: KeyEvent?,
  142. ): Boolean = mReactDelegate!!.onKeyDown(keyCode, event)
  143. override fun onKeyUp(
  144. keyCode: Int,
  145. event: KeyEvent?,
  146. ): Boolean = mReactDelegate!!.shouldShowDevMenuOrReload(keyCode, event)
  147. override fun onKeyLongPress(
  148. keyCode: Int,
  149. event: KeyEvent?,
  150. ): Boolean = mReactDelegate!!.onKeyLongPress(keyCode)
  151. override fun onBackPressed(): Boolean = mReactDelegate!!.onBackPressed()
  152. override fun onNewIntent(intent: Intent?): Boolean = mReactDelegate!!.onNewIntent(intent)
  153. override fun onWindowFocusChanged(hasFocus: Boolean) {
  154. mReactDelegate!!.onWindowFocusChanged(hasFocus)
  155. }
  156. override fun onConfigurationChanged(newConfig: Configuration?) {
  157. mReactDelegate!!.onConfigurationChanged(newConfig)
  158. }
  159. /**
  160. * Get the current [ReactContext] from ReactHost or ReactInstanceManager
  161. *
  162. *
  163. * Do not store a reference to this, if the React instance is reloaded or destroyed, this
  164. * context will no longer be valid.
  165. */
  166. override fun getCurrentReactContext(): ReactContext = mReactDelegate!!.currentReactContext!!
  167. }