diff --git a/changelog.d/6989.bugfix b/changelog.d/6989.bugfix new file mode 100644 index 0000000000..cf740ca741 --- /dev/null +++ b/changelog.d/6989.bugfix @@ -0,0 +1 @@ +Catch race condition crash in voice recording diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt index 2e150daee6..7d25471e51 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt @@ -79,18 +79,19 @@ class AudioMessageHelper @Inject constructor( } fun stopRecording(): MultiPickerAudioType? { - tryOrNull("Cannot stop media recording amplitude") { - stopRecordingAmplitudes() - } val voiceMessageFile = tryOrNull("Cannot stop media recorder!") { voiceRecorder.stopRecord() voiceRecorder.getVoiceMessageFile() } - try { + tryOrNull("Cannot stop media recording amplitude") { + stopRecordingAmplitudes() + } + + return try { voiceMessageFile?.let { val outputFileUri = FileProvider.getUriForFile(context, buildMeta.applicationId + ".fileProvider", it, "Voice message.${it.extension}") - return outputFileUri + outputFileUri .toMultiPickerAudioType(context) ?.apply { waveform = if (amplitudeList.size < 50) { @@ -99,10 +100,13 @@ class AudioMessageHelper @Inject constructor( amplitudeList.chunked(amplitudeList.size / 50) { items -> items.maxOrNull() ?: 0 } } } - } ?: return null + } } catch (e: FileNotFoundException) { Timber.e(e, "Cannot stop voice recording") - return null + null + } catch (e: RuntimeException) { + Timber.e(e, "Error while retrieving metadata") + null } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt index ca86010915..7d67ec8c60 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt @@ -883,7 +883,11 @@ class MessageComposerViewModel @AssistedInject constructor( } private fun handlePlayOrPauseRecordingPlayback() { - audioMessageHelper.startOrPauseRecordingPlayback() + try { + audioMessageHelper.startOrPauseRecordingPlayback() + } catch (failure: Throwable) { + _viewEvents.post(MessageComposerViewEvents.VoicePlaybackOrRecordingFailure(failure)) + } } fun endAllVoiceActions(deleteRecord: Boolean = true) {