From bf2d937ad62556232b8e8ab6bf5fdd6e6e52de02 Mon Sep 17 00:00:00 2001 From: Valere Date: Thu, 9 Jul 2020 08:59:06 +0200 Subject: [PATCH] Basic video seekTo support --- .../attachmentviewer/AttachmentEvents.kt | 1 + .../AttachmentViewerActivity.kt | 7 ++--- .../riotx/attachmentviewer/VideoViewHolder.kt | 7 +++++ .../features/media/AttachmentOverlayView.kt | 31 +++++++++++++++---- .../features/media/RoomAttachmentProvider.kt | 4 +++ .../media/VectorAttachmentViewerActivity.kt | 4 +++ 6 files changed, 44 insertions(+), 10 deletions(-) diff --git a/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/AttachmentEvents.kt b/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/AttachmentEvents.kt index 5b1f2ab90d..b2b6c9fe16 100644 --- a/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/AttachmentEvents.kt +++ b/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/AttachmentEvents.kt @@ -27,4 +27,5 @@ interface AttachmentEventListener { sealed class AttachmentCommands { object PauseVideo : AttachmentCommands() object StartVideo : AttachmentCommands() + data class SeekTo(val percentProgress: Int) : AttachmentCommands() } diff --git a/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/AttachmentViewerActivity.kt b/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/AttachmentViewerActivity.kt index 6f2436f261..029064e058 100644 --- a/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/AttachmentViewerActivity.kt +++ b/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/AttachmentViewerActivity.kt @@ -303,10 +303,9 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi finish() } - public fun handle(commands: AttachmentCommands) { - (attachmentsAdapter.recyclerView?.findViewHolderForAdapterPosition(currentPosition) as? BaseViewHolder)?.let { - it.handleCommand(commands) - } + fun handle(commands: AttachmentCommands) { + (attachmentsAdapter.recyclerView?.findViewHolderForAdapterPosition(currentPosition) as? BaseViewHolder) + ?.handleCommand(commands) } private fun hideSystemUI() { diff --git a/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/VideoViewHolder.kt b/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/VideoViewHolder.kt index a2424dda57..5718147bab 100644 --- a/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/VideoViewHolder.kt +++ b/attachment-viewer/src/main/java/im/vector/riotx/attachmentviewer/VideoViewHolder.kt @@ -162,6 +162,13 @@ class VideoViewHolder constructor(itemView: View) : wasPaused = true videoView.pause() } + is AttachmentCommands.SeekTo -> { + val duration = videoView.duration + if (duration > 0) { + val seekDuration = duration * (commands.percentProgress / 100f) + videoView.seekTo(seekDuration.toInt()) + } + } } } diff --git a/vector/src/main/java/im/vector/riotx/features/media/AttachmentOverlayView.kt b/vector/src/main/java/im/vector/riotx/features/media/AttachmentOverlayView.kt index a2657f7daf..2812b011f9 100644 --- a/vector/src/main/java/im/vector/riotx/features/media/AttachmentOverlayView.kt +++ b/vector/src/main/java/im/vector/riotx/features/media/AttachmentOverlayView.kt @@ -36,6 +36,7 @@ class AttachmentOverlayView @JvmOverloads constructor( var onShareCallback: (() -> Unit)? = null var onBack: (() -> Unit)? = null var onPlayPause: ((play: Boolean) -> Unit)? = null + var videoSeekTo: ((progress: Int) -> Unit)? = null private val counterTextView: TextView private val infoTextView: TextView @@ -47,6 +48,8 @@ class AttachmentOverlayView @JvmOverloads constructor( val videoControlsGroup: Group + var suspendSeekBarUpdate = false + init { View.inflate(context, R.layout.merge_image_attachment_overlay, this) setBackgroundColor(Color.TRANSPARENT) @@ -56,8 +59,6 @@ class AttachmentOverlayView @JvmOverloads constructor( videoControlsGroup = findViewById(R.id.overlayVideoControlsGroup) overlayPlayPauseButton = findViewById(R.id.overlayPlayPauseButton) overlaySeekBar = findViewById(R.id.overlaySeekBar) - - overlaySeekBar.isEnabled = false findViewById(R.id.overlayBackButton).setOnClickListener { onBack?.invoke() } @@ -67,6 +68,22 @@ class AttachmentOverlayView @JvmOverloads constructor( findViewById(R.id.overlayPlayPauseButton).setOnClickListener { onPlayPause?.invoke(!isPlaying) } + + overlaySeekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + if (fromUser) { + videoSeekTo?.invoke(progress) + } + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + suspendSeekBarUpdate = true + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + suspendSeekBarUpdate = false + } + }) } fun updateWith(counter: String, senderInfo: String) { @@ -78,10 +95,12 @@ class AttachmentOverlayView @JvmOverloads constructor( when (event) { is AttachmentEvents.VideoEvent -> { overlayPlayPauseButton.setImageResource(if (!event.isPlaying) R.drawable.ic_play_arrow else R.drawable.ic_pause) - val safeDuration = (if (event.duration == 0) 100 else event.duration).toFloat() - val percent = ((event.progress / safeDuration) * 100f).toInt().coerceAtMost(100) - isPlaying = event.isPlaying - overlaySeekBar.progress = percent + if (!suspendSeekBarUpdate) { + val safeDuration = (if (event.duration == 0) 100 else event.duration).toFloat() + val percent = ((event.progress / safeDuration) * 100f).toInt().coerceAtMost(100) + isPlaying = event.isPlaying + overlaySeekBar.progress = percent + } } } } diff --git a/vector/src/main/java/im/vector/riotx/features/media/RoomAttachmentProvider.kt b/vector/src/main/java/im/vector/riotx/features/media/RoomAttachmentProvider.kt index 9f6080d95f..4e30e0179a 100644 --- a/vector/src/main/java/im/vector/riotx/features/media/RoomAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/riotx/features/media/RoomAttachmentProvider.kt @@ -58,6 +58,7 @@ class RoomAttachmentProvider( fun onDismissTapped() fun onShareTapped() fun onPlayPause(play: Boolean) + fun videoSeekTo(percent: Int) } var interactionListener: InteractionListener? = null @@ -201,6 +202,9 @@ class RoomAttachmentProvider( overlayView?.onPlayPause = { play -> interactionListener?.onPlayPause(play) } + overlayView?.videoSeekTo = { percent -> + interactionListener?.videoSeekTo(percent) + } } val item = attachments[position] val dateString = item.root.localDateTime().let { diff --git a/vector/src/main/java/im/vector/riotx/features/media/VectorAttachmentViewerActivity.kt b/vector/src/main/java/im/vector/riotx/features/media/VectorAttachmentViewerActivity.kt index 2606f0bb76..10483f3fa9 100644 --- a/vector/src/main/java/im/vector/riotx/features/media/VectorAttachmentViewerActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/media/VectorAttachmentViewerActivity.kt @@ -247,6 +247,10 @@ class VectorAttachmentViewerActivity : AttachmentViewerActivity(), RoomAttachmen handle(if (play) AttachmentCommands.StartVideo else AttachmentCommands.PauseVideo) } + override fun videoSeekTo(percent: Int) { + handle(AttachmentCommands.SeekTo(percent)) + } + override fun onShareTapped() { // Share eventList?.get(currentPosition)?.let { timelineEvent ->