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)*/ } }