From 798b6f21199086536a221732402b916a9d71e279 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Sat, 30 Mar 2024 22:47:09 +0100 Subject: [PATCH] fix: Add workaround for DisposableEffect Signed-off-by: Myzel394 <50424412+Myzel394@users.noreply.github.com> --- .../organisms/RecorderEventsHandler.kt | 78 +++++++++++-------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/organisms/RecorderEventsHandler.kt b/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/organisms/RecorderEventsHandler.kt index cf65273..3631682 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/organisms/RecorderEventsHandler.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/organisms/RecorderEventsHandler.kt @@ -291,47 +291,57 @@ fun RecorderEventsHandler( } // Register video recorder events + // Absolutely no idea, but somehow on some devices the `DisposableEffect` + // is registered twice, and THEN disposed once (AFTER being called twice), + // which then causes the `onRecordingSave` to be in a weird state. + // This variable is a workaround to prevent this from happening. + var alreadyRegistered = false DisposableEffect(Unit) { - Log.d("Alibi", "===== Registering videoRecorder events $videoRecorder") - videoRecorder.onRecordingSave = { cleanupOldFiles -> - saveRecording(videoRecorder as RecorderModel, cleanupOldFiles) - } - videoRecorder.onRecordingStart = { - snackbarHostState.currentSnackbarData?.dismiss() - } - videoRecorder.onError = { - scope.launch { - saveAsLastRecording(videoRecorder as RecorderModel) - - runCatching { - videoRecorder.stopRecording(context) - } - runCatching { - videoRecorder.destroyService(context) - } - - showRecorderError = true + if (alreadyRegistered) { + onDispose { } + } else { + alreadyRegistered = true + Log.i("Alibi", "===== Registering videoRecorder events $videoRecorder") + videoRecorder.onRecordingSave = { cleanupOldFiles -> + saveRecording(videoRecorder as RecorderModel, cleanupOldFiles) } - } - videoRecorder.onBatchesFolderNotAccessible = { - scope.launch { - showBatchesInaccessibleError = true + videoRecorder.onRecordingStart = { + snackbarHostState.currentSnackbarData?.dismiss() + } + videoRecorder.onError = { + scope.launch { + saveAsLastRecording(videoRecorder as RecorderModel) - runCatching { - videoRecorder.stopRecording(context) - } - runCatching { - videoRecorder.destroyService(context) + runCatching { + videoRecorder.stopRecording(context) + } + runCatching { + videoRecorder.destroyService(context) + } + + showRecorderError = true } } - } + videoRecorder.onBatchesFolderNotAccessible = { + scope.launch { + showBatchesInaccessibleError = true - onDispose { - Log.d("Alibi", "===== Disposing videoRecorder events") - videoRecorder.onRecordingSave = { - throw NotImplementedError("onRecordingSave should not be called now") + runCatching { + videoRecorder.stopRecording(context) + } + runCatching { + videoRecorder.destroyService(context) + } + } + } + + onDispose { + Log.i("Alibi", "===== Disposing videoRecorder events") + videoRecorder.onRecordingSave = { + throw NotImplementedError("onRecordingSave should not be called now") + } + videoRecorder.onError = {} } - videoRecorder.onError = {} } }