From 632f4d6df49484e99f2f943315b24b824576214d Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sun, 6 Nov 2022 11:50:04 +0100 Subject: [PATCH] allow clicking queue items --- .../libretube/services/BackgroundMode.kt | 9 +++++++-- .../ui/adapters/PlayingQueueAdapter.kt | 9 ++++++++- .../libretube/ui/fragments/PlayerFragment.kt | 13 +++++++++--- .../com/github/libretube/util/PlayingQueue.kt | 20 +++++++++++++++++++ .../main/res/layout/queue_bottom_sheet.xml | 1 - 5 files changed, 45 insertions(+), 7 deletions(-) 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 c6bfdc6ae..0d26ffc45 100644 --- a/app/src/main/java/com/github/libretube/services/BackgroundMode.kt +++ b/app/src/main/java/com/github/libretube/services/BackgroundMode.kt @@ -24,6 +24,7 @@ import com.github.libretube.constants.PreferenceKeys import com.github.libretube.db.DatabaseHelper import com.github.libretube.db.DatabaseHolder import com.github.libretube.extensions.awaitQuery +import com.github.libretube.extensions.toID import com.github.libretube.extensions.toStreamItem import com.github.libretube.util.NowPlayingNotification import com.github.libretube.util.PlayerHelper @@ -124,6 +125,10 @@ class BackgroundMode : Service() { // play the audio in the background loadAudio(videoId, position) + PlayingQueue.setOnQueueTapListener { streamItem -> + streamItem.url?.toID()?.let { playNextVideo(it) } + } + updateWatchPosition() } catch (e: Exception) { onDestroy() @@ -264,8 +269,8 @@ class BackgroundMode : Service() { /** * Plays the first related video to the current (used when the playback of the current video ended) */ - private fun playNextVideo() { - val nextVideo = PlayingQueue.getNext() + private fun playNextVideo(nextId: String? = null) { + val nextVideo = nextId ?: PlayingQueue.getNext() // play new video on background if (nextVideo != null) { diff --git a/app/src/main/java/com/github/libretube/ui/adapters/PlayingQueueAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/PlayingQueueAdapter.kt index 2ff4020a6..20ff28c2c 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/PlayingQueueAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/PlayingQueueAdapter.kt @@ -13,7 +13,6 @@ import com.github.libretube.util.PlayingQueue import com.github.libretube.util.ThemeHelper class PlayingQueueAdapter : RecyclerView.Adapter() { - private val currentIndex = PlayingQueue.currentIndex() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PlayingQueueViewHolder { val binding = QueueRowBinding.inflate( @@ -37,6 +36,7 @@ class PlayingQueueAdapter : RecyclerView.Adapter() { videoInfo.text = streamItem.uploaderName + " • " + DateUtils.formatElapsedTime(streamItem.duration ?: 0) + val currentIndex = PlayingQueue.currentIndex() root.setBackgroundColor( if (currentIndex == position) { ThemeHelper.getThemeColor(root.context, android.R.attr.colorControlHighlight) @@ -44,6 +44,13 @@ class PlayingQueueAdapter : RecyclerView.Adapter() { Color.TRANSPARENT } ) + + root.setOnClickListener { + val oldIndex = PlayingQueue.currentIndex() + PlayingQueue.onQueueItemSelected(position) + notifyItemChanged(oldIndex) + notifyItemChanged(position) + } } } } 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 9e80f611d..3e8c61ec1 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 @@ -503,6 +503,7 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { try { // clear the playing queue PlayingQueue.clear() + PlayingQueue.removeOnQueueTapListener() saveWatchPosition() nowPlayingNotification.destroySelfAndPlayer() @@ -602,6 +603,10 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { PlayingQueue.updateCurrent(streams.toStreamItem(videoId!!)) } + PlayingQueue.setOnQueueTapListener { streamItem -> + streamItem.url?.toID()?.let { playNextVideo(it) } + } + runOnUiThread { // hide the button to skip SponsorBlock segments manually binding.sbSkipBtn.visibility = View.GONE @@ -702,8 +707,8 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { } // used for autoplay and skipping to next video - private fun playNextVideo() { - val nextVideoId = PlayingQueue.getNext() + private fun playNextVideo(nextId: String? = null) { + val nextVideoId = nextId ?: PlayingQueue.getNext() // by making sure that the next and the current video aren't the same saveWatchPosition() @@ -987,7 +992,9 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { binding.chaptersRecView.adapter = ChaptersAdapter(chapters, exoPlayer) // enable the chapters dialog in the player - val titles = chapters.map { "${it.title} (${it.start?.let { DateUtils.formatElapsedTime(it) }})" } + val titles = chapters.map { chapter -> + "${chapter.title} (${chapter.start?.let { DateUtils.formatElapsedTime(it) }})" + } playerBinding.chapterLL.setOnClickListener { if (viewModel.isFullscreen.value!!) { MaterialAlertDialogBuilder(requireContext()) diff --git a/app/src/main/java/com/github/libretube/util/PlayingQueue.kt b/app/src/main/java/com/github/libretube/util/PlayingQueue.kt index 18d60b7d4..28c502e60 100644 --- a/app/src/main/java/com/github/libretube/util/PlayingQueue.kt +++ b/app/src/main/java/com/github/libretube/util/PlayingQueue.kt @@ -1,5 +1,6 @@ package com.github.libretube.util +import android.util.Log import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.obj.StreamItem import com.github.libretube.extensions.move @@ -11,6 +12,7 @@ import kotlinx.coroutines.launch object PlayingQueue { private val queue = mutableListOf() private var currentStream: StreamItem? = null + private var onQueueTapListener: (StreamItem) -> Unit = {} fun add(vararg streamItem: StreamItem) { streamItem.forEach { @@ -116,4 +118,22 @@ object PlayingQueue { } } } + + fun onQueueItemSelected(index: Int) { + try { + val streamItem = queue[index] + updateCurrent(streamItem) + onQueueTapListener.invoke(streamItem) + } catch (e: Exception) { + Log.e("Queue on tap", "lifecycle already ended") + } + } + + fun setOnQueueTapListener(listener: (StreamItem) -> Unit) { + onQueueTapListener = listener + } + + fun removeOnQueueTapListener() { + onQueueTapListener = {} + } } diff --git a/app/src/main/res/layout/queue_bottom_sheet.xml b/app/src/main/res/layout/queue_bottom_sheet.xml index aeeb9863c..e5671da4c 100644 --- a/app/src/main/res/layout/queue_bottom_sheet.xml +++ b/app/src/main/res/layout/queue_bottom_sheet.xml @@ -51,7 +51,6 @@ android:layout_gravity="center" android:layout_marginHorizontal="10dp" android:layout_weight="1" - android:rotation="180" android:src="@drawable/ic_arrow_down" />