fix: Add workaround for doubly registered events

Signed-off-by: Myzel394 <50424412+Myzel394@users.noreply.github.com>
This commit is contained in:
Myzel394 2024-03-30 23:00:27 +01:00
parent 798b6f2119
commit d1fe46804e
No known key found for this signature in database
GPG Key ID: DEC4AAB876F73185

View File

@ -248,59 +248,65 @@ fun RecorderEventsHandler(
}
// Register audio recorder events
DisposableEffect(Unit) {
audioRecorder.onRecordingSave = { cleanupOldFiles ->
saveRecording(audioRecorder as RecorderModel, cleanupOldFiles)
}
audioRecorder.onRecordingStart = {
snackbarHostState.currentSnackbarData?.dismiss()
}
audioRecorder.onError = {
scope.launch {
saveAsLastRecording(audioRecorder as RecorderModel)
runCatching {
audioRecorder.stopRecording(context)
}
runCatching {
audioRecorder.destroyService(context)
}
showRecorderError = true
}
}
audioRecorder.onBatchesFolderNotAccessible = {
scope.launch {
showBatchesInaccessibleError = true
runCatching {
audioRecorder.stopRecording(context)
}
runCatching {
audioRecorder.destroyService(context)
}
}
}
onDispose {
audioRecorder.onRecordingSave = {
throw NotImplementedError("onRecordingSave should not be called now")
}
audioRecorder.onError = {}
}
}
// 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
var audioAlreadyRegistered = false
DisposableEffect(Unit) {
if (alreadyRegistered) {
if (audioAlreadyRegistered) {
onDispose { }
} else {
alreadyRegistered = true
audioAlreadyRegistered = true
audioRecorder.onRecordingSave = { cleanupOldFiles ->
saveRecording(audioRecorder as RecorderModel, cleanupOldFiles)
}
audioRecorder.onRecordingStart = {
snackbarHostState.currentSnackbarData?.dismiss()
}
audioRecorder.onError = {
scope.launch {
saveAsLastRecording(audioRecorder as RecorderModel)
runCatching {
audioRecorder.stopRecording(context)
}
runCatching {
audioRecorder.destroyService(context)
}
showRecorderError = true
}
}
audioRecorder.onBatchesFolderNotAccessible = {
scope.launch {
showBatchesInaccessibleError = true
runCatching {
audioRecorder.stopRecording(context)
}
runCatching {
audioRecorder.destroyService(context)
}
}
}
onDispose {
audioRecorder.onRecordingSave = {
throw NotImplementedError("onRecordingSave should not be called now")
}
audioRecorder.onError = {}
}
}
}
// Register video recorder events
var videoAlreadyRegistered = false
DisposableEffect(Unit) {
if (videoAlreadyRegistered) {
onDispose { }
} else {
videoAlreadyRegistered = true
Log.i("Alibi", "===== Registering videoRecorder events $videoRecorder")
videoRecorder.onRecordingSave = { cleanupOldFiles ->
saveRecording(videoRecorder as RecorderModel, cleanupOldFiles)