package relax.offline.music.fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.gyf.immersionbar.ktx.immersionBar import relax.offline.music.databinding.FragmentMoHomeBinding import relax.offline.music.innertube.Innertube import relax.offline.music.innertube.models.MusicCarouselShelfRenderer import relax.offline.music.innertube.requests.homePage import relax.offline.music.innertube.requests.homePageMore import relax.offline.music.util.LogTag.LogD import relax.offline.music.view.MusicResponsiveListView import relax.offline.music.view.MusicTowRowListView import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.isActive import kotlinx.coroutines.selects.select class MoHomeFragment : MoBaseFragment() { private val requests: Channel = Channel(Channel.UNLIMITED) enum class Request { TryAgain, } override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> FragmentMoHomeBinding get() = FragmentMoHomeBinding::inflate override suspend fun onViewCreated() { initView() initData() onReceive() } private fun initImmersionBar() { immersionBar { statusBarDarkFont(false) statusBarView(binding.view) } } private suspend fun onReceive() { while (isActive) { select { requests.onReceive { when (it) { Request.TryAgain -> { initData() } } } events.onReceive { when (it) { Event.FragmentOnResume -> { fragmentOnResume() } } } } } } private fun initView() { binding.tryAgainBtn.setOnClickListener { requests.trySend(Request.TryAgain) } } private suspend fun initData() { showLoadingUi() Innertube.homePage(appStore.myVisitorData)?.onSuccess { showDataUi() if (it.homePage.isNotEmpty()) { for (home: Innertube.HomePage in it.homePage) { for (content: MusicCarouselShelfRenderer.Content in home.contents) { if (content.musicResponsiveListItemRenderer != null) { binding.contentLayout.addView( MusicResponsiveListView( requireActivity(), home ) ) break } if (content.musicTwoRowItemRenderer != null) { binding.contentLayout.addView( MusicTowRowListView( requireActivity(), home ) ) break } } } initHomeDataMore(it) } else { LogD(TAG, "homePage size 0") showNoContentUi() } }?.onFailure { showNoContentUi() LogD(TAG, "homePage onFailure->${it}") } } private suspend fun initHomeDataMore(baseHomePage: Innertube.BaseHomePage) { if (baseHomePage.cToken?.isNotEmpty() == true) { Innertube.homePageMore(baseHomePage)?.onSuccess { for (home: Innertube.HomePage in it.homePage) { for (content: MusicCarouselShelfRenderer.Content in home.contents) { if (content.musicResponsiveListItemRenderer != null) { val musicResponsiveListView = MusicResponsiveListView(requireActivity(), home) binding.contentLayout.addView(musicResponsiveListView) break } if (content.musicTwoRowItemRenderer != null) { binding.contentLayout.addView( MusicTowRowListView( requireActivity(), home ) ) break } } } initHomeDataMore(it) }?.onFailure { LogD(TAG, "initHomeDataMore onFailure ->${it}") } } } private fun fragmentOnResume(){ refreshAdapters() } private fun refreshAdapters() {//刷新home的单曲ui for (i in 0 until binding.contentLayout.childCount) { val child = binding.contentLayout.getChildAt(i) if (child is MusicResponsiveListView) { child.updateAdapter() } } } override fun onResume() { super.onResume() initImmersionBar() } override fun onHiddenChanged(hidden: Boolean) { super.onHiddenChanged(hidden) if (!hidden) { initImmersionBar() } } private fun showDataUi() { binding.loadingLayout.visibility = View.GONE binding.noContentLayout.visibility = View.GONE } private fun showLoadingUi() { binding.loadingLayout.visibility = View.VISIBLE binding.noContentLayout.visibility = View.GONE } private fun showNoContentUi() { binding.loadingLayout.visibility = View.GONE binding.noContentLayout.visibility = View.VISIBLE } }