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