diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt
index 8569f6fb4d..6344920bf3 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt
@@ -15,6 +15,7 @@ import androidx.appcompat.widget.AppCompatImageButton
import androidx.core.content.ContextCompat
import androidx.media3.common.util.UnstableApi
import androidx.media3.ui.LegacyPlayerControlView
+import androidx.media3.ui.TimeBar
import androidx.recyclerview.widget.RecyclerView
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieProperty
@@ -23,8 +24,7 @@ import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.util.MediaUtil
import org.thoughtcrime.securesms.util.visible
import kotlin.time.Duration
-import kotlin.time.DurationUnit
-import kotlin.time.toDuration
+import kotlin.time.Duration.Companion.milliseconds
/**
* The bottom bar for the media preview. This includes the standard seek bar as well as playback controls,
@@ -41,7 +41,9 @@ class MediaPreviewPlayerControlView @JvmOverloads constructor(
val recyclerView: RecyclerView = findViewById(R.id.media_preview_album_rail)
private val durationBar: LinearLayout = findViewById(R.id.exo_duration_viewgroup)
private val videoControls: LinearLayout = findViewById(R.id.exo_button_viewgroup)
- private val durationLabel: TextView = findViewById(R.id.exo_duration)
+ private val exoProgress: TimeBar = findViewById(R.id.exo_progress)
+ private val currentPositionLabel: TextView = findViewById(R.id.exo_position_label)
+ private val remainingDurationLabel: TextView = findViewById(R.id.exo_duration_label)
private val shareButton: ImageButton = findViewById(R.id.exo_share)
private val forwardButton: ImageButton = findViewById(R.id.exo_forward)
@@ -72,22 +74,43 @@ class MediaPreviewPlayerControlView @JvmOverloads constructor(
durationBar.visible = mediaMode == MediaMode.VIDEO
videoControls.visibility = if (mediaMode == MediaMode.VIDEO) VISIBLE else INVISIBLE
if (mediaMode == MediaMode.VIDEO) {
- setProgressUpdateListener { position, _ ->
- val finalPlayer = player ?: return@setProgressUpdateListener
- val remainingDuration = (finalPlayer.duration - position).toDuration(DurationUnit.MILLISECONDS)
- if (remainingDuration >= Duration.ZERO) {
- val minutes: Long = remainingDuration.inWholeMinutes
- val seconds: Long = remainingDuration.inWholeSeconds % 60
- durationLabel.text = "–${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}"
- } else {
- durationLabel.text = ""
+ exoProgress.addListener(
+ object : TimeBar.OnScrubListener {
+ override fun onScrubStart(p0: TimeBar, position: Long) {
+ updateTimeLabels(position)
+ }
+
+ override fun onScrubMove(p0: TimeBar, position: Long) {
+ updateTimeLabels(position)
+ }
+
+ override fun onScrubStop(p0: TimeBar, position: Long, p2: Boolean) {
+ updateTimeLabels(position)
+ }
}
+ )
+ setProgressUpdateListener { position, _ ->
+ updateTimeLabels(position)
}
} else {
setProgressUpdateListener(null)
}
}
+ private fun updateTimeLabels(position: Long) {
+ val finalPlayer = player ?: return
+ val currentPosition: Duration = position.milliseconds
+ val currentMinutes: Long = currentPosition.inWholeMinutes
+ val currentSeconds: Long = currentPosition.inWholeSeconds % 60
+ val videoDuration: Duration = finalPlayer.duration.milliseconds
+ currentPositionLabel.text = "${currentMinutes.toString().padStart(2, '0')}:${currentSeconds.toString().padStart(2, '0')}"
+ val totalMinutes = videoDuration.inWholeMinutes
+ val remainingMinutes: Long = totalMinutes - currentMinutes
+ val totalSeconds = videoDuration.inWholeSeconds % 60
+ val remainingSeconds: Long = totalSeconds - currentSeconds
+ remainingDurationLabel.text = "–${remainingMinutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}"
+ }
+
fun setShareButtonListener(listener: OnClickListener?) = shareButton.setOnClickListener(listener)
fun setForwardButtonListener(listener: OnClickListener?) = forwardButton.setOnClickListener(listener)
diff --git a/app/src/main/res/layout/exo_legacy_player_control_view.xml b/app/src/main/res/layout/exo_legacy_player_control_view.xml
index 466cfcedc8..4817afb6ca 100644
--- a/app/src/main/res/layout/exo_legacy_player_control_view.xml
+++ b/app/src/main/res/layout/exo_legacy_player_control_view.xml
@@ -21,7 +21,7 @@
android:visibility="gone">