diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.kt index aaad75d11d..ff982f95be 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.kt @@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.video.videoconverter.VideoThumbnailsRangeSelec import org.thoughtcrime.securesms.video.videoconverter.VideoThumbnailsRangeSelectorView.PositionDragListener import java.io.IOException import kotlin.time.Duration.Companion.microseconds +import kotlin.time.Duration.Companion.milliseconds class VideoEditorFragment : Fragment(), PositionDragListener, MediaSendPageFragment { private val sharedViewModel: MediaSelectionViewModel by viewModels(ownerProducer = { requireActivity() }) @@ -46,9 +47,9 @@ class VideoEditorFragment : Fragment(), PositionDragListener, MediaSendPageFragm private val updatePosition = object : Runnable { override fun run() { if (MediaConstraints.isVideoTranscodeAvailable()) { - val playbackPositionUs = player.playbackPositionUs - if (playbackPositionUs >= 0) { - videoTimeLine.setActualPosition(playbackPositionUs) + val playbackPosition = player.truePlaybackPosition + if (playbackPosition >= 0) { + videoTimeLine.setActualPosition(playbackPosition.milliseconds.inWholeMicroseconds) handler.postDelayed(this, 100) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java index 009450c4cf..1fcf4394cb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java @@ -288,9 +288,15 @@ public class VideoPlayer extends FrameLayout { return 0L; } - public long getPlaybackPositionUs() { + /** + * After calling {@link #setPlaybackPosition}, the underlying {@link Player} resets the current position to 0. + * We manually store the offset of where we clipped to, and add that here. + * + * @return the current playback position, rounded to the nearest millisecond + */ + public long getTruePlaybackPosition() { if (this.exoPlayer != null) { - return TimeUnit.MILLISECONDS.toMicros(this.exoPlayer.getCurrentPosition()); + return this.exoPlayer.getCurrentPosition() + Math.round(clippedStartUs / 1000.0); } return -1L; }