diff --git a/packages/react-native-brownfield/android/src/main/java/com/callstack/reactnativebrownfield/ReactNativeBrownfield.kt b/packages/react-native-brownfield/android/src/main/java/com/callstack/reactnativebrownfield/ReactNativeBrownfield.kt index f321b668..48d1073d 100644 --- a/packages/react-native-brownfield/android/src/main/java/com/callstack/reactnativebrownfield/ReactNativeBrownfield.kt +++ b/packages/react-native-brownfield/android/src/main/java/com/callstack/reactnativebrownfield/ReactNativeBrownfield.kt @@ -202,6 +202,19 @@ class ReactNativeBrownfield private constructor(val reactHost: ReactHost) { moduleName: String, reactDelegate: ReactDelegateWrapper? = null, launchOptions: Bundle? = null, + ): FrameLayout = createView(activity, moduleName, reactDelegate, launchOptions, activity) + + /** + * Use the owner of the view when embedding React Native inside a fragment or + * another container whose lifetime is shorter than the activity. + * The four-argument overload retains its original JVM signature. + */ + fun createView( + activity: FragmentActivity?, + moduleName: String, + reactDelegate: ReactDelegateWrapper?, + launchOptions: Bundle?, + lifecycleOwner: LifecycleOwner?, ): FrameLayout { val reactHost = shared.reactHost val resolvedDelegate = @@ -215,12 +228,17 @@ class ReactNativeBrownfield private constructor(val reactHost: ReactHost) { } // Register back press callback - activity?.onBackPressedDispatcher?.addCallback(backPressedCallback) + if (lifecycleOwner != null) { + activity?.onBackPressedDispatcher?.addCallback(lifecycleOwner, backPressedCallback) + } // invoked on the last RN screen exit resolvedDelegate.setHardwareBackHandler { backPressedCallback.isEnabled = false - activity?.onBackPressedDispatcher?.onBackPressed() - backPressedCallback.isEnabled = true + try { + activity?.onBackPressedDispatcher?.onBackPressed() + } finally { + backPressedCallback.isEnabled = true + } } /** @@ -230,7 +248,7 @@ class ReactNativeBrownfield private constructor(val reactHost: ReactHost) { * In such a case, we set the lifeCycle observer. */ if (reactDelegate == null) { - activity?.lifecycle?.addObserver(getLifeCycleObserver(resolvedDelegate)) + lifecycleOwner?.lifecycle?.addObserver(getLifeCycleObserver(resolvedDelegate)) } resolvedDelegate.loadApp() diff --git a/packages/react-native-brownfield/android/src/main/java/com/callstack/reactnativebrownfield/ReactNativeFragment.kt b/packages/react-native-brownfield/android/src/main/java/com/callstack/reactnativebrownfield/ReactNativeFragment.kt index 01dec7d4..f6e2bd35 100644 --- a/packages/react-native-brownfield/android/src/main/java/com/callstack/reactnativebrownfield/ReactNativeFragment.kt +++ b/packages/react-native-brownfield/android/src/main/java/com/callstack/reactnativebrownfield/ReactNativeFragment.kt @@ -54,7 +54,9 @@ class ReactNativeFragment : ReactFragment(), PermissionAwareActivity { return ReactNativeBrownfield.shared.createView( activity, moduleName, - this.reactDelegate as ReactDelegateWrapper + this.reactDelegate as ReactDelegateWrapper, + launchOptions = null, + lifecycleOwner = viewLifecycleOwner ) }