Skip to content

Commit

Permalink
refactor: restart
Browse files Browse the repository at this point in the history
  • Loading branch information
gronxb committed Nov 22, 2024
1 parent df625fe commit c422f7d
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -116,17 +116,9 @@ class HotUpdater(
}
}

private fun getReactNativeHost(application: Application?): ReactNativeHost {
private fun getReactApplication(application: Application?): ReactApplication {
if (application is ReactApplication) {
return application.reactNativeHost
} else {
throw IllegalArgumentException("Application does not implement ReactApplication")
}
}

private fun getReactHost(application: Application?): ReactHost? {
if (application is ReactApplication) {
return application.reactHost
return application
} else {
throw IllegalArgumentException("Application does not implement ReactApplication")
}
Expand Down Expand Up @@ -193,33 +185,18 @@ class HotUpdater(
}

fun reload(context: Context) {

val activity: Activity? = getCurrentActivity(context)
val reactNativeHost: ReactNativeHost = this.getReactNativeHost(activity?.application)
val reactHost: ReactHost? = this.getReactHost(activity?.application)
val reactApplication: ReactApplication = this.getReactApplication(activity?.application)

Log.d("HotUpdater", "HotUpdater requested a reload ${getBundleURL(context)}")
val reactNativeHost: ReactNativeHost = reactApplication.reactNativeHost
val reactHost: ReactHost? = reactApplication.reactHost

Log.d("HotUpdater", "HotUpdater requested a reload ${getBundleURL(context)}")
setJSBundle(reactNativeHost.reactInstanceManager, getBundleURL(context))

clearLifecycleEventListener(reactNativeHost)
try {
Handler(Looper.getMainLooper()).post {
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
check(reactHost != null)
if (reactHost.lifecycleState != LifecycleState.RESUMED && activity != null) {
reactHost.onHostResume(activity)
}
reactHost.reload("HotUpdater requested a reload")
} else {
try {
reactNativeHost.reactInstanceManager.recreateReactContextInBackground()
} catch (t: Throwable) {
loadBundleLegacy(activity)
}
}
}
} catch (t: Throwable) {
loadBundleLegacy(activity)
Handler(Looper.getMainLooper()).post {
reactApplication.restart(activity, "HotUpdater requested a reload")
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.hotupdater

import android.app.Activity
import com.facebook.react.ReactApplication
import com.facebook.react.common.LifecycleState

/**
* An extension for [ReactApplication] to restart the app
*
* @param activity For bridgeless mode if the ReactHost is destroyed, we need an Activity to resume it.
* @param reason The restart reason. Only used on bridgeless mode.
*/
internal fun ReactApplication.restart(activity: Activity?, reason: String) {
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
val reactHost = this.reactHost
check(reactHost != null)
if (reactHost.lifecycleState != LifecycleState.RESUMED && activity != null) {
reactHost.onHostResume(activity)
}
reactHost.reload(reason)
return
}

reactNativeHost.reactInstanceManager.recreateReactContextInBackground()
}

0 comments on commit c422f7d

Please sign in to comment.