From d3d75d8bc8b56142f779d099f31a49c82a049ce5 Mon Sep 17 00:00:00 2001 From: Krunal Patel Date: Thu, 1 Dec 2022 22:02:22 +0530 Subject: [PATCH 1/4] Fix synchronization of minimized player button --- .../libretube/ui/fragments/PlayerFragment.kt | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index d7b87a6ad..30c5da369 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -819,6 +819,14 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { if (isPlaying) { // Stop [BackgroundMode] service if it is running. BackgroundHelper.stopBackgroundPlay(requireContext()) + // video is playing + binding.playImageView.setImageResource(R.drawable.ic_pause) + } else if (exoPlayer.playbackState == Player.STATE_ENDED) { + // video has finished + binding.playImageView.setImageResource(R.drawable.ic_restart) + } else { + // player in any other state + binding.playImageView.setImageResource(R.drawable.ic_play) } if (isPlaying && PlayerHelper.sponsorBlockEnabled) { @@ -847,22 +855,11 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { playNextVideo() } - when (playbackState) { - Player.STATE_READY -> { - // media actually playing - transitioning = false - binding.playImageView.setImageResource(R.drawable.ic_pause) - // update the PiP params to use the correct aspect ratio - if (usePiP()) activity?.setPictureInPictureParams(getPipParams()) - } - Player.STATE_ENDED -> { - // video has finished - binding.playImageView.setImageResource(R.drawable.ic_restart) - } - else -> { - // player in any other state - binding.playImageView.setImageResource(R.drawable.ic_play) - } + if (playbackState == Player.STATE_READY) { + // media actually playing + transitioning = false + // update the PiP params to use the correct aspect ratio + if (usePiP()) activity?.setPictureInPictureParams(getPipParams()) } // save the watch position when paused From 9dd505917d3cc171b69a285d4367f30ab671d057 Mon Sep 17 00:00:00 2001 From: Krunal Patel Date: Fri, 2 Dec 2022 12:24:18 +0530 Subject: [PATCH 2/4] Fix player control repeat icon on the video end A new image button for reapeat button is needed, changing `exo_play_pause` doesn't work because it is updated by `StyledPlayerControlView`. So, when the video ends hide `exo_play_pause` and show `repeatBTN`. --- .../libretube/ui/fragments/PlayerFragment.kt | 45 +++++++++++++++---- .../layout/exo_styled_player_control_view.xml | 8 ++++ 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index 30c5da369..467c9564b 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -315,6 +315,12 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { BackgroundHelper.stopBackgroundPlay(requireContext()) } + playerBinding.repeatBTN.setOnClickListener { + // Restart video if finished + exoPlayer.seekTo(0) + exoPlayer.play() + } + binding.playImageView.setOnClickListener { if (!exoPlayer.isPlaying) { // start or go on playing @@ -819,14 +825,6 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { if (isPlaying) { // Stop [BackgroundMode] service if it is running. BackgroundHelper.stopBackgroundPlay(requireContext()) - // video is playing - binding.playImageView.setImageResource(R.drawable.ic_pause) - } else if (exoPlayer.playbackState == Player.STATE_ENDED) { - // video has finished - binding.playImageView.setImageResource(R.drawable.ic_restart) - } else { - // player in any other state - binding.playImageView.setImageResource(R.drawable.ic_play) } if (isPlaying && PlayerHelper.sponsorBlockEnabled) { @@ -837,6 +835,18 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { } } + override fun onEvents(player: Player, events: Player.Events) { + super.onEvents(player, events) + if (events.containsAny( + Player.EVENT_PLAYBACK_STATE_CHANGED, + Player.EVENT_IS_PLAYING_CHANGED, + Player.EVENT_PLAY_WHEN_READY_CHANGED + ) + ) { + updatePlayPauseButton() + } + } + override fun onPlaybackStateChanged(playbackState: Int) { exoPlayerView.keepScreenOn = !( playbackState == Player.STATE_IDLE || @@ -963,6 +973,25 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { } } + private fun updatePlayPauseButton() { + if (exoPlayer.isPlaying) { + // video is playing + binding.playImageView.setImageResource(R.drawable.ic_pause) + playerBinding.exoPlayPause.visibility = View.VISIBLE + playerBinding.repeatBTN.visibility = View.GONE + } else if (exoPlayer.playbackState == Player.STATE_ENDED) { + // video has finished + binding.playImageView.setImageResource(R.drawable.ic_restart) + playerBinding.exoPlayPause.visibility = View.GONE + playerBinding.repeatBTN.visibility = View.VISIBLE + } else { + // player in any other state + binding.playImageView.setImageResource(R.drawable.ic_play) + playerBinding.exoPlayPause.visibility = View.VISIBLE + playerBinding.repeatBTN.visibility = View.GONE + } + } + private fun initializeRelatedVideos(relatedStreams: List?) { if (!PlayerHelper.relatedStreamsEnabled) return diff --git a/app/src/main/res/layout/exo_styled_player_control_view.xml b/app/src/main/res/layout/exo_styled_player_control_view.xml index f377d1a24..9a14b0a1c 100644 --- a/app/src/main/res/layout/exo_styled_player_control_view.xml +++ b/app/src/main/res/layout/exo_styled_player_control_view.xml @@ -283,6 +283,14 @@ android:background="?android:selectableItemBackgroundBorderless" app:tint="@android:color/white" /> + + Date: Fri, 2 Dec 2022 17:56:00 +0530 Subject: [PATCH 3/4] Change play pause implementation to use a single image button Remove `exo_play_pause` and make use of the custom image view gives more accessibility --- .../libretube/ui/fragments/PlayerFragment.kt | 21 ++++++------------- .../libretube/ui/views/CustomExoPlayerView.kt | 2 +- .../layout/exo_styled_player_control_view.xml | 10 +-------- 3 files changed, 8 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index 467c9564b..20fd982e7 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -315,16 +315,9 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { BackgroundHelper.stopBackgroundPlay(requireContext()) } - playerBinding.repeatBTN.setOnClickListener { - // Restart video if finished - exoPlayer.seekTo(0) - exoPlayer.play() - } - - binding.playImageView.setOnClickListener { + val playPauseClickListner = View.OnClickListener { if (!exoPlayer.isPlaying) { // start or go on playing - binding.playImageView.setImageResource(R.drawable.ic_pause) if (exoPlayer.playbackState == Player.STATE_ENDED) { // restart video if finished exoPlayer.seekTo(0) @@ -332,10 +325,11 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { exoPlayer.play() } else { // pause the video - binding.playImageView.setImageResource(R.drawable.ic_play) exoPlayer.pause() } } + playerBinding.playPauseBTN.setOnClickListener(playPauseClickListner) + binding.playImageView.setOnClickListener(playPauseClickListner) // video description and chapters toggle binding.playerTitleLayout.setOnClickListener { @@ -977,18 +971,15 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { if (exoPlayer.isPlaying) { // video is playing binding.playImageView.setImageResource(R.drawable.ic_pause) - playerBinding.exoPlayPause.visibility = View.VISIBLE - playerBinding.repeatBTN.visibility = View.GONE + playerBinding.playPauseBTN.setImageResource(R.drawable.ic_pause) } else if (exoPlayer.playbackState == Player.STATE_ENDED) { // video has finished binding.playImageView.setImageResource(R.drawable.ic_restart) - playerBinding.exoPlayPause.visibility = View.GONE - playerBinding.repeatBTN.visibility = View.VISIBLE + playerBinding.playPauseBTN.setImageResource(R.drawable.ic_restart) } else { // player in any other state binding.playImageView.setImageResource(R.drawable.ic_play) - playerBinding.exoPlayPause.visibility = View.VISIBLE - playerBinding.repeatBTN.visibility = View.GONE + playerBinding.playPauseBTN.setImageResource(R.drawable.ic_play) } } diff --git a/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt b/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt index 4da4fe780..e6eefcd83 100644 --- a/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt +++ b/app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt @@ -272,7 +272,7 @@ internal class CustomExoPlayerView( binding.exoBottomBar.visibility = visibility binding.closeImageButton.visibility = visibility binding.exoTitle.visibility = visibility - binding.exoPlayPause.visibility = visibility + binding.playPauseBTN.visibility = visibility // disable tap and swipe gesture if the player is locked playerGestureController.isEnabled = isLocked diff --git a/app/src/main/res/layout/exo_styled_player_control_view.xml b/app/src/main/res/layout/exo_styled_player_control_view.xml index 9a14b0a1c..5710ef259 100644 --- a/app/src/main/res/layout/exo_styled_player_control_view.xml +++ b/app/src/main/res/layout/exo_styled_player_control_view.xml @@ -277,20 +277,12 @@ - - Date: Fri, 2 Dec 2022 18:03:05 +0530 Subject: [PATCH 4/4] Remove unused drawable --- app/src/main/res/values/drawables.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/res/values/drawables.xml b/app/src/main/res/values/drawables.xml index 6f99af375..59fbce367 100644 --- a/app/src/main/res/values/drawables.xml +++ b/app/src/main/res/values/drawables.xml @@ -1,8 +1,6 @@ - @drawable/ic_play - @drawable/ic_pause @drawable/ic_launcher_lockscreen \ No newline at end of file