Keyboard-Journey/app/src/main/java/com/keyboard/journey/HomeFragment.kt
2024-08-16 17:24:30 +08:00

250 lines
9.5 KiB
Kotlin

package com.keyboard.journey
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.gyf.immersionbar.ktx.immersionBar
import com.keyboard.journey.adapter.BannerImgAdapter
import com.keyboard.journey.adapter.MainDataAdapter
import com.keyboard.journey.bean.CategoryDataBean
import com.keyboard.journey.bean.MainDataBean
import com.keyboard.journey.databinding.JourneyActivityMainBinding
import com.keyboard.journey.util.NetworkCallback
import com.keyboard.journey.util.NetworkUtil
import com.keyboard.journey.util.getRandomInt
import com.youth.banner.listener.OnPageChangeListener
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withContext
import org.libpag.PAGFile
import kotlin.coroutines.resume
class HomeFragment : Fragment() {
private lateinit var binding: JourneyActivityMainBinding
private var imgList: MutableList<Int> = mutableListOf()
private var dataList: MutableList<MainDataBean> = mutableListOf()
private var mainAdapter: MainDataAdapter? = null
private var currentBannerType = 0
private lateinit var bannerStr0: String
private lateinit var bannerStr1: String
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
binding = JourneyActivityMainBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
bannerStr0 = getString(R.string.recommend)
bannerStr1 = getString(R.string.cool)
initBar()
initView()
initData()
}
override fun onResume() {
super.onResume()
initImmersionBar()
}
override fun onHiddenChanged(hidden: Boolean) {
super.onHiddenChanged(hidden)
if (!hidden) {
initImmersionBar()
}
}
private fun initImmersionBar() {
immersionBar {
statusBarDarkFont(true)
statusBarView(binding.view)
}
}
private suspend fun getFetchCategory(
key: String,
offset: Int,
pageSize: Int,
): CategoryDataBean? {
return try {
suspendCancellableCoroutine<CategoryDataBean> { continuation ->
NetworkUtil().fetchCategory(key,
offset,
pageSize,
object : NetworkCallback<List<CategoryDataBean>> {
override fun onSuccess(data: List<CategoryDataBean>) {
continuation.resume(data[0])
}
override fun onFailure(errorMessage: String) {
}
})
}
} catch (e: Exception) {
return null
}
}
@OptIn(DelicateCoroutinesApi::class)
private fun initData() {
loadingPlay()
binding.noDataLayout.visibility = View.GONE
NetworkUtil().fetchData(object : NetworkCallback<List<MainDataBean>> {
@SuppressLint("NotifyDataSetChanged")
override fun onSuccess(data: List<MainDataBean>) {
GlobalScope.launch(Dispatchers.IO) {
val jobs = data.map { bean ->
GlobalScope.async(Dispatchers.IO) {
val resultCategory = getFetchCategory(
bean.key, getRandomInt(1, 15),
getRandomInt(5, 16),
)
bean.items = resultCategory?.items!!
bean
}
}
val list = awaitAll(*jobs.toTypedArray())
withContext(Dispatchers.Main) {
dataList.clear()
dataList.addAll(list)
Log.d(JourneyApp.TAG, "--------------dataList=${dataList.size}")
mainAdapter?.notifyDataSetChanged()
loadingClose()
if (dataList.size > 0) {
binding.noDataLayout.visibility = View.GONE
} else {
binding.noDataLayout.visibility = View.VISIBLE
}
}
}
}
override fun onFailure(errorMessage: String) {
LogUtil.logMsgD(errorMessage)
binding.noDataLayout.visibility = View.VISIBLE
loadingClose()
}
})
}
private fun initBar() {
immersionBar {
statusBarDarkFont(true)
statusBarView(binding.view)
}
}
private fun initClick() {
binding.tryAgain.setOnClickListener {
initData()
}
binding.bannerBtn.setOnClickListener {
for (data in dataList) {
Log.d(JourneyApp.TAG, "---------- data=${data.title}")
}
val recommend = dataList.filter { it.title.contains("For You") }
val cool = dataList.filter { it.title.contains(bannerStr1) }
if (currentBannerType == 0) {
Log.d(JourneyApp.TAG, "----------0 recommend.size=${recommend.size}")
if (recommend.isNotEmpty()) {
val intent =
Intent(requireActivity(), JourneyCategoryDetailsActivity::class.java)
intent.putExtra(
JourneyCategoryDetailsActivity.CATEGORY_DETAILS_BEAN_KEY, recommend[0]
)
startActivity(intent)
}
} else if (currentBannerType == 1) {
Log.d(JourneyApp.TAG, "----------1 cool.size=${cool.size}")
if (cool.isNotEmpty()) {
val intent =
Intent(requireActivity(), JourneyCategoryDetailsActivity::class.java)
intent.putExtra(
JourneyCategoryDetailsActivity.CATEGORY_DETAILS_BEAN_KEY, cool[0]
)
startActivity(intent)
}
}
}
}
private fun initView() {
binding.rv.layoutManager = LinearLayoutManager(requireActivity())
mainAdapter = MainDataAdapter(requireActivity(), dataList)
binding.rv.adapter = mainAdapter
imgList.add(R.mipmap.recommend_top_banner_img)
imgList.add(R.mipmap.cool_top_banner_img)
val adapter = BannerImgAdapter(imgList)
binding.banner.setAdapter(adapter).addBannerLifecycleObserver(this) //添加生命周期观察者
binding.banner.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrolled(
position: Int, positionOffset: Float, positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
when (position) {
0 -> {
currentBannerType = 0
binding.indicatorLayout.setBackgroundColor(requireActivity().getColor(R.color.banner_indicator_one_bg))
binding.indicatorImg.setImageResource(R.mipmap.top_banner_one_img)
binding.indicatorTxt.text = bannerStr0
binding.indicatorGoBg.background = requireActivity().getDrawable(R.drawable.draw_go_bg)
binding.indicatorLineOneBg.setBackgroundColor(requireActivity().getColor(R.color.banner_indicator_one_go_bg_color))
binding.indicatorLineTowBg.setBackgroundColor(requireActivity().getColor(R.color.black_10))
}
1 -> {
currentBannerType = 1
binding.indicatorLayout.setBackgroundColor(requireActivity().getColor(R.color.banner_indicator_tow_bg))
binding.indicatorImg.setImageResource(R.mipmap.top_banner_tow_img)
binding.indicatorTxt.text = bannerStr1
binding.indicatorGoBg.background = requireActivity().getDrawable(R.drawable.draw_go_2_bg)
binding.indicatorLineOneBg.setBackgroundColor(requireActivity().getColor(R.color.black_10))
binding.indicatorLineTowBg.setBackgroundColor(requireActivity().getColor(R.color.banner_indicator_tow_go_bg_color))
}
}
}
override fun onPageScrollStateChanged(state: Int) {
}
})
initClick()
}
private fun loadingPlay() {
binding.loadingLayout.visibility = View.VISIBLE
binding.indicatorGoBg.visibility = View.GONE
val pagFile = PAGFile.Load(requireActivity().assets, "loading.pag")
binding.pagView.composition = pagFile
binding.pagView.setRepeatCount(0)
binding.pagView.play()
}
private fun loadingClose() {
binding.loadingLayout.visibility = View.GONE
binding.indicatorGoBg.visibility = View.VISIBLE
if (binding.pagView.isPlaying) {
binding.pagView.stop()
}
}
}