Merge pull request #1862 from Bnyro/master

refactor channel tabs
This commit is contained in:
Bnyro 2022-11-16 10:32:26 +01:00 committed by GitHub
commit 94158448d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 39 deletions

View File

@ -0,0 +1,14 @@
package com.github.libretube.obj
import androidx.annotation.IdRes
import com.github.libretube.R
sealed class ChannelTabs(
val identifierName: String,
@IdRes val chipId: Int
) {
object Playlists : ChannelTabs("playlists", R.id.playlists)
object Shorts : ChannelTabs("shorts", R.id.shorts)
object Livestreams : ChannelTabs("livestreams", R.id.livestreams)
object Channels : ChannelTabs("channels", R.id.channels)
}

View File

@ -6,6 +6,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.view.children
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.github.libretube.R
@ -18,6 +19,7 @@ import com.github.libretube.enums.ShareObjectType
import com.github.libretube.extensions.TAG
import com.github.libretube.extensions.formatShort
import com.github.libretube.extensions.toID
import com.github.libretube.obj.ChannelTabs
import com.github.libretube.obj.ShareData
import com.github.libretube.ui.adapters.SearchAdapter
import com.github.libretube.ui.adapters.VideosAdapter
@ -45,6 +47,13 @@ class ChannelFragment : BaseFragment() {
private val scope = CoroutineScope(Dispatchers.IO)
val possibleTabs = listOf(
ChannelTabs.Channels,
ChannelTabs.Playlists,
ChannelTabs.Livestreams,
ChannelTabs.Shorts
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
@ -180,59 +189,41 @@ class ChannelFragment : BaseFragment() {
binding.channelRecView.adapter = channelAdapter
}
setupTabs(response.tabs)
response.tabs?.let { setupTabs(it) }
}
}
private fun setupTabs(tabs: List<ChannelTab>?) {
tabs?.firstOrNull { it.name == "playlists" }?.let {
binding.playlists.visibility = View.VISIBLE
}
tabs?.firstOrNull { it.name == "channels" }?.let {
binding.channels.visibility = View.VISIBLE
}
tabs?.firstOrNull { it.name == "livestreams" }?.let {
binding.livestreams.visibility = View.VISIBLE
}
tabs?.firstOrNull { it.name == "shorts" }?.let {
binding.shorts.visibility = View.VISIBLE
private fun setupTabs(tabs: List<ChannelTab>) {
binding.tabChips.children.forEach { chip ->
val resourceTab = possibleTabs.firstOrNull { it.chipId == chip.id }
resourceTab?.let { resTab ->
if (tabs.any { it.name == resTab.identifierName }) chip.visibility = View.VISIBLE
}
}
binding.tabChips.setOnCheckedStateChangeListener { _, _ ->
reactToTabChange(tabs)
}
}
private fun reactToTabChange(tabs: List<ChannelTab>?) {
when (binding.tabChips.checkedChipId) {
binding.videos.id -> {
binding.channelRecView.adapter = channelAdapter
onScrollEnd = {
fetchChannelNextPage()
when (binding.tabChips.checkedChipId) {
binding.videos.id -> {
binding.channelRecView.adapter = channelAdapter
onScrollEnd = {
fetchChannelNextPage()
}
}
else -> {
possibleTabs.first { binding.tabChips.checkedChipId == it.chipId }.let {
val tab = tabs.first { tab -> tab.name == it.identifierName }
loadTab(tab)
}
}
}
binding.channels.id -> {
tabs?.first { it.name == "channels" }?.let { loadTab(it) }
}
binding.playlists.id -> {
tabs?.first { it.name == "playlists" }?.let { loadTab(it) }
}
binding.livestreams.id -> {
tabs?.first { it.name == "livestreams" }?.let { loadTab(it) }
}
binding.shorts.id -> {
tabs?.first { it.name == "shorts" }?.let { loadTab(it) }
}
}
}
private fun loadTab(tab: ChannelTab) {
scope.launch {
tab.data ?: return@launch
val response = try {
RetrofitInstance.api.getChannelTab(tab.data!!)
RetrofitInstance.api.getChannelTab(tab.data)
} catch (e: Exception) {
return@launch
}