From dcbbae5fc72e7144942fd4f88252ca9f94a2559d Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Sun, 2 Jan 2022 10:02:17 -0500 Subject: [PATCH] fix: Re-install Frame Processor JSI Bindings after Reload (#691) --- .../com/mrousavy/camera/CameraViewManager.kt | 35 ++----------------- .../com/mrousavy/camera/CameraViewModule.kt | 22 ++++++++++++ 2 files changed, 24 insertions(+), 33 deletions(-) diff --git a/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt b/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt index ae2c3d9..3f7f76f 100644 --- a/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt +++ b/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt @@ -6,44 +6,13 @@ import com.facebook.react.common.MapBuilder import com.facebook.react.uimanager.SimpleViewManager import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.annotations.ReactProp -import com.mrousavy.camera.frameprocessor.FrameProcessorRuntimeManager -import java.util.concurrent.Executors @Suppress("unused") class CameraViewManager(reactContext: ReactApplicationContext) : SimpleViewManager() { - private val frameProcessorThread = Executors.newSingleThreadExecutor() - private var frameProcessorManager: FrameProcessorRuntimeManager? = null - - init { - if (frameProcessorManager == null) { - frameProcessorThread.execute { - frameProcessorManager = FrameProcessorRuntimeManager(reactContext, frameProcessorThread) - - reactContext.runOnJSQueueThread { - frameProcessorManager!!.installJSIBindings() - } - } - } - } - - private fun destroy() { - frameProcessorManager = null - frameProcessorThread.shutdown() - } - - - override fun onCatalystInstanceDestroy() { - super.onCatalystInstanceDestroy() - destroy() - } - - override fun invalidate() { - super.invalidate() - destroy() - } public override fun createViewInstance(context: ThemedReactContext): CameraView { - return CameraView(context, frameProcessorThread) + val cameraViewModule = context.getNativeModule(CameraViewModule::class.java)!! + return CameraView(context, cameraViewModule.frameProcessorThread) } override fun onAfterUpdateTransaction(view: CameraView) { diff --git a/android/src/main/java/com/mrousavy/camera/CameraViewModule.kt b/android/src/main/java/com/mrousavy/camera/CameraViewModule.kt index 26da75c..d900f30 100644 --- a/android/src/main/java/com/mrousavy/camera/CameraViewModule.kt +++ b/android/src/main/java/com/mrousavy/camera/CameraViewModule.kt @@ -13,13 +13,18 @@ import androidx.camera.extensions.ExtensionsManager import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import com.facebook.react.bridge.* +import com.facebook.react.module.annotations.ReactModule import com.facebook.react.modules.core.PermissionAwareActivity import com.facebook.react.modules.core.PermissionListener +import com.mrousavy.camera.frameprocessor.FrameProcessorRuntimeManager import com.mrousavy.camera.parsers.* import com.mrousavy.camera.utils.* import kotlinx.coroutines.* import kotlinx.coroutines.guava.await +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +@ReactModule(name = CameraViewModule.TAG) @Suppress("unused") class CameraViewModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { companion object { @@ -35,12 +40,29 @@ class CameraViewModule(reactContext: ReactApplicationContext) : ReactContextBase } } + var frameProcessorThread: ExecutorService = Executors.newSingleThreadExecutor() private val coroutineScope = CoroutineScope(Dispatchers.Default) // TODO: or Dispatchers.Main? + private var frameProcessorManager: FrameProcessorRuntimeManager? = null private fun cleanup() { if (coroutineScope.isActive) { coroutineScope.cancel("CameraViewModule has been destroyed.") } + frameProcessorManager = null + } + + override fun initialize() { + super.initialize() + + if (frameProcessorManager == null) { + frameProcessorThread.execute { + frameProcessorManager = FrameProcessorRuntimeManager(reactApplicationContext, frameProcessorThread) + + reactApplicationContext.runOnJSQueueThread { + frameProcessorManager!!.installJSIBindings() + } + } + } } override fun onCatalystInstanceDestroy() {