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..9190e8402 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 @@ -12,14 +12,20 @@ import android.text.format.DateUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.navigation.fragment.findNavController 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.BackgroundHelper import com.github.libretube.util.ImageHelper import com.github.libretube.util.NavigationHelper import com.github.libretube.util.PlayingQueue @@ -32,7 +38,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 +92,42 @@ 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.openVideo.setOnClickListener { + NavigationHelper.navigateVideo( + context = requireContext(), + videoId = PlayingQueue.getCurrent()?.url?.toID(), + keepQueue = true, + forceVideo = true + ) + BackgroundHelper.stopBackgroundPlay(requireContext()) + findNavController().popBackStack() + } + + 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 +153,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 +163,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 +172,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 +191,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 +202,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/java/com/github/libretube/util/NavigationHelper.kt b/app/src/main/java/com/github/libretube/util/NavigationHelper.kt index ef8f30cd3..44e659d42 100644 --- a/app/src/main/java/com/github/libretube/util/NavigationHelper.kt +++ b/app/src/main/java/com/github/libretube/util/NavigationHelper.kt @@ -60,11 +60,12 @@ object NavigationHelper { playlistId: String? = null, channelId: String? = null, keepQueue: Boolean = false, - timeStamp: Long? = null + timeStamp: Long? = null, + forceVideo: Boolean = false ) { if (videoId == null) return - if (PreferenceHelper.getBoolean(PreferenceKeys.AUDIO_ONLY_MODE, false)) { + if (PreferenceHelper.getBoolean(PreferenceKeys.AUDIO_ONLY_MODE, false) && !forceVideo) { BackgroundHelper.stopBackgroundPlay(context) BackgroundHelper.playOnBackground( context, 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..d8424bad1 --- /dev/null +++ b/app/src/main/res/drawable/ic_video.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_audio_player.xml b/app/src/main/res/layout/fragment_audio_player.xml index 67ec3bd23..e88be5878 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,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:layout_marginVertical="50dp"> + android:layout_marginTop="24dp" + android:layout_marginBottom="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