VidiDin-Android/app/src/main/java/com/gamedog/vididin/widget/MyPlayerControlView.kt

305 lines
12 KiB
Kotlin

package com.gamedog.vididin.widget
import android.content.Intent
import android.graphics.drawable.Drawable
import android.net.Uri
import android.util.Log
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.ProgressBar
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.viddin.videos.free.R
import com.pierfrancescosoffritti.androidyoutubeplayer.core.customui.PlayerUiController
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.PlayerConstants
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views.YouTubePlayerView
import com.pierfrancescosoffritti.androidyoutubeplayer.core.customui.menu.YouTubePlayerMenu
import com.pierfrancescosoffritti.androidyoutubeplayer.core.customui.utils.FadeViewHelper
import com.pierfrancescosoffritti.androidyoutubeplayer.core.customui.views.YouTubePlayerSeekBar
import com.pierfrancescosoffritti.androidyoutubeplayer.core.customui.views.YouTubePlayerSeekBarListener
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.YouTubePlayerCallback
import kotlin.jvm.javaClass
class MyPlayerControlView(
private val youTubePlayerView: YouTubePlayerView,
) : PlayerUiController {
var youTubePlayer: YouTubePlayer? = null
val rootView: View = View.inflate(youTubePlayerView.context, R.layout.layout_player_controller, null)
private var youTubePlayerMenu: YouTubePlayerMenu = MyPlayerMenu(
youTubePlayerView.context
)
/**
* View used for for intercepting clicks and for drawing a black background.
* Could have used controlsContainer, but in this way I'm able to hide all the control at once by hiding controlsContainer
*/
private val panel: View = rootView.findViewById(R.id.panel)
private val controlsContainer: View = rootView.findViewById(R.id.controls_container)
private val extraViewsContainer: LinearLayout = rootView.findViewById(R.id.extra_views_container)
private val videoTitle: TextView = rootView.findViewById(R.id.video_title)
private val liveVideoIndicator: TextView = rootView.findViewById(R.id.live_video_indicator)
private val progressBar: ProgressBar = rootView.findViewById(R.id.progress)
private val menuButton: ImageView = rootView.findViewById(R.id.menu_button)
private val playPauseButton: ImageView = rootView.findViewById(R.id.play_pause_button)
private val youTubeButton: ImageView = rootView.findViewById(R.id.youtube_button)
private val fullscreenButton: ImageView = rootView.findViewById(R.id.fullscreen_button)
private val customActionLeft: ImageView = rootView.findViewById(R.id.custom_action_left_button)
private val customActionRight: ImageView = rootView.findViewById(R.id.custom_action_right_button)
private val youtubePlayerSeekBar: YouTubePlayerSeekBar = rootView.findViewById(R.id.youtube_player_seekbar)
private val fadeControlsContainer: FadeViewHelper = FadeViewHelper(controlsContainer)
private var onFullscreenButtonListener: View.OnClickListener
private var onMenuButtonClickListener: View.OnClickListener
private var isPlaying = false
private var isPlayPauseButtonEnabled = true
private var isCustomActionLeftEnabled = false
private var isCustomActionRightEnabled = false
private var isMatchParent = false
private val youTubePlayerStateListener = object : AbstractYouTubePlayerListener() {
override fun onStateChange(youTubePlayer: YouTubePlayer, state: PlayerConstants.PlayerState) {
updateState(state)
if (state === PlayerConstants.PlayerState.PLAYING || state === PlayerConstants.PlayerState.PAUSED || state === PlayerConstants.PlayerState.VIDEO_CUED) {
panel.setBackgroundColor(ContextCompat.getColor(panel.context, R.color.transparent))
progressBar.visibility = View.GONE
if (isPlayPauseButtonEnabled) playPauseButton.visibility = View.VISIBLE
if (isCustomActionLeftEnabled) customActionLeft.visibility = View.VISIBLE
if (isCustomActionRightEnabled) customActionRight.visibility = View.VISIBLE
updatePlayPauseButtonIcon(state === PlayerConstants.PlayerState.PLAYING)
} else {
updatePlayPauseButtonIcon(false)
if (state === PlayerConstants.PlayerState.BUFFERING) {
progressBar.visibility = View.VISIBLE
panel.setBackgroundColor(
ContextCompat.getColor(
panel.context,
R.color.transparent
)
)
if (isPlayPauseButtonEnabled) playPauseButton.visibility = View.INVISIBLE
customActionLeft.visibility = View.GONE
customActionRight.visibility = View.GONE
}
if (state === PlayerConstants.PlayerState.UNSTARTED) {
progressBar.visibility = View.GONE
if (isPlayPauseButtonEnabled) playPauseButton.visibility = View.VISIBLE
}
}
}
override fun onVideoId(youTubePlayer: YouTubePlayer, videoId: String) {
youTubeButton.setOnClickListener {
val intent = Intent(
Intent.ACTION_VIEW,
Uri.parse("https://www.youtube.com/watch?v=" + videoId + "#t=" + youtubePlayerSeekBar.seekBar.progress)
)
try {
youTubeButton.context.startActivity(intent)
} catch (e: Exception) {
Log.e(javaClass.simpleName, e.message ?: "Can't open url to YouTube")
}
}
}
}
init {
onFullscreenButtonListener = View.OnClickListener {
isMatchParent = !isMatchParent
when (isMatchParent) {
true -> youTubePlayerView.matchParent()
false -> youTubePlayerView.wrapContent()
}
}
onMenuButtonClickListener = View.OnClickListener { youTubePlayerMenu.show(menuButton) }
youTubePlayerView.getYouTubePlayerWhenReady(object : YouTubePlayerCallback{
override fun onYouTubePlayer(youTubePlayer: YouTubePlayer) {
this@MyPlayerControlView.youTubePlayer = youTubePlayer
initClickListeners()
}
})
}
private fun initClickListeners() {
youTubePlayer?.addListener(youtubePlayerSeekBar)
youTubePlayer?.addListener(fadeControlsContainer)
youTubePlayer?.addListener(youTubePlayerStateListener)
youTubePlayer?.let {
youtubePlayerSeekBar.youtubePlayerSeekBarListener = object : YouTubePlayerSeekBarListener {
override fun seekTo(time: Float) = it.seekTo(time)
}
}
panel.setOnClickListener { fadeControlsContainer.toggleVisibility() }
playPauseButton.setOnClickListener { onPlayButtonPressed() }
fullscreenButton.setOnClickListener { onFullscreenButtonListener.onClick(fullscreenButton) }
menuButton.setOnClickListener { onMenuButtonClickListener.onClick(menuButton) }
}
override fun showVideoTitle(show: Boolean): PlayerUiController {
videoTitle.visibility = if (show) View.VISIBLE else View.GONE
return this
}
override fun setVideoTitle(videoTitle: String): PlayerUiController {
this.videoTitle.text = videoTitle
return this
}
override fun showUi(show: Boolean): PlayerUiController {
fadeControlsContainer.isDisabled = !show
controlsContainer.visibility = if (show) View.VISIBLE else View.INVISIBLE
return this
}
override fun showPlayPauseButton(show: Boolean): PlayerUiController {
playPauseButton.visibility = if (show) View.VISIBLE else View.GONE
isPlayPauseButtonEnabled = show
return this
}
override fun enableLiveVideoUi(enable: Boolean): PlayerUiController {
youtubePlayerSeekBar.visibility = if (enable) View.INVISIBLE else View.VISIBLE
liveVideoIndicator.visibility = if (enable) View.VISIBLE else View.GONE
return this
}
override fun setCustomAction1(
icon: Drawable,
clickListener: View.OnClickListener?
): PlayerUiController {
customActionLeft.setImageDrawable(icon)
customActionLeft.setOnClickListener(clickListener)
showCustomAction1(true)
return this
}
override fun setCustomAction2(
icon: Drawable,
clickListener: View.OnClickListener?
): PlayerUiController {
customActionRight.setImageDrawable(icon)
customActionRight.setOnClickListener(clickListener)
showCustomAction2(true)
return this
}
override fun showCustomAction1(show: Boolean): PlayerUiController {
isCustomActionLeftEnabled = show
customActionLeft.visibility = if (show) View.VISIBLE else View.GONE
return this
}
override fun showCustomAction2(show: Boolean): PlayerUiController {
isCustomActionRightEnabled = show
customActionRight.visibility = if (show) View.VISIBLE else View.GONE
return this
}
override fun showMenuButton(show: Boolean): PlayerUiController {
menuButton.visibility = if (show) View.VISIBLE else View.GONE
return this
}
override fun setMenuButtonClickListener(customMenuButtonClickListener: View.OnClickListener): PlayerUiController {
onMenuButtonClickListener = customMenuButtonClickListener
return this
}
override fun showCurrentTime(show: Boolean): PlayerUiController {
youtubePlayerSeekBar.videoCurrentTimeTextView.visibility = if (show) View.VISIBLE else View.GONE
return this
}
override fun showDuration(show: Boolean): PlayerUiController {
youtubePlayerSeekBar.videoDurationTextView.visibility = if (show) View.VISIBLE else View.GONE
return this
}
override fun showSeekBar(show: Boolean): PlayerUiController {
youtubePlayerSeekBar.seekBar.visibility = if (show) View.VISIBLE else View.INVISIBLE
return this
}
override fun showBufferingProgress(show: Boolean): PlayerUiController {
youtubePlayerSeekBar.showBufferingProgress = show
return this
}
override fun showYouTubeButton(show: Boolean): PlayerUiController {
youTubeButton.visibility = if (show) View.VISIBLE else View.GONE
return this
}
override fun addView(view: View): PlayerUiController {
extraViewsContainer.addView(view, 0)
return this
}
override fun removeView(view: View): PlayerUiController {
extraViewsContainer.removeView(view)
return this
}
override fun getMenu(): YouTubePlayerMenu = youTubePlayerMenu
override fun showFullscreenButton(show: Boolean): PlayerUiController {
fullscreenButton.visibility = if (show) View.VISIBLE else View.GONE
return this
}
override fun setFullscreenButtonClickListener(customFullscreenButtonClickListener: View.OnClickListener): PlayerUiController {
onFullscreenButtonListener = customFullscreenButtonClickListener
return this
}
private fun onPlayButtonPressed() {
if (isPlaying)
youTubePlayer?.pause()
else
youTubePlayer?.play()
}
private fun updateState(state: PlayerConstants.PlayerState) {
when (state) {
PlayerConstants.PlayerState.ENDED -> isPlaying = false
PlayerConstants.PlayerState.PAUSED -> isPlaying = false
PlayerConstants.PlayerState.PLAYING -> isPlaying = true
else -> {}
}
updatePlayPauseButtonIcon(!isPlaying)
}
private fun updatePlayPauseButtonIcon(playing: Boolean) {
/*val drawable = if (playing) R.drawable.ayp_ic_pause_36dp else R.drawable.ayp_ic_play_36dp
playPauseButton.setImageResource(drawable)*/
}
}