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