Skip to content

Commit

Permalink
fix: Close CameraSession if the View is removed (mrousavy#2174)
Browse files Browse the repository at this point in the history
* fix: Close `CameraSession` if the View is removed

* fix: Use ViewManager's `onDropViewInstance` instead

* fix: Only stop repeating if we have a session

* fix: Reset `configuration` on `close()`
  • Loading branch information
mrousavy authored Nov 18, 2023
1 parent a2f99de commit fd0be68
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@ class CameraView(context: Context) :
super.onDetachedFromWindow()
}

fun destroy() {
cameraSession.close()
}

fun update() {
Log.i(TAG, "Updating CameraSession...")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ class CameraViewManager : ViewGroupManager<CameraView>() {

override fun getName(): String = TAG

override fun onDropViewInstance(view: CameraView) {
view.destroy()
super.onDropViewInstance(view)
}

@ReactProp(name = "cameraId")
fun setCameraId(view: CameraView, cameraId: String) {
view.cameraId = cameraId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ class CameraSession(private val context: Context, private val cameraManager: Cam
codeScannerOutput?.close()
codeScannerOutput = null

configuration = null
isRunning = false
}

Expand Down Expand Up @@ -363,16 +364,16 @@ class CameraSession(private val context: Context, private val cameraManager: Cam
}

private fun configureCaptureRequest(config: CameraConfiguration) {
val device = cameraDevice ?: throw NoCameraDeviceError()
val captureSession = captureSession ?: throw CameraNotReadyError()

if (!config.isActive) {
// TODO: Do we want to do stopRepeating() or entirely destroy the session?
// If the Camera is not active, we don't do anything.
captureSession.stopRepeating()
captureSession?.stopRepeating()
return
}

val device = cameraDevice ?: throw NoCameraDeviceError()
val captureSession = captureSession ?: throw CameraNotReadyError()

val previewOutput = previewOutput
if (previewOutput == null) {
Log.w(TAG, "Preview Output is null, aborting...")
Expand Down

0 comments on commit fd0be68

Please sign in to comment.