diff --git a/changelog.d/3833.bugfix b/changelog.d/3833.bugfix new file mode 100644 index 0000000000..7d25fb2aad --- /dev/null +++ b/changelog.d/3833.bugfix @@ -0,0 +1 @@ +Fixing queued voice message failing to send or retry \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt index b657d950bd..86e0630fcf 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt @@ -279,6 +279,11 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter Timber.e(failure, "## Failed to update file cache") } + // Delete the temporary voice message file + if (params.attachment.type == ContentAttachmentData.Type.AUDIO && params.attachment.mimeType == MimeTypes.Ogg) { + context.contentResolver.delete(params.attachment.queryUri, null, null) + } + val uploadThumbnailResult = dealWithThumbnail(params) handleSuccess(params, @@ -299,11 +304,6 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter filesToDelete.forEach { tryOrNull { it.delete() } } - - // Delete the temporary voice message file - if (params.attachment.type == ContentAttachmentData.Type.AUDIO && params.attachment.mimeType == MimeTypes.Ogg) { - context.contentResolver.delete(params.attachment.queryUri, null, null) - } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewState.kt index def1c8d2fb..75bd94586c 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewState.kt @@ -58,10 +58,7 @@ data class MessageComposerViewState( VoiceMessageRecorderView.RecordingUiState.Started -> true } - val isVoiceMessageIdle = when (voiceRecordingUiState) { - VoiceMessageRecorderView.RecordingUiState.None, VoiceMessageRecorderView.RecordingUiState.Cancelled -> false - else -> true - } + val isVoiceMessageIdle = !isVoiceRecording val isComposerVisible = canSendMessage && !isVoiceRecording val isVoiceMessageRecorderVisible = canSendMessage && !isSendButtonVisible diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt index adcd6a3008..5d351e843f 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt @@ -76,9 +76,8 @@ class VoiceMessageHelper @Inject constructor( } try { voiceMessageFile?.let { - val outputFileUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", it) - return outputFileUri - ?.toMultiPickerAudioType(context) + val outputFileUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", it, "Voice message.${it.extension}") + return outputFileUri.toMultiPickerAudioType(context) ?.apply { waveform = if (amplitudeList.size < 50) { amplitudeList diff --git a/vector/src/main/java/im/vector/app/features/voice/AbstractVoiceRecorder.kt b/vector/src/main/java/im/vector/app/features/voice/AbstractVoiceRecorder.kt index 1a91c00e11..5d8bce1ea3 100644 --- a/vector/src/main/java/im/vector/app/features/voice/AbstractVoiceRecorder.kt +++ b/vector/src/main/java/im/vector/app/features/voice/AbstractVoiceRecorder.kt @@ -18,9 +18,12 @@ package im.vector.app.features.voice import android.content.Context import android.media.MediaRecorder +import android.net.Uri import android.os.Build +import org.matrix.android.sdk.api.session.content.ContentAttachmentData import java.io.File import java.io.FileOutputStream +import java.util.UUID abstract class AbstractVoiceRecorder( private val context: Context, @@ -59,7 +62,7 @@ abstract class AbstractVoiceRecorder( override fun startRecord() { init() - outputFile = File(outputDirectory, "Voice message.$filenameExt") + outputFile = File(outputDirectory, "${UUID.randomUUID()}$filenameExt") val mr = mediaRecorder ?: return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -100,3 +103,12 @@ abstract class AbstractVoiceRecorder( return convertFile(outputFile) } } + +@Suppress("UNUSED") // preemptively added for https://github.com/vector-im/element-android/pull/4527 +private fun ContentAttachmentData.findVoiceFile(baseDirectory: File): File { + return File(baseDirectory, queryUri.takePathAfter(baseDirectory.name)) +} + +private fun Uri.takePathAfter(after: String): String { + return pathSegments.takeLastWhile { it != after }.joinToString(separator = "/") { it } +}