mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-29 00:10:32 +05:30
feat: play all videos by group when long pressing group name
This commit is contained in:
parent
9fbf475b52
commit
d9d735051d
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user