import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import io.trtc.tuikit.atomicxcore.api.live.LiveInfo
import io.trtc.tuikit.atomicxcore.api.view.CoreViewType
import io.trtc.tuikit.atomicxcore.api.view.LiveCoreView
class LiveFeedViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private var liveCoreView: LiveCoreView? = null
fun setLiveInfo(liveInfo: LiveInfo) {
liveCoreView = LiveCoreView(itemView.context, viewType = CoreViewType.PLAY_VIEW)
liveCoreView?.let { view ->
(itemView as ViewGroup).addView(view)
view.layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
}
}
fun startPlay(roomId: String) {
liveCoreView?.startPreviewLiveStream(roomId, false, callback = null)
}
fun stopPlay(roomId: String) {
liveCoreView?.stopPreviewLiveStream(roomId)
}
}
class LiveFeedActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private var liveList: List<LiveInfo> = emptyList()
private var currentPlayingPosition: Int = -1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_live_feed)
setupRecyclerView()
}
private fun setupRecyclerView() {
recyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
recyclerView.adapter = LiveFeedAdapter(liveList) { position ->
playVideoAtPosition(position)
}
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
val firstVisiblePosition = layoutManager.findFirstCompletelyVisibleItemPosition()
if (firstVisiblePosition != RecyclerView.NO_POSITION) {
playVideoAtPosition(firstVisiblePosition)
}
}
}
})
}
private fun playVideoAtPosition(position: Int) {
if (currentPlayingPosition != position) {
if (currentPlayingPosition != -1) {
val currentViewHolder = recyclerView.findViewHolderForAdapterPosition(currentPlayingPosition)
if (currentViewHolder is LiveFeedViewHolder) {
val liveInfo = liveList[currentPlayingPosition]
currentViewHolder.stopPlay(liveInfo.liveID)
}
}
val newViewHolder = recyclerView.findViewHolderForAdapterPosition(position)
if (newViewHolder is LiveFeedViewHolder) {
val liveInfo = liveList[position]
newViewHolder.startPlay(liveInfo.liveID)
currentPlayingPosition = position
}
}
}
inner class LiveFeedAdapter(
private var liveList: List<LiveInfo>,
private val onItemClick: (Int) -> Unit
) : RecyclerView.Adapter<LiveFeedViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LiveFeedViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_live_feed, parent, false)
return LiveFeedViewHolder(view)
}
override fun onBindViewHolder(holder: LiveFeedViewHolder, position: Int) {
val liveInfo = liveList[position]
holder.setLiveInfo(liveInfo)
holder.itemView.setOnClickListener {
onItemClick(position)
}
}
override fun getItemCount(): Int = liveList.size
}
}