@@ -3,30 +3,60 @@ package com.callstack.reactnativebrownfield;
33import android.annotation.TargetApi
44import android.os.Build
55import android.os.Bundle
6+ import android.util.Log
67import android.view.KeyEvent
8+ import android.view.LayoutInflater
9+ import android.view.View
10+ import android.view.ViewGroup
711import com.facebook.infer.annotation.Assertions
812import com.facebook.react.ReactFragment
913import com.facebook.react.ReactHost
1014import com.facebook.react.ReactNativeHost
1115import com.facebook.react.bridge.Callback
1216import com.facebook.react.bridge.WritableMap
13- import com.facebook.react.common.LifecycleState
1417import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
1518import com.facebook.react.devsupport.DoubleTapReloadRecognizer
16- import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler
1719import com.facebook.react.modules.core.PermissionAwareActivity
1820import com.facebook.react.modules.core.PermissionListener
1921
2022class ReactNativeFragment : ReactFragment (), PermissionAwareActivity {
2123 private lateinit var doubleTapReloadRecognizer: DoubleTapReloadRecognizer
2224 private lateinit var permissionsCallback: Callback
2325 private var permissionListener: PermissionListener ? = null
26+ private lateinit var moduleName: String
2427
2528 override fun onCreate (savedInstanceState : Bundle ? ) {
26- super .onCreate(savedInstanceState)
29+ /* *
30+ * ReactFragment.onCreate will throw an exception if we do not provide arg_component_name as arguments.
31+ * We silently catch this exception. The reason is we want to invoke the super<Fragment>.onCreate in
32+ * ReactFragment. Then initialise the mReactDelegate with ReactDelegateWrapper instead of ReactDelegate.
33+ *
34+ * So we purposely force ReactFragment.onCreate to throw an exception, so that we can provide our own
35+ * implementation for mReactDelegate: ReactDelegateWrapper
36+ */
37+ try {
38+ super .onCreate(savedInstanceState)
39+ } catch (e: IllegalStateException ){
40+ Log .w(" ReactNativeFragment" , " ReactFragment threw due to missing arg_component_name: ${e.message} - This is an expected behaviour." )
41+ }
42+
43+ moduleName = arguments?.getString(ARG_MODULE_NAME )!!
44+ this .mReactDelegate = this .reactHost?.let {
45+ ReactDelegateWrapper (activity,
46+ it, moduleName, arguments?.getBundle(" arg_launch_options" ))
47+ }
48+
2749 doubleTapReloadRecognizer = DoubleTapReloadRecognizer ()
2850 }
2951
52+ override fun onCreateView (
53+ inflater : LayoutInflater ,
54+ container : ViewGroup ? ,
55+ savedInstanceState : Bundle ?
56+ ): View {
57+ return ReactNativeBrownfield .shared.createView(this .requireContext(), activity, moduleName, this .mReactDelegate as ReactDelegateWrapper )
58+ }
59+
3060 override fun getReactHost (): ReactHost ? {
3161 return activity?.let {
3262 getDefaultReactHost(
@@ -40,36 +70,6 @@ class ReactNativeFragment : ReactFragment(), PermissionAwareActivity {
4070 return ReactNativeBrownfield .shared.reactNativeHost
4171 }
4272
43- override fun onResume () {
44- super .onResume()
45- if (ReactNativeBrownfield .shared.reactNativeHost.hasInstance()) {
46- ReactNativeBrownfield .shared.reactNativeHost.reactInstanceManager?.onHostResume(
47- activity,
48- activity as DefaultHardwareBackBtnHandler
49- )
50- }
51- }
52-
53- override fun onPause () {
54- super .onPause()
55- if (ReactNativeBrownfield .shared.reactNativeHost.hasInstance()) {
56- ReactNativeBrownfield .shared.reactNativeHost.reactInstanceManager?.onHostPause(
57- activity
58- )
59- }
60- }
61-
62- override fun onDestroy () {
63- super .onDestroy()
64- if (ReactNativeBrownfield .shared.reactNativeHost.hasInstance()) {
65- val reactInstanceMgr = ReactNativeBrownfield .shared.reactNativeHost.reactInstanceManager
66-
67- if (reactInstanceMgr.lifecycleState != LifecycleState .RESUMED ) {
68- reactInstanceMgr.onHostDestroy(activity)
69- }
70- }
71- }
72-
7373 override fun onRequestPermissionsResult (
7474 requestCode : Int ,
7575 permissions : Array <String >,
@@ -118,22 +118,16 @@ class ReactNativeFragment : ReactFragment(), PermissionAwareActivity {
118118 .didDoubleTapR(keyCode, it)
119119 }
120120 if (didDoubleTapR == true ) {
121- ReactNativeBrownfield .shared.reactNativeHost.reactInstanceManager.devSupportManager.handleReloadJS ()
121+ reactDelegate.reload ()
122122 handled = true
123123 }
124124 }
125125 return handled
126126 }
127127
128- fun onBackPressed (backBtnHandler : DefaultHardwareBackBtnHandler ) {
129- if (ReactNativeBrownfieldModule .shouldPopToNative) {
130- backBtnHandler.invokeDefaultOnBackPressed()
131- } else if (ReactNativeBrownfield .shared.reactNativeHost.hasInstance()) {
132- ReactNativeBrownfield .shared.reactNativeHost.reactInstanceManager.onBackPressed()
133- }
134- }
135-
136128 companion object {
129+ private const val ARG_MODULE_NAME = " arg_module_name"
130+
137131 @JvmStatic
138132 @JvmOverloads
139133 fun createReactNativeFragment (
@@ -142,7 +136,7 @@ class ReactNativeFragment : ReactFragment(), PermissionAwareActivity {
142136 ): ReactNativeFragment {
143137 val fragment = ReactNativeFragment ()
144138 val args = Bundle ()
145- args.putString(ARG_COMPONENT_NAME , moduleName)
139+ args.putString(ARG_MODULE_NAME , moduleName)
146140 if (initialProps != null ) {
147141 args.putBundle(ARG_LAUNCH_OPTIONS , initialProps)
148142 }
0 commit comments