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 09aab3646f..62298a666e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt @@ -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')}" } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt index 881fa6498f..0b85bf2212 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt @@ -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 = 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, currentItem: MediaTable.MediaRecord) { val albumRail: RecyclerView = binding.mediaPreviewPlaybackControls.recyclerView if (albumThumbnailMedia.size > 1) {