Improve Media Player current and remaining time logic.

This commit is contained in:
Sagar
2025-03-31 21:10:49 +05:30
committed by Greyson Parrelli
parent eb44dd4318
commit 23af6e2bf9
2 changed files with 38 additions and 15 deletions

View File

@@ -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)

View File

@@ -21,7 +21,7 @@
android:visibility="gone">
<TextView
android:id="@id/exo_position"
android:id="@+id/exo_position_label"
style="@style/Signal.Text.BodyMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -31,14 +31,14 @@
android:textColor="@color/signal_colorOnSurface" />
<androidx.media3.ui.DefaultTimeBar
android:id="@id/exo_progress"
android:id="@+id/exo_progress"
android:layout_width="0dp"
android:layout_height="55dp"
android:layout_weight="1"
app:touch_target_height="55dp" />
<TextView
android:id="@+id/exo_duration"
android:id="@+id/exo_duration_label"
style="@style/Signal.Text.BodyMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"