diff --git a/android/app/src/main/java/com/sample/react/TestAppReactNativeHost.kt b/android/app/src/main/java/com/sample/react/TestAppReactNativeHost.kt index 10d2523f1..b944bbbe4 100644 --- a/android/app/src/main/java/com/sample/react/TestAppReactNativeHost.kt +++ b/android/app/src/main/java/com/sample/react/TestAppReactNativeHost.kt @@ -2,6 +2,7 @@ package com.sample.react import android.app.Activity import android.app.Application +import android.content.Context import com.facebook.react.PackageList import com.facebook.react.ReactInstanceManager import com.facebook.react.ReactNativeHost @@ -9,7 +10,13 @@ import com.facebook.react.ReactPackage import com.facebook.react.bridge.ReactMarker import com.facebook.react.bridge.ReactMarkerConstants import com.facebook.react.common.LifecycleState +import com.facebook.react.devsupport.DevInternalSettings +import com.facebook.react.devsupport.DevServerHelper +import com.facebook.react.devsupport.InspectorPackagerConnection.BundleStatus +import com.facebook.react.devsupport.InspectorPackagerConnection.BundleStatusProvider import com.facebook.soloader.SoLoader +import com.sample.BuildConfig +import java.util.concurrent.CountDownLatch import javax.inject.Inject import javax.inject.Singleton @@ -39,12 +46,16 @@ class TestAppReactNativeHost @Inject constructor( application: Application, private val reactBundleNameProvider: ReactBundleNameProvider ) : ReactNativeHost(application) { - var source: BundleSource = reactBundleNameProvider.bundleName - ?.let { BundleSource.Disk } ?: BundleSource.Server + var source: BundleSource = + if (reactBundleNameProvider.bundleName == null || isPackagerRunning(application)) { + BundleSource.Server + } else { + BundleSource.Disk + } fun reload(activity: Activity, newSource: BundleSource) { - assert(hasInstance()) { - "init() must be called the first time ReactInstanceManager is created" + if (BuildConfig.DEBUG && !hasInstance()) { + error("init() must be called the first time ReactInstanceManager is created") } val action = source.moveTo(newSource) @@ -66,7 +77,9 @@ class TestAppReactNativeHost @Inject constructor( } fun init() { - assert(!hasInstance()) { "init() can only be called once on startup" } + if (BuildConfig.DEBUG && hasInstance()) { + error("init() can only be called once on startup") + } SoLoader.init(application, false) reactInstanceManager.createReactContextInBackground() @@ -98,4 +111,19 @@ class TestAppReactNativeHost @Inject constructor( override fun getUseDeveloperSupport() = source == BundleSource.Server override fun getPackages(): List = PackageList(application).packages + + private fun isPackagerRunning(context: Context): Boolean { + val latch = CountDownLatch(1) + var packagerIsRunning = false + DevServerHelper( + DevInternalSettings.withoutNativeDeltaClient(context) {}, + context.packageName, + BundleStatusProvider { BundleStatus() } + ).isPackagerRunning { + packagerIsRunning = it + latch.countDown() + } + latch.await() + return packagerIsRunning + } }