mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-23 20:48:43 +00:00
Improve Media Player current and remaining time logic.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user