Improve play button display logic on video editor fragment.

This commit is contained in:
Nicholas Tinsley 2024-04-12 17:08:01 -04:00 committed by Greyson Parrelli
parent 89eeae36c4
commit 5416c3b8aa

View file

@ -13,13 +13,13 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import org.signal.core.util.logging.Log import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionState
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel
import org.thoughtcrime.securesms.mediasend.v2.videos.VideoTrimData import org.thoughtcrime.securesms.mediasend.v2.videos.VideoTrimData
import org.thoughtcrime.securesms.mms.MediaConstraints import org.thoughtcrime.securesms.mms.MediaConstraints
import org.thoughtcrime.securesms.mms.VideoSlide import org.thoughtcrime.securesms.mms.VideoSlide
import org.thoughtcrime.securesms.scribbles.VideoEditorPlayButtonLayout import org.thoughtcrime.securesms.scribbles.VideoEditorPlayButtonLayout
import org.thoughtcrime.securesms.util.Throttler import org.thoughtcrime.securesms.util.Throttler
import org.thoughtcrime.securesms.util.visible
import org.thoughtcrime.securesms.video.VideoPlayer import org.thoughtcrime.securesms.video.VideoPlayer
import org.thoughtcrime.securesms.video.VideoPlayer.PlayerCallback import org.thoughtcrime.securesms.video.VideoPlayer.PlayerCallback
import org.thoughtcrime.securesms.video.videoconverter.VideoThumbnailsRangeSelectorView import org.thoughtcrime.securesms.video.videoconverter.VideoThumbnailsRangeSelectorView
@ -32,7 +32,6 @@ class VideoEditorFragment : Fragment(), PositionDragListener, MediaSendPageFragm
private val videoScanThrottle = Throttler(150) private val videoScanThrottle = Throttler(150)
private val handler = Handler(Looper.getMainLooper()) private val handler = Handler(Looper.getMainLooper())
private var canEdit = false
private var isVideoGif = false private var isVideoGif = false
private var isInEdit = false private var isInEdit = false
private var isFocused = false private var isFocused = false
@ -87,6 +86,8 @@ class VideoEditorFragment : Fragment(), PositionDragListener, MediaSendPageFragm
player.setWindow(requireActivity().window) player.setWindow(requireActivity().window)
player.setVideoSource(slide, isVideoGif, TAG) player.setVideoSource(slide, isVideoGif, TAG)
hud.visible = !slide.isVideoGif
if (slide.isVideoGif) { if (slide.isVideoGif) {
player.setPlayerCallback(object : PlayerCallback { player.setPlayerCallback(object : PlayerCallback {
override fun onPlaying() { override fun onPlaying() {
@ -101,14 +102,8 @@ class VideoEditorFragment : Fragment(), PositionDragListener, MediaSendPageFragm
}) })
player.hideControls() player.hideControls()
player.loopForever() player.loopForever()
player.play()
} else { } else {
if (MediaConstraints.isVideoTranscodeAvailable()) {
sharedViewModel.state.value?.let { state ->
bindVideoTimeline(state)
}
} else {
hud.visibility = View.VISIBLE
}
hud.setPlayClickListener { hud.setPlayClickListener {
player.play() player.play()
} }
@ -139,18 +134,23 @@ class VideoEditorFragment : Fragment(), PositionDragListener, MediaSendPageFragm
sharedViewModel.state.observe(viewLifecycleOwner) { incomingState -> sharedViewModel.state.observe(viewLifecycleOwner) { incomingState ->
val focusedUri = incomingState.focusedMedia?.uri val focusedUri = incomingState.focusedMedia?.uri
val currentlyFocused = focusedUri != null && focusedUri == uri val currentlyFocused = focusedUri != null && focusedUri == uri
if (MediaConstraints.isVideoTranscodeAvailable() && canEdit) { if (MediaConstraints.isVideoTranscodeAvailable()) {
if (currentlyFocused) { if (currentlyFocused) {
if (isVideoGif) {
player.play()
} else {
if (!isFocused) { if (!isFocused) {
bindVideoTimeline(incomingState) bindVideoTimeline(incomingState.getOrCreateVideoTrimData(uri))
} else { } else {
val videoTrimData = if (focusedUri != null) { val videoTrimData = if (focusedUri != null) {
incomingState.getOrCreateVideoTrimData(focusedUri) incomingState.getOrCreateVideoTrimData(focusedUri)
} else { } else {
VideoTrimData() VideoTrimData()
} }
hud.visible = incomingState.isTouchEnabled && !isVideoGif
onEditVideoDuration(videoTrimData, incomingState.isTouchEnabled) onEditVideoDuration(videoTrimData, incomingState.isTouchEnabled)
} }
}
} else { } else {
stopPositionUpdates() stopPositionUpdates()
player.pause() player.pause()
@ -161,22 +161,15 @@ class VideoEditorFragment : Fragment(), PositionDragListener, MediaSendPageFragm
} }
@RequiresApi(23) @RequiresApi(23)
private fun bindVideoTimeline(state: MediaSelectionState) { private fun bindVideoTimeline(data: VideoTrimData) {
val uri = state.focusedMedia?.uri ?: return
if (uri != this.uri) {
return
}
val autoplay = isVideoGif val autoplay = isVideoGif
val slide = VideoSlide(requireContext(), uri, 0, autoplay) val slide = VideoSlide(requireContext(), uri, 0, autoplay)
val data = state.getOrCreateVideoTrimData(uri)
if (data.isDurationEdited) { if (data.isDurationEdited) {
player.clip(data.startTimeUs, data.endTimeUs, autoplay) player.clip(data.startTimeUs, data.endTimeUs, autoplay)
} }
if (slide.hasVideo()) { if (slide.hasVideo() && !autoplay) {
canEdit = true
try { try {
videoTimeLine.registerPlayerDragListener(this) videoTimeLine.registerPlayerDragListener(this)
@ -258,8 +251,6 @@ class VideoEditorFragment : Fragment(), PositionDragListener, MediaSendPageFragm
@RequiresApi(23) @RequiresApi(23)
private fun onEditVideoDuration(data: VideoTrimData, editingComplete: Boolean) { private fun onEditVideoDuration(data: VideoTrimData, editingComplete: Boolean) {
hud.hidePlayButton()
if (editingComplete) { if (editingComplete) {
isInEdit = false isInEdit = false
videoScanThrottle.clear() videoScanThrottle.clear()
@ -268,6 +259,10 @@ class VideoEditorFragment : Fragment(), PositionDragListener, MediaSendPageFragm
wasPlayingBeforeEdit = player.isPlaying wasPlayingBeforeEdit = player.isPlaying
} }
if (wasPlayingBeforeEdit) {
hud.hidePlayButton()
}
videoScanThrottle.publish { videoScanThrottle.publish {
player.pause() player.pause()
if (!editingComplete) { if (!editingComplete) {