Fix media player incorrect state when switching videos in album.

This commit is contained in:
Sagar
2025-04-29 19:10:12 +05:30
committed by Cody Henthorne
parent fd47d28026
commit a27daddb70
2 changed files with 23 additions and 3 deletions

View File

@@ -112,8 +112,8 @@ class MediaPreviewPlayerControlView @JvmOverloads constructor(
val videoDuration: Duration = finalPlayer.duration.milliseconds
currentPositionLabel.text = "${currentMinutes.toString().padStart(2, '0')}:${currentSeconds.toString().padStart(2, '0')}"
val remainingDuration: Duration = videoDuration - currentPosition
val remainingMinutes: Long = remainingDuration.inWholeMinutes
val remainingSeconds: Long = remainingDuration.inWholeSeconds % 60
val remainingMinutes: Long = remainingDuration.inWholeMinutes.coerceAtLeast(0L)
val remainingSeconds: Long = (remainingDuration.inWholeSeconds % 60).coerceAtLeast(0L)
remainingDurationLabel.text = "${remainingMinutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}"
}

View File

@@ -37,6 +37,8 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.kotlin.subscribeBy
import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import org.signal.core.util.concurrent.LifecycleDisposable
import org.signal.core.util.concurrent.addTo
@@ -259,7 +261,7 @@ class MediaPreviewV2Fragment :
bindTextViews(currentItem, currentState.showThread, currentState.messageBodies)
bindMenuItems(currentItem)
bindMediaPreviewPlaybackControls(currentItem, getMediaPreviewFragmentFromChildFragmentManager(currentPosition))
tryBindMediaPreviewPlaybackControls(currentItem, currentPosition)
val albumThumbnailMedia: List<Media> = if (currentState.allMediaInAlbumRail) {
currentState.mediaRecords.mapNotNull { it.toMedia() }
@@ -352,6 +354,24 @@ class MediaPreviewV2Fragment :
currentFragment?.autoPlayIfNeeded()
}
private fun tryBindMediaPreviewPlaybackControls(
currentItem: MediaTable.MediaRecord,
currentPosition: Int,
maxRetries: Int = 5,
delayMillis: Long = 50L
) {
viewLifecycleOwner.lifecycleScope.launch {
repeat(maxRetries) { attempt ->
if (!isActive) return@launch
val mediaFragment = getMediaPreviewFragmentFromChildFragmentManager(currentPosition)
bindMediaPreviewPlaybackControls(currentItem, mediaFragment)
if (mediaFragment != null) return@launch
delay(delayMillis)
}
}
}
private fun bindAlbumRail(albumThumbnailMedia: List<Media>, currentItem: MediaTable.MediaRecord) {
val albumRail: RecyclerView = binding.mediaPreviewPlaybackControls.recyclerView
if (albumThumbnailMedia.size > 1) {