diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/RecordAudio.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/RecordAudio.kt index 6d5c7d896..c5083fb12 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/RecordAudio.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/RecordAudio.kt @@ -66,15 +66,20 @@ fun RecordAudioBox( } } - // Start recording once permission is granted AND user wants to record - LaunchedEffect(recordPermissionState.status.isGranted, wantsToRecord) { - if (recordPermissionState.status.isGranted && wantsToRecord && mediaRecorder.value == null) { + fun startRecording() { + if (mediaRecorder.value == null) { elapsedSeconds = 0 mediaRecorder.value = VoiceMessageRecorder() mediaRecorder.value?.start(context, scope) } } + LaunchedEffect(recordPermissionState.status.isGranted, wantsToRecord) { + if (recordPermissionState.status.isGranted && wantsToRecord) { + startRecording() + } + } + // Track elapsed time while recording LaunchedEffect(mediaRecorder.value) { // Capture the current recorder state to avoid repeated reads of volatile state @@ -97,10 +102,9 @@ fun RecordAudioBox( wantsToRecord = true if (!recordPermissionState.status.isGranted) { recordPermissionState.launchPermissionRequest() - } else if (mediaRecorder.value == null) { - elapsedSeconds = 0 - mediaRecorder.value = VoiceMessageRecorder() - mediaRecorder.value?.start(context, scope) + } else { + // Start immediately for responsive UX when permission already granted + startRecording() } }, onRelease = {