feat: play all videos by group when long pressing group name

This commit is contained in:
Bnyro 2023-08-21 18:23:44 +02:00
parent 9fbf475b52
commit d9d735051d

View File

@ -25,6 +25,7 @@ import com.github.libretube.db.obj.SubscriptionGroup
import com.github.libretube.extensions.dpToPx import com.github.libretube.extensions.dpToPx
import com.github.libretube.extensions.formatShort import com.github.libretube.extensions.formatShort
import com.github.libretube.extensions.toID import com.github.libretube.extensions.toID
import com.github.libretube.helpers.NavigationHelper
import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.ui.adapters.LegacySubscriptionAdapter import com.github.libretube.ui.adapters.LegacySubscriptionAdapter
import com.github.libretube.ui.adapters.SubscriptionChannelAdapter import com.github.libretube.ui.adapters.SubscriptionChannelAdapter
@ -33,6 +34,7 @@ import com.github.libretube.ui.models.PlayerViewModel
import com.github.libretube.ui.models.SubscriptionsViewModel import com.github.libretube.ui.models.SubscriptionsViewModel
import com.github.libretube.ui.sheets.BaseBottomSheet import com.github.libretube.ui.sheets.BaseBottomSheet
import com.github.libretube.ui.sheets.ChannelGroupsSheet import com.github.libretube.ui.sheets.ChannelGroupsSheet
import com.github.libretube.util.PlayingQueue
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@ -177,6 +179,17 @@ class SubscriptionsFragment : Fragment() {
_binding = null _binding = null
} }
private fun playByGroup(groupIndex: Int) {
val streams = viewModel.videoFeed.value.orEmpty().filterByGroup(groupIndex)
if (streams.isEmpty()) return
PlayingQueue.clear()
PlayingQueue.add(*streams.toTypedArray())
val videoId = streams.first().url.orEmpty().toID()
NavigationHelper.navigateVideo(requireContext(), videoId = videoId, keepQueue = true)
}
@SuppressLint("InflateParams") @SuppressLint("InflateParams")
private suspend fun initChannelGroups() { private suspend fun initChannelGroups() {
channelGroups = DatabaseHolder.Database.subscriptionGroupsDao().getAll() channelGroups = DatabaseHolder.Database.subscriptionGroupsDao().getAll()
@ -184,16 +197,27 @@ class SubscriptionsFragment : Fragment() {
val binding = _binding ?: return val binding = _binding ?: return
binding.chipAll.isChecked = true binding.chipAll.isChecked = true
binding.channelGroups.removeAllViews() binding.chipAll.setOnLongClickListener {
playByGroup(0)
true
}
binding.channelGroups.removeAllViews()
binding.channelGroups.addView(binding.chipAll) binding.channelGroups.addView(binding.chipAll)
channelGroups = channelGroups.sortedBy { it.index } channelGroups = channelGroups.sortedBy { it.index }
channelGroups.forEach { group -> channelGroups.forEachIndexed { index, group ->
val chip = layoutInflater.inflate(R.layout.filter_chip, null) as Chip val chip = layoutInflater.inflate(R.layout.filter_chip, null) as Chip
chip.apply { chip.apply {
id = View.generateViewId() id = View.generateViewId()
isCheckable = true isCheckable = true
text = group.name text = group.name
setOnLongClickListener {
// the index must be increased by one to skip the "all channels" group button
playByGroup(index + 1)
true
}
} }
binding.channelGroups.addView(chip) binding.channelGroups.addView(chip)
@ -211,21 +235,22 @@ class SubscriptionsFragment : Fragment() {
} }
} }
private fun List<StreamItem>.filterByGroup(groupIndex: Int): List<StreamItem> {
if (groupIndex == 0) return this
val group = channelGroups.getOrNull(selectedFilterGroup - 1)
return filter {
val channelId = it.uploaderUrl.orEmpty().toID()
group?.channels?.contains(channelId) != false
}
}
private fun showFeed() { private fun showFeed() {
val videoFeed = viewModel.videoFeed.value ?: return val videoFeed = viewModel.videoFeed.value ?: return
binding.subRefresh.isRefreshing = false binding.subRefresh.isRefreshing = false
val feed = videoFeed val feed = videoFeed
.filter { streamItem -> .filterByGroup(selectedFilterGroup)
// filter for selected channel groups
if (selectedFilterGroup == 0) {
true
} else {
val channelId = streamItem.uploaderUrl.orEmpty().toID()
val group = channelGroups.getOrNull(selectedFilterGroup - 1)
group?.channels?.contains(channelId) != false
}
}
.filter { .filter {
// apply the selected filter // apply the selected filter
val isLive = (it.duration ?: -1L) < 0L val isLive = (it.duration ?: -1L) < 0L