my-tv/app/src/main/java/com/lizongying/mytv/MainFragment.kt

285 lines
8.5 KiB
Kotlin
Raw Normal View History

2023-12-04 19:36:29 +08:00
package com.lizongying.mytv
2023-12-15 13:04:32 +08:00
import android.content.Context
import android.content.SharedPreferences
2023-12-04 19:36:29 +08:00
import android.os.Bundle
import android.util.Log
2023-12-15 13:04:32 +08:00
import android.widget.Toast
2023-12-04 19:36:29 +08:00
import androidx.core.content.ContextCompat
import androidx.leanback.app.BrowseSupportFragment
import androidx.leanback.widget.ArrayObjectAdapter
import androidx.leanback.widget.HeaderItem
import androidx.leanback.widget.ListRow
import androidx.leanback.widget.ListRowPresenter
import androidx.leanback.widget.ListRowPresenter.SelectItemViewHolderTask
import androidx.leanback.widget.OnItemViewClickedListener
import androidx.leanback.widget.OnItemViewSelectedListener
import androidx.leanback.widget.Presenter
import androidx.leanback.widget.Row
import androidx.leanback.widget.RowPresenter
import androidx.lifecycle.lifecycleScope
2023-12-15 13:04:32 +08:00
import com.lizongying.mytv.models.TVListViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
2023-12-04 19:36:29 +08:00
class MainFragment : BrowseSupportFragment() {
var itemPosition: Int = 0
private val list2: MutableList<Info> = mutableListOf()
2023-12-15 13:04:32 +08:00
private var request: Request? = null
private var rowsAdapter: ArrayObjectAdapter? = null
private var tvListViewModel = TVListViewModel()
private var sharedPref: SharedPreferences? = null
2023-12-04 19:36:29 +08:00
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
2023-12-15 13:04:32 +08:00
sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)
2023-12-04 19:36:29 +08:00
setupUIElements()
2023-12-15 13:04:32 +08:00
request = activity?.let { Request(it) }
2023-12-04 19:36:29 +08:00
loadRows()
setupEventListeners()
2023-12-15 13:04:32 +08:00
view?.post {
2023-12-15 18:12:11 +08:00
// request?.fetchPage()
2023-12-15 13:04:32 +08:00
}
tvListViewModel.getListLiveData().value?.forEach { tvViewModel ->
tvViewModel.videoUrl.observe(viewLifecycleOwner) { _ ->
2023-12-15 18:12:11 +08:00
// Log.i(TAG, "tv ${tvViewModel.getTV()}")
2023-12-15 13:04:32 +08:00
if (tvViewModel.updateByYSP()) {
val tv = tvViewModel.getTV()
if (tv.id == itemPosition) {
(activity as? MainActivity)?.play(tv)
// (activity as? MainActivity)?.switchInfoFragment(tv)
}
}
}
}
2023-12-04 19:36:29 +08:00
}
private fun setupUIElements() {
brandColor = ContextCompat.getColor(context!!, R.color.fastlane_background)
// headersState = HEADERS_DISABLED
}
2023-12-15 13:04:32 +08:00
private fun updateRows(tv: TV) {
// 获取适配器中的数据
val dataList = rowsAdapter?.replace(tv.id, tv)
//
//// 修改数据
//// 这里假设 dataList 是一个可变的列表
// dataList[position] = updatedData
//
//// 刷新适配器
// rowsAdapter.notifyItemChanged(position)
// rowsAdapter.notifyItemRangeChanged()
}
2023-12-06 23:51:17 +08:00
2023-12-04 19:36:29 +08:00
private fun loadRows() {
val list = TVList.list
2023-12-15 13:04:32 +08:00
rowsAdapter = ArrayObjectAdapter(ListRowPresenter())
2023-12-04 19:36:29 +08:00
val cardPresenter = CardPresenter(lifecycleScope)
var idx: Long = 0
for ((k, v) in list) {
val listRowAdapter = ArrayObjectAdapter(cardPresenter)
2023-12-06 23:51:17 +08:00
var idx2 = 0
2023-12-15 13:04:32 +08:00
for ((_, v1) in v) {
2023-12-06 23:51:17 +08:00
list2.add(
Info(
2023-12-15 13:04:32 +08:00
idx.toInt(), idx2, v1
2023-12-06 23:51:17 +08:00
)
)
2023-12-15 13:04:32 +08:00
listRowAdapter.add(v1)
2023-12-06 23:51:17 +08:00
idx2++
2023-12-15 13:04:32 +08:00
tvListViewModel.addTV(v1)
2023-12-04 19:36:29 +08:00
}
val header = HeaderItem(idx, k)
2023-12-15 13:04:32 +08:00
rowsAdapter!!.add(ListRow(header, listRowAdapter))
2023-12-04 19:36:29 +08:00
idx++
}
adapter = rowsAdapter
2023-12-15 13:04:32 +08:00
itemPosition = sharedPref?.getInt("position", 0)!!
val tvModel = tvListViewModel.getTVModel(itemPosition)
if (tvModel?.ysp() != null) {
lifecycleScope.launch(Dispatchers.IO) {
tvModel.let { request?.fetchData(it) }
}
} else {
(activity as? MainActivity)?.play(list2[itemPosition].item)
// (activity as? MainActivity)?.switchInfoFragment(list2[itemPosition].item)
}
2023-12-04 19:36:29 +08:00
(activity as? MainActivity)?.switchMainFragment()
}
fun focus() {
if (!view?.isFocused!!) {
view?.requestFocus()
}
}
2023-12-15 13:04:32 +08:00
fun savePosition(position: Int) {
with(sharedPref!!.edit()) {
putInt("position", position)
apply()
}
}
2023-12-04 19:36:29 +08:00
fun prev() {
view?.post {
itemPosition--
if (itemPosition == -1) {
itemPosition = list2.size - 1
}
2023-12-15 13:04:32 +08:00
savePosition(itemPosition)
2023-12-04 19:36:29 +08:00
val l = list2[itemPosition]
2023-12-15 13:04:32 +08:00
val tvModel = tvListViewModel.getTVModel(itemPosition)
if (tvModel?.ysp() != null) {
lifecycleScope.launch(Dispatchers.IO) {
tvModel.let { request?.fetchData(it) }
}
} else {
l.item.let { (activity as? MainActivity)?.play(it) }
}
2023-12-04 19:36:29 +08:00
setSelectedPosition(
l.rowPosition, false,
SelectItemViewHolderTask(l.itemPosition)
)
2023-12-15 13:04:32 +08:00
Toast.makeText(
activity,
l.item.title,
Toast.LENGTH_SHORT
).show()
2023-12-04 19:36:29 +08:00
}
}
fun next() {
view?.post {
itemPosition++
if (itemPosition == list2.size) {
itemPosition = 0
}
2023-12-15 13:04:32 +08:00
savePosition(itemPosition)
2023-12-04 19:36:29 +08:00
val l = list2[itemPosition]
2023-12-15 13:04:32 +08:00
val tvModel = tvListViewModel.getTVModel(itemPosition)
if (tvModel?.ysp() != null) {
lifecycleScope.launch(Dispatchers.IO) {
tvModel.let { request?.fetchData(it) }
}
} else {
l.item.let { (activity as? MainActivity)?.play(it) }
}
2023-12-04 19:36:29 +08:00
setSelectedPosition(
l.rowPosition, false,
SelectItemViewHolderTask(l.itemPosition)
)
2023-12-15 13:04:32 +08:00
Toast.makeText(
activity,
l.item.title,
Toast.LENGTH_SHORT
).show()
2023-12-06 23:51:17 +08:00
}
}
fun prevSource() {
view?.post {
2023-12-15 13:04:32 +08:00
val tv = list2[itemPosition].item
if (tv.videoUrl.size > 1) {
tv.videoIndex--
if (tv.videoIndex == -1) {
tv.videoIndex = tv.videoUrl.size - 1
}
2023-12-06 23:51:17 +08:00
2023-12-15 13:04:32 +08:00
(activity as? MainActivity)?.play(tv)
// (activity as? MainActivity)?.switchInfoFragment(tv)
2023-12-06 23:51:17 +08:00
}
}
}
fun nextSource() {
view?.post {
2023-12-15 13:04:32 +08:00
val tv = list2[itemPosition].item
2023-12-06 23:51:17 +08:00
2023-12-15 13:04:32 +08:00
if (tv.videoUrl.size > 1) {
tv.videoIndex++
if (tv.videoIndex == tv.videoUrl.size) {
tv.videoIndex = 0
}
2023-12-06 23:51:17 +08:00
2023-12-15 13:04:32 +08:00
(activity as? MainActivity)?.play(tv)
// (activity as? MainActivity)?.switchInfoFragment(tv)
}
2023-12-04 19:36:29 +08:00
}
}
private fun setupEventListeners() {
onItemViewClickedListener = ItemViewClickedListener()
onItemViewSelectedListener = ItemViewSelectedListener()
}
private inner class ItemViewClickedListener : OnItemViewClickedListener {
override fun onItemClicked(
itemViewHolder: Presenter.ViewHolder,
item: Any,
rowViewHolder: RowPresenter.ViewHolder,
row: Row
) {
if (item is TV) {
itemPosition = item.id
2023-12-15 13:04:32 +08:00
savePosition(itemPosition)
val tvModel = tvListViewModel.getTVModel(itemPosition)
if (tvModel?.ysp() != null) {
lifecycleScope.launch(Dispatchers.IO) {
tvModel.let { request?.fetchData(it) }
}
} else {
(activity as? MainActivity)?.play(item)
// (activity as? MainActivity)?.switchInfoFragment(item)
}
(activity as? MainActivity)?.switchMainFragment()
2023-12-04 19:36:29 +08:00
}
}
}
private inner class ItemViewSelectedListener : OnItemViewSelectedListener {
override fun onItemSelected(
itemViewHolder: Presenter.ViewHolder?, item: Any?,
rowViewHolder: RowPresenter.ViewHolder, row: Row
) {
if (itemViewHolder == null) {
view?.post {
2023-12-15 13:04:32 +08:00
val it = list2[itemPosition]
2023-12-04 19:36:29 +08:00
setSelectedPosition(
2023-12-15 13:04:32 +08:00
it.rowPosition, false,
SelectItemViewHolderTask(it.itemPosition)
2023-12-04 19:36:29 +08:00
)
}
}
}
}
companion object {
private const val TAG = "MainFragment"
}
}