Display duration of recorded voice message (#1733)

---------

Co-authored-by: ElementBot <benoitm+elementbot@element.io>
This commit is contained in:
jonnyandrew 2023-11-03 12:59:36 +00:00 committed by GitHub
parent 0e89080a50
commit 413ec4b5db
12 changed files with 119 additions and 40 deletions

View file

@ -45,6 +45,7 @@ import timber.log.Timber
import java.io.File
import java.util.UUID
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.minutes
import kotlin.time.TimeSource
@ -93,7 +94,7 @@ class VoiceRecorderImpl @Inject constructor(
val elapsedTime = startedAt.elapsedNow()
if (elapsedTime >= 30.minutes) {
if (elapsedTime > 30.minutes) {
Timber.w("Voice message time limit reached")
stopRecord(false)
return@record
@ -145,11 +146,15 @@ class VoiceRecorderImpl @Inject constructor(
_state.emit(
when (val file = outputFile) {
null -> VoiceRecorderState.Idle
else -> VoiceRecorderState.Finished(
file = file,
mimeType = fileConfig.mimeType,
waveform = levels.resample(100),
)
else -> {
val duration = (state.value as? VoiceRecorderState.Recording)?.elapsedTime
VoiceRecorderState.Finished(
file = file,
mimeType = fileConfig.mimeType,
waveform = levels.resample(100),
duration = duration ?: 0.milliseconds
)
}
}
)
}

View file

@ -37,6 +37,7 @@ import kotlinx.coroutines.test.runTest
import org.junit.BeforeClass
import org.junit.Test
import java.io.File
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds
import kotlin.time.TestTimeSource
@ -76,34 +77,38 @@ class VoiceRecorderImplTest {
voiceRecorder.startRecord()
assertThat(awaitItem()).isEqualTo(VoiceRecorderState.Recording(0.minutes, listOf(1.0f)))
timeSource += 29.minutes
assertThat(awaitItem()).isEqualTo(VoiceRecorderState.Recording(29.minutes, listOf()))
timeSource += 1.minutes
timeSource += 30.minutes
assertThat(awaitItem()).isEqualTo(VoiceRecorderState.Recording(30.minutes, listOf()))
timeSource += 1.milliseconds
assertThat(awaitItem()).isEqualTo(
VoiceRecorderState.Finished(
file = File(FILE_PATH),
mimeType = "audio/ogg",
waveform = List(100) { 1f },
duration = 30.minutes,
)
)
}
}
@Test
fun `when stopped, it provides a file`() = runTest {
fun `when stopped, it provides a file and duration`() = runTest {
val voiceRecorder = createVoiceRecorder()
voiceRecorder.state.test {
assertThat(awaitItem()).isEqualTo(VoiceRecorderState.Idle)
voiceRecorder.startRecord()
skipItems(3)
skipItems(1)
timeSource += 5.seconds
skipItems(2)
voiceRecorder.stopRecord()
assertThat(awaitItem()).isEqualTo(
VoiceRecorderState.Finished(
file = File(FILE_PATH),
mimeType = "audio/ogg",
waveform = List(100) { 1f },
duration = 5.seconds,
)
)
assertThat(fakeFileSystem.files[File(FILE_PATH)]).isEqualTo(ENCODED_DATA)