From 56330118a6457cd96979798bcc5e213a6ff294f4 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sun, 6 Oct 2024 16:12:52 +0200 Subject: [PATCH] fix: only add downloads of same type (audio/video) to queue --- .../github/libretube/constants/IntentData.kt | 1 + .../libretube/db/obj/DownloadWithItems.kt | 14 +++++++++++++ .../libretube/helpers/BackgroundHelper.kt | 4 +++- .../services/OfflinePlayerService.kt | 8 ++++++-- .../ui/activities/OfflinePlayerActivity.kt | 4 +++- .../libretube/ui/adapters/DownloadsAdapter.kt | 10 +++------- .../ui/fragments/AudioPlayerFragment.kt | 2 -- .../ui/fragments/DownloadsFragment.kt | 20 +++++-------------- .../ui/sheets/DownloadOptionsBottomSheet.kt | 5 ++++- 9 files changed, 39 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/github/libretube/constants/IntentData.kt b/app/src/main/java/com/github/libretube/constants/IntentData.kt index 6e81ff13a..24626b00e 100644 --- a/app/src/main/java/com/github/libretube/constants/IntentData.kt +++ b/app/src/main/java/com/github/libretube/constants/IntentData.kt @@ -49,4 +49,5 @@ object IntentData { const val nextPage = "nextPage" const val videoInfo = "videoInfo" const val offlinePlayer = "offlinePlayer" + const val downloadTab = "downloadTab" } diff --git a/app/src/main/java/com/github/libretube/db/obj/DownloadWithItems.kt b/app/src/main/java/com/github/libretube/db/obj/DownloadWithItems.kt index 9031b60dd..ae390b7ea 100644 --- a/app/src/main/java/com/github/libretube/db/obj/DownloadWithItems.kt +++ b/app/src/main/java/com/github/libretube/db/obj/DownloadWithItems.kt @@ -2,6 +2,8 @@ package com.github.libretube.db.obj import androidx.room.Embedded import androidx.room.Relation +import com.github.libretube.enums.FileType +import com.github.libretube.ui.fragments.DownloadTab data class DownloadWithItems( @Embedded val download: Download, @@ -16,3 +18,15 @@ data class DownloadWithItems( ) val downloadChapters: List = emptyList() ) + +fun List.filterByTab(tab: DownloadTab) = filter { dl -> + when (tab) { + DownloadTab.AUDIO -> { + dl.downloadItems.any { it.type == FileType.AUDIO } && dl.downloadItems.none { it.type == FileType.VIDEO } + } + + DownloadTab.VIDEO -> { + dl.downloadItems.any { it.type == FileType.VIDEO } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/helpers/BackgroundHelper.kt b/app/src/main/java/com/github/libretube/helpers/BackgroundHelper.kt index 667d2ee8d..9c9a862d7 100644 --- a/app/src/main/java/com/github/libretube/helpers/BackgroundHelper.kt +++ b/app/src/main/java/com/github/libretube/helpers/BackgroundHelper.kt @@ -10,6 +10,7 @@ import com.github.libretube.constants.IntentData import com.github.libretube.parcelable.PlayerData import com.github.libretube.services.OfflinePlayerService import com.github.libretube.services.OnlinePlayerService +import com.github.libretube.ui.fragments.DownloadTab import com.github.libretube.ui.fragments.PlayerFragment /** @@ -75,11 +76,12 @@ object BackgroundHelper { * @param context the current context * @param videoId the videoId of the video or null if all available downloads should be shuffled */ - fun playOnBackgroundOffline(context: Context, videoId: String?) { + fun playOnBackgroundOffline(context: Context, videoId: String?, downloadTab: DownloadTab) { stopBackgroundPlay(context) val playerIntent = Intent(context, OfflinePlayerService::class.java) .putExtra(IntentData.videoId, videoId) + .putExtra(IntentData.downloadTab, downloadTab) ContextCompat.startForegroundService(context, playerIntent) } diff --git a/app/src/main/java/com/github/libretube/services/OfflinePlayerService.kt b/app/src/main/java/com/github/libretube/services/OfflinePlayerService.kt index 68472e07f..91003c5e5 100644 --- a/app/src/main/java/com/github/libretube/services/OfflinePlayerService.kt +++ b/app/src/main/java/com/github/libretube/services/OfflinePlayerService.kt @@ -1,7 +1,6 @@ package com.github.libretube.services import android.content.Intent -import android.util.Log import androidx.lifecycle.lifecycleScope import androidx.media3.common.MediaItem import androidx.media3.common.Player @@ -11,11 +10,14 @@ import com.github.libretube.constants.IntentData import com.github.libretube.db.DatabaseHolder.Database import com.github.libretube.db.obj.DownloadChapter import com.github.libretube.db.obj.DownloadWithItems +import com.github.libretube.db.obj.filterByTab import com.github.libretube.enums.FileType +import com.github.libretube.extensions.serializableExtra import com.github.libretube.extensions.toAndroidUri import com.github.libretube.extensions.toID import com.github.libretube.helpers.PlayerHelper import com.github.libretube.obj.PlayerNotificationData +import com.github.libretube.ui.fragments.DownloadTab import com.github.libretube.util.PlayingQueue import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -28,9 +30,11 @@ import kotlin.io.path.exists @UnstableApi class OfflinePlayerService : AbstractPlayerService() { private var downloadWithItems: DownloadWithItems? = null + private lateinit var downloadTab: DownloadTab override suspend fun onServiceCreated(intent: Intent) { videoId = intent.getStringExtra(IntentData.videoId) ?: return + downloadTab = intent.serializableExtra(IntentData.downloadTab)!! PlayingQueue.clear() @@ -88,7 +92,7 @@ class OfflinePlayerService : AbstractPlayerService() { private suspend fun fillQueue() { val downloads = withContext(Dispatchers.IO) { Database.downloadDao().getAll() - } + }.filterByTab(downloadTab) PlayingQueue.insertRelatedStreams(downloads.map { it.download.toStreamItem() }) } diff --git a/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt b/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt index 0d9835709..4e51f5cc7 100644 --- a/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt +++ b/app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt @@ -32,6 +32,7 @@ import com.github.libretube.databinding.ActivityOfflinePlayerBinding import com.github.libretube.databinding.ExoStyledPlayerControlViewBinding import com.github.libretube.db.DatabaseHolder.Database import com.github.libretube.db.obj.DownloadChapter +import com.github.libretube.db.obj.filterByTab import com.github.libretube.enums.FileType import com.github.libretube.enums.PlayerEvent import com.github.libretube.extensions.serializableExtra @@ -41,6 +42,7 @@ import com.github.libretube.helpers.PlayerHelper import com.github.libretube.helpers.WindowHelper import com.github.libretube.obj.PlayerNotificationData import com.github.libretube.ui.base.BaseActivity +import com.github.libretube.ui.fragments.DownloadTab import com.github.libretube.ui.interfaces.TimeFrameReceiver import com.github.libretube.ui.listeners.SeekbarPreviewListener import com.github.libretube.ui.models.ChaptersViewModel @@ -324,7 +326,7 @@ class OfflinePlayerActivity : BaseActivity() { private suspend fun fillQueue() { val downloads = withContext(Dispatchers.IO) { Database.downloadDao().getAll() - } + }.filterByTab(DownloadTab.VIDEO) PlayingQueue.insertRelatedStreams(downloads.map { it.download.toStreamItem() }) } diff --git a/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt index 7d3fff2e4..dbe718a90 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt @@ -3,13 +3,10 @@ package com.github.libretube.ui.adapters import android.annotation.SuppressLint import android.content.Context import android.content.Intent -import android.os.Handler -import android.os.Looper import android.text.format.DateUtils import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.os.bundleOf -import androidx.core.os.postDelayed import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView @@ -42,8 +39,6 @@ class DownloadsAdapter( private val downloads: MutableList, private val toggleDownload: (DownloadWithItems) -> Boolean ) : RecyclerView.Adapter() { - private val handler = Handler(Looper.getMainLooper()) - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DownloadsViewHolder { val binding = DownloadedMediaRowBinding.inflate( LayoutInflater.from(parent.context), @@ -112,7 +107,7 @@ class DownloadsAdapter( intent.putExtra(IntentData.videoId, download.videoId) root.context.startActivity(intent) } else { - BackgroundHelper.playOnBackgroundOffline(root.context, download.videoId) + BackgroundHelper.playOnBackgroundOffline(root.context, download.videoId, downloadTab) NavigationHelper.startAudioPlayer(root.context, offlinePlayer = true) } } @@ -130,7 +125,8 @@ class DownloadsAdapter( .apply { arguments = bundleOf( IntentData.videoId to download.videoId, - IntentData.channelName to download.uploader + IntentData.channelName to download.uploader, + IntentData.downloadTab to downloadTab ) } .show(fragmentManager) 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 270d8a165..dbfb6a4dd 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 @@ -10,7 +10,6 @@ import android.os.Handler import android.os.IBinder import android.os.Looper import android.text.format.DateUtils -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -99,7 +98,6 @@ class AudioPlayerFragment : Fragment(), AudioPlayerOptions { val serviceClass = if (isOffline) OfflinePlayerService::class.java else OnlinePlayerService::class.java - Log.e("class", serviceClass.name.toString()) Intent(activity, serviceClass).also { intent -> activity?.bindService(intent, connection, 0) } diff --git a/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt index cd18db8a8..e42e0d69b 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt @@ -27,7 +27,7 @@ import com.github.libretube.databinding.FragmentDownloadContentBinding import com.github.libretube.databinding.FragmentDownloadsBinding import com.github.libretube.db.DatabaseHolder.Database import com.github.libretube.db.obj.DownloadWithItems -import com.github.libretube.enums.FileType +import com.github.libretube.db.obj.filterByTab import com.github.libretube.extensions.ceilHalf import com.github.libretube.extensions.formatAsFileSize import com.github.libretube.extensions.serializable @@ -111,7 +111,7 @@ class DownloadsFragmentPage : DynamicLayoutManagerFragment() { private var binder: DownloadService.LocalBinder? = null private val downloads = mutableListOf() private val downloadReceiver = DownloadReceiver() - private lateinit var downloadTabSelf: DownloadTab + private lateinit var downloadTab: DownloadTab private val serviceConnection = object : ServiceConnection { var isBound = false @@ -137,7 +137,7 @@ class DownloadsFragmentPage : DynamicLayoutManagerFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.downloadTabSelf = requireArguments().serializable(IntentData.currentPosition)!! + this.downloadTab = requireArguments().serializable(IntentData.currentPosition)!! } override fun onCreateView( @@ -181,23 +181,13 @@ class DownloadsFragmentPage : DynamicLayoutManagerFragment() { } downloads.clear() - downloads.addAll(dbDownloads.filter { dl -> - when (downloadTabSelf) { - DownloadTab.AUDIO -> { - dl.downloadItems.any { it.type == FileType.AUDIO } && dl.downloadItems.none { it.type == FileType.VIDEO } - } - - DownloadTab.VIDEO -> { - dl.downloadItems.any { it.type == FileType.VIDEO } - } - } - }) + downloads.addAll(dbDownloads.filterByTab(downloadTab)) if (downloads.isEmpty()) return@launch sortDownloadList(selectedSortType) - adapter = DownloadsAdapter(requireContext(), downloadTabSelf, downloads) { + adapter = DownloadsAdapter(requireContext(), downloadTab, downloads) { var isDownloading = false val ids = it.downloadItems .filter { item -> item.path.fileSize() < item.downloadSize } diff --git a/app/src/main/java/com/github/libretube/ui/sheets/DownloadOptionsBottomSheet.kt b/app/src/main/java/com/github/libretube/ui/sheets/DownloadOptionsBottomSheet.kt index 66095580f..b61bbfe65 100644 --- a/app/src/main/java/com/github/libretube/ui/sheets/DownloadOptionsBottomSheet.kt +++ b/app/src/main/java/com/github/libretube/ui/sheets/DownloadOptionsBottomSheet.kt @@ -6,14 +6,17 @@ import androidx.fragment.app.setFragmentResult import com.github.libretube.R import com.github.libretube.constants.IntentData import com.github.libretube.enums.ShareObjectType +import com.github.libretube.extensions.serializable import com.github.libretube.helpers.BackgroundHelper import com.github.libretube.helpers.NavigationHelper import com.github.libretube.obj.ShareData import com.github.libretube.ui.dialogs.ShareDialog +import com.github.libretube.ui.fragments.DownloadTab class DownloadOptionsBottomSheet : BaseBottomSheet() { override fun onCreate(savedInstanceState: Bundle?) { val videoId = arguments?.getString(IntentData.videoId)!! + val downloadTab = arguments?.serializable(IntentData.downloadTab)!! val options = listOf( R.string.playOnBackground, @@ -25,7 +28,7 @@ class DownloadOptionsBottomSheet : BaseBottomSheet() { setSimpleItems(options.map { getString(it) }) { which -> when (options[which]) { R.string.playOnBackground -> { - BackgroundHelper.playOnBackgroundOffline(requireContext(), videoId) + BackgroundHelper.playOnBackgroundOffline(requireContext(), videoId, downloadTab) } R.string.go_to_video -> {