cloudstream/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadHeaderAdapter.kt

180 lines
6.4 KiB
Kotlin
Raw Normal View History

2021-07-15 16:45:25 +00:00
package com.lagradost.cloudstream3.ui.download
2021-12-24 16:09:01 +00:00
import android.annotation.SuppressLint
2021-07-15 16:45:25 +00:00
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.cardview.widget.CardView
2021-07-25 14:25:09 +00:00
import androidx.core.widget.ContentLoadingProgressBar
2021-07-15 16:45:25 +00:00
import androidx.recyclerview.widget.RecyclerView
import com.lagradost.cloudstream3.R
2021-12-24 16:09:01 +00:00
import com.lagradost.cloudstream3.mvvm.logError
2021-08-19 20:05:18 +00:00
import com.lagradost.cloudstream3.utils.UIHelper.setImage
2021-07-15 16:45:25 +00:00
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
import kotlinx.android.synthetic.main.download_header_episode.view.*
2021-07-28 19:14:45 +00:00
import java.util.*
2021-07-15 16:45:25 +00:00
data class VisualDownloadHeaderCached(
val currentOngoingDownloads: Int,
val totalDownloads: Int,
val totalBytes: Long,
2021-07-25 14:25:09 +00:00
val currentBytes: Long,
2021-07-15 16:45:25 +00:00
val data: VideoDownloadHelper.DownloadHeaderCached,
2021-07-25 14:25:09 +00:00
val child: VideoDownloadHelper.DownloadEpisodeCached?,
2021-07-15 16:45:25 +00:00
)
data class DownloadHeaderClickEvent(val action: Int, val data: VideoDownloadHelper.DownloadHeaderCached)
class DownloadHeaderAdapter(
var cardList: List<VisualDownloadHeaderCached>,
private val clickCallback: (DownloadHeaderClickEvent) -> Unit,
2021-07-25 14:25:09 +00:00
private val movieClickCallback: (DownloadClickEvent) -> Unit,
2021-07-28 19:14:45 +00:00
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val mBoundViewHolders: HashSet<DownloadButtonViewHolder> = HashSet()
private fun getAllBoundViewHolders(): Set<DownloadButtonViewHolder?>? {
return Collections.unmodifiableSet(mBoundViewHolders)
}
fun killAdapter() {
getAllBoundViewHolders()?.forEach { view ->
view?.downloadButton?.dispose()
}
}
override fun onViewDetachedFromWindow(holder: RecyclerView.ViewHolder) {
if (holder is DownloadButtonViewHolder) {
holder.downloadButton.dispose()
}
}
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
if (holder is DownloadButtonViewHolder) {
holder.downloadButton.dispose()
2021-08-19 20:05:18 +00:00
mBoundViewHolders.remove(holder)
2021-07-28 19:14:45 +00:00
}
}
override fun onViewAttachedToWindow(holder: RecyclerView.ViewHolder) {
if (holder is DownloadButtonViewHolder) {
holder.reattachDownloadButton()
}
}
2021-07-15 16:45:25 +00:00
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return DownloadHeaderViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.download_header_episode, parent, false),
2021-07-25 14:25:09 +00:00
clickCallback,
movieClickCallback
2021-07-15 16:45:25 +00:00
)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is DownloadHeaderViewHolder -> {
holder.bind(cardList[position])
2021-07-28 19:14:45 +00:00
mBoundViewHolders.add(holder)
2021-07-15 16:45:25 +00:00
}
}
}
override fun getItemCount(): Int {
return cardList.size
}
class DownloadHeaderViewHolder
constructor(
itemView: View,
private val clickCallback: (DownloadHeaderClickEvent) -> Unit,
2021-07-25 14:25:09 +00:00
private val movieClickCallback: (DownloadClickEvent) -> Unit,
2021-07-28 19:14:45 +00:00
) : RecyclerView.ViewHolder(itemView), DownloadButtonViewHolder {
override var downloadButton = EasyDownloadButton()
2021-08-19 20:05:18 +00:00
private val poster: ImageView? = itemView.download_header_poster
2021-07-15 16:45:25 +00:00
private val title: TextView = itemView.download_header_title
private val extraInfo: TextView = itemView.download_header_info
private val holder: CardView = itemView.episode_holder
2021-07-25 14:25:09 +00:00
private val downloadBar: ContentLoadingProgressBar = itemView.download_header_progress_downloaded
private val downloadImage: ImageView = itemView.download_header_episode_download
private val normalImage: ImageView = itemView.download_header_goto_child
2021-10-19 20:17:06 +00:00
private var localCard: VisualDownloadHeaderCached? = null
2021-07-25 14:25:09 +00:00
2021-12-24 16:09:01 +00:00
@SuppressLint("SetTextI18n")
2021-07-15 16:45:25 +00:00
fun bind(card: VisualDownloadHeaderCached) {
2021-07-28 19:14:45 +00:00
localCard = card
2021-07-15 16:45:25 +00:00
val d = card.data
2021-08-19 20:05:18 +00:00
poster?.setImage(d.poster)
2021-10-31 18:28:35 +00:00
poster?.setOnClickListener {
clickCallback.invoke(DownloadHeaderClickEvent(1, d))
}
2021-07-15 16:45:25 +00:00
title.text = d.name
val mbString = "%.1f".format(card.totalBytes / 1000000f)
2021-07-25 14:25:09 +00:00
//val isMovie = d.type.isMovieType()
if (card.child != null) {
downloadBar.visibility = View.VISIBLE
downloadImage.visibility = View.VISIBLE
normalImage.visibility = View.GONE
2021-07-28 19:14:45 +00:00
/*setUpButton(
2021-07-25 14:25:09 +00:00
card.currentBytes,
card.totalBytes,
downloadBar,
downloadImage,
extraInfo,
card.child,
movieClickCallback
2021-07-28 19:14:45 +00:00
)*/
2021-07-25 14:25:09 +00:00
holder.setOnClickListener {
movieClickCallback.invoke(DownloadClickEvent(DOWNLOAD_ACTION_PLAY_FILE, card.child))
}
} else {
downloadBar.visibility = View.GONE
downloadImage.visibility = View.GONE
normalImage.visibility = View.VISIBLE
2021-12-24 16:09:01 +00:00
try {
extraInfo.text =
extraInfo.context.getString(R.string.extra_info_format).format(
card.totalDownloads,
if (card.totalDownloads == 1) extraInfo.context.getString(R.string.episode) else extraInfo.context.getString(
R.string.episodes
),
mbString
)
} catch (e : Exception) {
// you probably formatted incorrectly
extraInfo.text = "Error"
logError(e)
}
2021-07-15 16:45:25 +00:00
2021-07-25 14:25:09 +00:00
holder.setOnClickListener {
clickCallback.invoke(DownloadHeaderClickEvent(0, d))
}
2021-07-15 16:45:25 +00:00
}
}
2021-07-28 19:14:45 +00:00
override fun reattachDownloadButton() {
downloadButton.dispose()
val card = localCard
if (card?.child != null) {
downloadButton.setUpButton(
card.currentBytes,
card.totalBytes,
downloadBar,
downloadImage,
extraInfo,
card.child,
movieClickCallback
)
}
}
2021-07-15 16:45:25 +00:00
}
}