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"
|
|
|
|
|
}
|
|
|
|
|
}
|