From ed48f0ca4911648cfcc1a5df32485db8aef82f4f Mon Sep 17 00:00:00 2001 From: Bnyro Date: Wed, 17 Jan 2024 17:45:30 +0100 Subject: [PATCH] feat: option to shuffle downloads in background --- .../libretube/helpers/BackgroundHelper.kt | 15 ++++++++++++++ .../services/OfflinePlayerService.kt | 20 +++++++++++++++---- .../ui/fragments/DownloadsFragment.kt | 8 ++++++++ .../ui/sheets/DownloadOptionsBottomSheet.kt | 6 ++---- .../main/res/layout/fragment_downloads.xml | 12 +++++++++++ 5 files changed, 53 insertions(+), 8 deletions(-) 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 01015e65a..cfbf75c95 100644 --- a/app/src/main/java/com/github/libretube/helpers/BackgroundHelper.kt +++ b/app/src/main/java/com/github/libretube/helpers/BackgroundHelper.kt @@ -8,6 +8,7 @@ import androidx.core.content.getSystemService import androidx.fragment.app.commit 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.PlayerFragment @@ -71,4 +72,18 @@ object BackgroundHelper { return context.getSystemService()!!.getRunningServices(Int.MAX_VALUE) .any { serviceClass.name == it.service.className } } + + /** + * Start the offline background player + * + * @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?) { + val playerIntent = Intent(context, OfflinePlayerService::class.java) + .putExtra(IntentData.videoId, videoId) + + context.stopService(playerIntent) + 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 c42a1d6fa..dff8dbeeb 100644 --- a/app/src/main/java/com/github/libretube/services/OfflinePlayerService.kt +++ b/app/src/main/java/com/github/libretube/services/OfflinePlayerService.kt @@ -67,18 +67,30 @@ class OfflinePlayerService : LifecycleService() { } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - videoId = intent?.getStringExtra(IntentData.videoId)!! - lifecycleScope.launch { downloadsWithItems = withContext(Dispatchers.IO) { DatabaseHolder.Database.downloadDao().getAll() } - val downloadWithItems = downloadsWithItems.first { it.download.videoId == videoId } + if (downloadsWithItems.isEmpty()) { + onDestroy() + return@launch + } + + val videoId = intent?.getStringExtra(IntentData.videoId) + + val downloadToPlay = if (videoId == null) { + downloadsWithItems = downloadsWithItems.shuffled() + downloadsWithItems.first() + } else { + downloadsWithItems.first { it.download.videoId == videoId } + } + + this@OfflinePlayerService.videoId = downloadToPlay.download.videoId createPlayerAndNotification() // destroy the service if there was no success playing the selected audio/video - if (!startAudioPlayer(downloadWithItems)) onDestroy() + if (!startAudioPlayer(downloadToPlay)) onDestroy() } return super.onStartCommand(intent, flags, startId) 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 57010b820..fd50865ca 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 @@ -9,6 +9,7 @@ import android.os.IBinder import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope @@ -16,15 +17,18 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import com.github.libretube.R +import com.github.libretube.constants.IntentData import com.github.libretube.databinding.FragmentDownloadsBinding import com.github.libretube.db.DatabaseHolder.Database import com.github.libretube.db.obj.DownloadWithItems import com.github.libretube.extensions.ceilHalf import com.github.libretube.extensions.formatAsFileSize +import com.github.libretube.helpers.BackgroundHelper import com.github.libretube.helpers.DownloadHelper import com.github.libretube.obj.DownloadStatus import com.github.libretube.receivers.DownloadReceiver import com.github.libretube.services.DownloadService +import com.github.libretube.services.OfflinePlayerService import com.github.libretube.ui.adapters.DownloadsAdapter import com.github.libretube.ui.base.DynamicLayoutManagerFragment import com.github.libretube.ui.viewholders.DownloadsViewHolder @@ -150,6 +154,10 @@ class DownloadsFragment : DynamicLayoutManagerFragment() { } } ) + + binding.shuffleBackground.setOnClickListener { + BackgroundHelper.playOnBackgroundOffline(requireContext(), null) + } } override fun onStart() { 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 3294a747b..edcfbcc0c 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 @@ -8,6 +8,7 @@ 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.helpers.BackgroundHelper import com.github.libretube.helpers.NavigationHelper import com.github.libretube.obj.ShareData import com.github.libretube.services.OfflinePlayerService @@ -27,10 +28,7 @@ class DownloadOptionsBottomSheet : BaseBottomSheet() { setSimpleItems(options.map { getString(it) }) { which -> when (options[which]) { R.string.playOnBackground -> { - val playerIntent = Intent(requireContext(), OfflinePlayerService::class.java) - .putExtra(IntentData.videoId, videoId) - context?.stopService(playerIntent) - ContextCompat.startForegroundService(requireContext(), playerIntent) + BackgroundHelper.playOnBackgroundOffline(requireContext(), videoId) } R.string.go_to_video -> { diff --git a/app/src/main/res/layout/fragment_downloads.xml b/app/src/main/res/layout/fragment_downloads.xml index cb921bf70..6e475edbf 100644 --- a/app/src/main/res/layout/fragment_downloads.xml +++ b/app/src/main/res/layout/fragment_downloads.xml @@ -1,5 +1,6 @@ @@ -33,4 +34,15 @@ android:layout_height="wrap_content" android:visibility="gone" /> + + \ No newline at end of file