From f86ca78ea514268e4b9dac445742d697b06c0bdd Mon Sep 17 00:00:00 2001 From: Bnyro Date: Wed, 16 Nov 2022 10:31:48 +0100 Subject: [PATCH] refactor channel tabs --- .../com/github/libretube/obj/ChannelTabs.kt | 14 ++++ .../libretube/ui/fragments/ChannelFragment.kt | 69 ++++++++----------- 2 files changed, 44 insertions(+), 39 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/obj/ChannelTabs.kt diff --git a/app/src/main/java/com/github/libretube/obj/ChannelTabs.kt b/app/src/main/java/com/github/libretube/obj/ChannelTabs.kt new file mode 100644 index 000000000..9a7c91857 --- /dev/null +++ b/app/src/main/java/com/github/libretube/obj/ChannelTabs.kt @@ -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) +} diff --git a/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt index 567518f46..a9cb01a24 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt @@ -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?) { - 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) { + 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?) { - 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 }