From bf14fa90a2823fb2d2c2f89a3e97360638f9e546 Mon Sep 17 00:00:00 2001
From: Benoit Marty <benoit@matrix.org>
Date: Tue, 13 Jul 2021 15:15:07 +0200
Subject: [PATCH] Fix rendering issue of time when playing in the timeline -
 still buggy And fix timer not cancelled properly when at the end of the
 playback

---
 .../room/detail/composer/VoiceMessageHelper.kt     |  1 +
 .../detail/composer/VoiceMessageRecorderView.kt    |  1 +
 .../timeline/helper/VoiceMessagePlaybackTracker.kt |  2 +-
 .../room/detail/timeline/item/MessageVoiceItem.kt  | 14 +++++---------
 4 files changed, 8 insertions(+), 10 deletions(-)

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 461fb245de..51a2fc7150 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
@@ -225,6 +225,7 @@ class VoiceMessageHelper @Inject constructor(
             }
             else                             -> {
                 playbackTracker.stopPlayback(id = id, rememberPlaybackTime = false)
+                stopPlaybackTimer()
             }
         }
     }
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt
index 55ee89aac1..c24e11b413 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt
@@ -289,6 +289,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
     private fun renderRecordingWaveform(amplitudeList: List<Int>) {
         views.voicePlaybackWaveform.apply {
             post {
+                // TODO We could avoid recreating the whole view here and just call update() with the new value(s).
                 recreate()
                 amplitudeList.forEach { amplitude ->
                     update(amplitude)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
index 2cd2f9c866..ea6029a075 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
@@ -110,7 +110,7 @@ class VoiceMessagePlaybackTracker @Inject constructor() {
     }
 
     companion object {
-        var RECORDING_ID = "RECORDING_ID"
+        const val RECORDING_ID = "RECORDING_ID"
     }
 
     interface Listener {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
index ca35f80469..f3d50137c8 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
@@ -88,14 +88,14 @@ abstract class MessageVoiceItem : AbsMessageItem<MessageVoiceItem.Holder>() {
         voiceMessagePlaybackTracker.track(attributes.informationData.eventId, object : VoiceMessagePlaybackTracker.Listener {
             override fun onUpdate(state: VoiceMessagePlaybackTracker.Listener.State) {
                 when (state) {
-                    is VoiceMessagePlaybackTracker.Listener.State.Idle    -> handleIdleState(holder, state)
-                    is VoiceMessagePlaybackTracker.Listener.State.Playing -> handlePlayingState(holder, state)
+                    is VoiceMessagePlaybackTracker.Listener.State.Idle    -> renderIdleState(holder, state)
+                    is VoiceMessagePlaybackTracker.Listener.State.Playing -> renderPlayingState(holder, state)
                 }
             }
         })
     }
 
-    private fun handleIdleState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Idle) {
+    private fun renderIdleState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Idle) {
         holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play)
         if (state.playbackTime > 0) {
             holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime)
@@ -104,13 +104,9 @@ abstract class MessageVoiceItem : AbsMessageItem<MessageVoiceItem.Holder>() {
         }
     }
 
-    private fun handlePlayingState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Playing) {
+    private fun renderPlayingState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Playing) {
         holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_pause)
-        if (state.playbackTime > 0) {
-            holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime)
-        } else {
-            holder.voicePlaybackTime.text = formatPlaybackTime(duration)
-        }
+        holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime)
     }
 
     private fun formatPlaybackTime(time: Int) = DateUtils.formatElapsedTime((time / 1000).toLong())