Show voice message preview player progress (#1675)

* Show voice message preview player progress

* Update screenshots

* Fix test

* Some nits over mediaplayer stuff

---------

Co-authored-by: ElementBot <benoitm+elementbot@element.io>
Co-authored-by: Marco Romano <marcor@element.io>
This commit is contained in:
jonnyandrew 2023-10-27 21:43:52 +01:00 committed by GitHub
parent 21499a2d40
commit 8121d1a6de
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 102 additions and 41 deletions

View file

@ -41,7 +41,8 @@ class VoiceMessageComposerPlayer @Inject constructor(
State(
isPlaying = state.isPlaying,
currentPosition = state.currentPosition
currentPosition = state.currentPosition,
duration = state.duration,
)
}.distinctUntilChanged()
@ -82,12 +83,23 @@ class VoiceMessageComposerPlayer @Inject constructor(
* The elapsed time of this player in milliseconds.
*/
val currentPosition: Long,
/**
* The duration of this player in milliseconds.
*/
val duration: Long,
) {
companion object {
val NotPlaying = State(
isPlaying = false,
currentPosition = 0L,
duration = 0L,
)
}
/**
* The progress of this player between 0 and 1.
*/
val progress: Float =
if (duration <= currentPosition) 0f else currentPosition.toFloat() / duration.toFloat()
}
}

View file

@ -185,6 +185,7 @@ class VoiceMessageComposerPresenter @Inject constructor(
is VoiceRecorderState.Finished -> VoiceMessageState.Preview(
isSending = isSending,
isPlaying = isPlaying,
playbackProgress = playerState.progress,
waveform = waveform,
)
else -> VoiceMessageState.Idle

View file

@ -164,7 +164,7 @@ class VoiceMessageComposerPresenterTest {
awaitItem().eventSink(VoiceMessageComposerEvents.RecordButtonEvent(PressEvent.LongPressEnd))
awaitItem().eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Play))
val finalState = awaitItem().also {
assertThat(it.voiceMessageState).isEqualTo(aPreviewState(isPlaying = true))
assertThat(it.voiceMessageState).isEqualTo(aPreviewState(isPlaying = true, playbackProgress = 0.1f))
}
voiceRecorder.assertCalls(started = 1, stopped = 1, deleted = 0)
@ -183,7 +183,7 @@ class VoiceMessageComposerPresenterTest {
awaitItem().eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Play))
awaitItem().eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Pause))
val finalState = awaitItem().also {
assertThat(it.voiceMessageState).isEqualTo(aPreviewState(isPlaying = false))
assertThat(it.voiceMessageState).isEqualTo(aPreviewState(isPlaying = false, playbackProgress = 0.1f))
}
voiceRecorder.assertCalls(started = 1, stopped = 1, deleted = 0)
@ -220,7 +220,7 @@ class VoiceMessageComposerPresenterTest {
awaitItem().eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Play))
awaitItem().eventSink(VoiceMessageComposerEvents.DeleteVoiceMessage)
awaitItem().apply {
assertThat(voiceMessageState).isEqualTo(aPreviewState(isPlaying = false))
assertThat(voiceMessageState).isEqualTo(aPreviewState(isPlaying = false, playbackProgress = 0.1f))
}
val finalState = awaitItem()
@ -262,7 +262,7 @@ class VoiceMessageComposerPresenterTest {
awaitItem().eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Play))
awaitItem().eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
assertThat(awaitItem().voiceMessageState).isEqualTo(aPreviewState(
isSending = true, isPlaying = false,
isSending = true, isPlaying = false, playbackProgress = 0.1f
))
val finalState = awaitItem()
@ -510,7 +510,7 @@ class VoiceMessageComposerPresenterTest {
is VoiceMessageState.Preview -> when (state.isPlaying) {
// If the preview was playing, it pauses
true -> awaitItem().apply {
assertThat(voiceMessageState).isEqualTo(aPreviewState())
assertThat(voiceMessageState).isEqualTo(aPreviewState(playbackProgress = 0.1f))
}
false -> mostRecentState
}
@ -561,10 +561,12 @@ class VoiceMessageComposerPresenterTest {
private fun aPreviewState(
isPlaying: Boolean = false,
playbackProgress: Float = 0f,
isSending: Boolean = false,
waveform: List<Float> = voiceRecorder.waveform,
) = VoiceMessageState.Preview(
isPlaying = isPlaying,
playbackProgress = playbackProgress,
isSending = isSending,
waveform = waveform.toImmutableList(),
)