From 7ffe3a6ed9f7cd3dcd81ee3bc0201697bfe99e35 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sat, 21 Jan 2023 11:46:56 +0100 Subject: [PATCH] [Audio Mode] Share, playback and queue controls --- .../libretube/services/BackgroundMode.kt | 2 +- .../ui/fragments/AudioPlayerFragment.kt | 39 ++++++++++---- ...kSpeedSheet.kt => PlaybackOptionsSheet.kt} | 2 +- .../libretube/ui/views/CustomExoPlayerView.kt | 4 +- app/src/main/res/drawable/ic_video.xml | 5 ++ .../main/res/layout/fragment_audio_player.xml | 54 ++++++++++++++++--- app/src/main/res/values/style.xml | 8 +++ 7 files changed, 92 insertions(+), 22 deletions(-) rename app/src/main/java/com/github/libretube/ui/sheets/{PlaybackSpeedSheet.kt => PlaybackOptionsSheet.kt} (98%) create mode 100644 app/src/main/res/drawable/ic_video.xml diff --git a/app/src/main/java/com/github/libretube/services/BackgroundMode.kt b/app/src/main/java/com/github/libretube/services/BackgroundMode.kt index ac4251f65..ccaf5aa91 100644 --- a/app/src/main/java/com/github/libretube/services/BackgroundMode.kt +++ b/app/src/main/java/com/github/libretube/services/BackgroundMode.kt @@ -65,7 +65,7 @@ class BackgroundMode : Service() { /** * The [ExoPlayer] player. Followed tutorial [here](https://developer.android.com/codelabs/exoplayer-intro) */ - private var player: ExoPlayer? = null + var player: ExoPlayer? = null private var playWhenReadyPlayer = true /** diff --git a/app/src/main/java/com/github/libretube/ui/fragments/AudioPlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/AudioPlayerFragment.kt index b2b599952..a0ec7e3e9 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/AudioPlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/AudioPlayerFragment.kt @@ -15,10 +15,14 @@ import android.view.ViewGroup import com.github.libretube.R import com.github.libretube.api.obj.StreamItem import com.github.libretube.databinding.FragmentAudioPlayerBinding +import com.github.libretube.enums.ShareObjectType import com.github.libretube.extensions.toID +import com.github.libretube.obj.ShareData import com.github.libretube.services.BackgroundMode import com.github.libretube.ui.activities.MainActivity import com.github.libretube.ui.base.BaseFragment +import com.github.libretube.ui.dialogs.ShareDialog +import com.github.libretube.ui.sheets.PlaybackOptionsSheet import com.github.libretube.ui.sheets.PlayingQueueSheet import com.github.libretube.util.ImageHelper import com.github.libretube.util.NavigationHelper @@ -32,7 +36,7 @@ class AudioPlayerFragment : BaseFragment() { private var handler = Handler(Looper.getMainLooper()) private var isPaused: Boolean = false - private lateinit var playerService: BackgroundMode + private var playerService: BackgroundMode? = null /** Defines callbacks for service binding, passed to bindService() */ private val connection = object : ServiceConnection { @@ -86,16 +90,31 @@ class AudioPlayerFragment : BaseFragment() { PlayingQueue.onQueueItemSelected(currentIndex + 1) } - binding.thumbnail.setOnClickListener { + binding.openQueue.setOnClickListener { PlayingQueueSheet().show(childFragmentManager) } + binding.playbackOptions.setOnClickListener { + playerService?.player?.let { + PlaybackOptionsSheet(it) + .show(childFragmentManager) + } + } + + binding.share.setOnClickListener { + val currentVideo = PlayingQueue.getCurrent() ?: return@setOnClickListener + ShareDialog( + id = currentVideo.url!!.toID(), + shareObjectType = ShareObjectType.VIDEO, + shareData = ShareData(currentVideo = currentVideo.title) + ).show(childFragmentManager, null) + } + // Listen for track changes due to autoplay or the notification PlayingQueue.addOnTrackChangedListener(onTrackChangeListener) binding.playPause.setOnClickListener { - if (!this::playerService.isInitialized) return@setOnClickListener - if (isPaused) playerService.play() else playerService.pause() + if (isPaused) playerService?.play() else playerService?.pause() } // load the stream info into the UI @@ -121,10 +140,8 @@ class AudioPlayerFragment : BaseFragment() { } private fun initializeSeekBar() { - if (!this::playerService.isInitialized) return - binding.timeBar.addOnChangeListener { _, value, fromUser -> - if (fromUser) playerService.seekToPosition(value.toLong() * 1000) + if (fromUser) playerService?.seekToPosition(value.toLong() * 1000) } updateSeekBar() } @@ -133,7 +150,7 @@ class AudioPlayerFragment : BaseFragment() { * Update the position, duration and text views belonging to the seek bar */ private fun updateSeekBar() { - val duration = playerService.getDuration()?.toFloat() ?: return + val duration = playerService?.getDuration()?.toFloat() ?: return // when the video is not loaded yet, retry in 100 ms if (duration <= 0) { @@ -142,7 +159,7 @@ class AudioPlayerFragment : BaseFragment() { } // get the current position from the player service - val currentPosition = playerService.getCurrentPosition()?.toFloat() ?: 0f + val currentPosition = playerService?.getCurrentPosition()?.toFloat() ?: 0f // set the text for the indicators binding.duration.text = DateUtils.formatElapsedTime((duration / 1000).toLong()) @@ -161,7 +178,7 @@ class AudioPlayerFragment : BaseFragment() { } private fun handleServiceConnection() { - playerService.onIsPlayingChanged = { isPlaying -> + playerService?.onIsPlayingChanged = { isPlaying -> binding.playPause.setIconResource( if (isPlaying) R.drawable.ic_pause else R.drawable.ic_play ) @@ -172,7 +189,7 @@ class AudioPlayerFragment : BaseFragment() { override fun onDestroy() { // unregister all listeners and the connected [playerService] - playerService.onIsPlayingChanged = null + playerService?.onIsPlayingChanged = null activity?.unbindService(connection) PlayingQueue.removeOnTrackChangedListener(onTrackChangeListener) diff --git a/app/src/main/java/com/github/libretube/ui/sheets/PlaybackSpeedSheet.kt b/app/src/main/java/com/github/libretube/ui/sheets/PlaybackOptionsSheet.kt similarity index 98% rename from app/src/main/java/com/github/libretube/ui/sheets/PlaybackSpeedSheet.kt rename to app/src/main/java/com/github/libretube/ui/sheets/PlaybackOptionsSheet.kt index 4bf141c9e..caaa79898 100644 --- a/app/src/main/java/com/github/libretube/ui/sheets/PlaybackSpeedSheet.kt +++ b/app/src/main/java/com/github/libretube/ui/sheets/PlaybackOptionsSheet.kt @@ -11,7 +11,7 @@ import com.github.libretube.util.PreferenceHelper import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.PlaybackParameters -class PlaybackSpeedSheet( +class PlaybackOptionsSheet( private val player: ExoPlayer ) : ExpandedBottomSheet() { private lateinit var binding: PlaybackBottomSheetBinding 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 dea2a587c..7784da8eb 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 @@ -30,7 +30,7 @@ import com.github.libretube.ui.interfaces.PlayerGestureOptions import com.github.libretube.ui.interfaces.PlayerOptions import com.github.libretube.ui.models.PlayerViewModel import com.github.libretube.ui.sheets.BaseBottomSheet -import com.github.libretube.ui.sheets.PlaybackSpeedSheet +import com.github.libretube.ui.sheets.PlaybackOptionsSheet import com.github.libretube.util.AudioHelper import com.github.libretube.util.BrightnessHelper import com.github.libretube.util.PlayerGestureController @@ -531,7 +531,7 @@ internal class CustomExoPlayerView( override fun onPlaybackSpeedClicked() { player?.let { - PlaybackSpeedSheet(it as ExoPlayer).show(supportFragmentManager) + PlaybackOptionsSheet(it as ExoPlayer).show(supportFragmentManager) } } diff --git a/app/src/main/res/drawable/ic_video.xml b/app/src/main/res/drawable/ic_video.xml new file mode 100644 index 000000000..154eca5b5 --- /dev/null +++ b/app/src/main/res/drawable/ic_video.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_audio_player.xml b/app/src/main/res/layout/fragment_audio_player.xml index 67ec3bd23..1ee209686 100644 --- a/app/src/main/res/layout/fragment_audio_player.xml +++ b/app/src/main/res/layout/fragment_audio_player.xml @@ -47,8 +47,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:textSize="18sp" - android:layout_marginTop="10dp" /> + android:layout_marginTop="10dp" + android:textSize="18sp" /> @@ -56,8 +56,8 @@ android:id="@+id/time_bar" android:layout_width="match_parent" android:layout_height="wrap_content" - app:labelBehavior="gone" - android:layout_marginHorizontal="20dp" /> + android:layout_marginHorizontal="20dp" + app:labelBehavior="gone" /> + tools:text="00:00" /> + tools:text="10:15" /> @@ -84,7 +84,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:layout_marginVertical="50dp"> + android:layout_marginVertical="36dp"> + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/style.xml b/app/src/main/res/values/style.xml index c12c90ca0..488986625 100644 --- a/app/src/main/res/values/style.xml +++ b/app/src/main/res/values/style.xml @@ -238,4 +238,12 @@ + + \ No newline at end of file