package com.lagradost.cloudstream3.ui.result import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.core.view.isVisible import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.google.android.material.button.MaterialButton import com.lagradost.cloudstream3.ActorData import com.lagradost.cloudstream3.ActorRole import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.ui.download.DownloadButtonViewHolder import com.lagradost.cloudstream3.ui.home.ParentItemAdapter import com.lagradost.cloudstream3.ui.settings.AccountAdapter import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings import com.lagradost.cloudstream3.utils.UIHelper.setImage import kotlinx.android.synthetic.main.cast_item.view.* import org.schabi.newpipe.extractor.timeago.patterns.it typealias SelectData = Pair class SelectAdaptor(val callback: (Any) -> Unit) : RecyclerView.Adapter() { private val selection: MutableList = mutableListOf() private var selectedIndex: Int = -1 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return SelectViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.result_selection, parent, false), ) } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is SelectViewHolder -> { holder.bind(selection[position], position == selectedIndex, callback) } } } override fun onViewDetachedFromWindow(holder: RecyclerView.ViewHolder) { if(holder.itemView.hasFocus()) { holder.itemView.clearFocus() } } override fun getItemCount(): Int { return selection.size } fun select(newIndex: Int, recyclerView: RecyclerView?) { if(recyclerView == null) return if(newIndex == selectedIndex) return val oldIndex = selectedIndex selectedIndex = newIndex recyclerView.apply { for (i in 0 until itemCount) { val viewHolder = getChildViewHolder( getChildAt(i) ?: continue) ?: continue val pos = viewHolder.absoluteAdapterPosition if (viewHolder is SelectViewHolder) { if (pos == oldIndex) { viewHolder.update(false) } else if (pos == newIndex) { viewHolder.update(true) } } } } } fun updateSelectionList(newList: List) { val diffResult = DiffUtil.calculateDiff( SelectDataCallback(this.selection, newList) ) selection.clear() selection.addAll(newList) diffResult.dispatchUpdatesTo(this) } private class SelectViewHolder constructor( itemView: View, ) : RecyclerView.ViewHolder(itemView) { private val item: MaterialButton = itemView as MaterialButton fun update(isSelected: Boolean) { item.isSelected = isSelected } fun bind( data: SelectData, isSelected: Boolean, callback: (Any) -> Unit ) { val isTrueTv = itemView.context?.isTrueTvSettings() == true if (isTrueTv) { item.isFocusable = true item.isFocusableInTouchMode = true } item.isSelected = isSelected item.setText(data.first) item.setOnClickListener { callback.invoke(data.second) } } } } class SelectDataCallback( private val oldList: List, private val newList: List ) : DiffUtil.Callback() { override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) = oldList[oldItemPosition].second == newList[newItemPosition].second override fun getOldListSize() = oldList.size override fun getNewListSize() = newList.size override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int) = oldList[oldItemPosition] == newList[newItemPosition] }