Be extra careful and handle null in getItemViewType and other minor cleanup

This commit is contained in:
Luna712 2024-06-20 16:58:26 -06:00 committed by GitHub
parent f3d775ee21
commit 6588f2c33e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 31 deletions

View file

@ -26,17 +26,17 @@ const val DOWNLOAD_ACTION_PAUSE_DOWNLOAD = 3
const val DOWNLOAD_ACTION_DOWNLOAD = 4 const val DOWNLOAD_ACTION_DOWNLOAD = 4
const val DOWNLOAD_ACTION_LONG_CLICK = 5 const val DOWNLOAD_ACTION_LONG_CLICK = 5
abstract class VisualDownloadCachedAbstract( abstract class VisualDownloadCached(
open val currentBytes: Long, open val currentBytes: Long,
open val totalBytes: Long, open val totalBytes: Long,
open val data: VideoDownloadHelper.DownloadCachedAbstract open val data: VideoDownloadHelper.DownloadCached
) )
data class VisualDownloadChildCached( data class VisualDownloadChildCached(
override val currentBytes: Long, override val currentBytes: Long,
override val totalBytes: Long, override val totalBytes: Long,
override val data: VideoDownloadHelper.DownloadEpisodeCached, override val data: VideoDownloadHelper.DownloadEpisodeCached,
): VisualDownloadCachedAbstract(currentBytes, totalBytes, data) ): VisualDownloadCached(currentBytes, totalBytes, data)
data class VisualDownloadHeaderCached( data class VisualDownloadHeaderCached(
override val currentBytes: Long, override val currentBytes: Long,
@ -45,7 +45,7 @@ data class VisualDownloadHeaderCached(
val child: VideoDownloadHelper.DownloadEpisodeCached?, val child: VideoDownloadHelper.DownloadEpisodeCached?,
val currentOngoingDownloads: Int, val currentOngoingDownloads: Int,
val totalDownloads: Int, val totalDownloads: Int,
): VisualDownloadCachedAbstract(currentBytes, totalBytes, data) ): VisualDownloadCached(currentBytes, totalBytes, data)
data class DownloadClickEvent( data class DownloadClickEvent(
val action: Int, val action: Int,
@ -58,9 +58,9 @@ data class DownloadHeaderClickEvent(
) )
class DownloadAdapter( class DownloadAdapter(
var cardList: List<VisualDownloadCachedAbstract>, var cardList: List<VisualDownloadCached>,
private val clickCallback: (DownloadHeaderClickEvent) -> Unit, private val clickCallback: (DownloadHeaderClickEvent) -> Unit,
private val movieClickCallback: (DownloadClickEvent) -> Unit, private val mediaClickCallback: (DownloadClickEvent) -> Unit,
) : RecyclerView.Adapter<DownloadAdapter.DownloadViewHolder>() { ) : RecyclerView.Adapter<DownloadAdapter.DownloadViewHolder>() {
companion object { companion object {
@ -71,20 +71,11 @@ class DownloadAdapter(
inner class DownloadViewHolder( inner class DownloadViewHolder(
private val binding: ViewBinding, private val binding: ViewBinding,
private val clickCallback: (DownloadHeaderClickEvent) -> Unit, private val clickCallback: (DownloadHeaderClickEvent) -> Unit,
private val movieClickCallback: (DownloadClickEvent) -> Unit, private val mediaClickCallback: (DownloadClickEvent) -> Unit,
) : RecyclerView.ViewHolder(binding.root) { ) : RecyclerView.ViewHolder(binding.root) {
/* private val poster: ImageView? = itemView.download_header_poster
private val title: TextView = itemView.download_header_title
private val extraInfo: TextView = itemView.download_header_info
private val holder: CardView = itemView.episode_holder
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 */
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
fun bind(card: VisualDownloadCachedAbstract?) { fun bind(card: VisualDownloadCached?) {
when (binding) { when (binding) {
is DownloadHeaderEpisodeBinding -> binding.apply { is DownloadHeaderEpisodeBinding -> binding.apply {
if (card == null || card !is VisualDownloadHeaderCached) return@apply if (card == null || card !is VisualDownloadHeaderCached) return@apply
@ -106,11 +97,7 @@ class DownloadAdapter(
// downloadHeaderEpisodeDownload.visibility = View.VISIBLE // downloadHeaderEpisodeDownload.visibility = View.VISIBLE
downloadHeaderGotoChild.visibility = View.GONE downloadHeaderGotoChild.visibility = View.GONE
downloadButton.setDefaultClickListener( downloadButton.setDefaultClickListener(card.child, downloadHeaderInfo, mediaClickCallback)
card.child,
downloadHeaderInfo,
movieClickCallback
)
downloadButton.isVisible = true downloadButton.isVisible = true
/* setUpButton( /* setUpButton(
card.currentBytes, card.currentBytes,
@ -119,11 +106,11 @@ class DownloadAdapter(
downloadImage, downloadImage,
extraInfo, extraInfo,
card.child, card.child,
movieClickCallback mediaClickCallback
) */ ) */
episodeHolder.setOnClickListener { episodeHolder.setOnClickListener {
movieClickCallback.invoke( mediaClickCallback.invoke(
DownloadClickEvent( DownloadClickEvent(
DOWNLOAD_ACTION_PLAY_FILE, DOWNLOAD_ACTION_PLAY_FILE,
card.child card.child
@ -174,7 +161,7 @@ class DownloadAdapter(
} else visibility = View.GONE } else visibility = View.GONE
} }
downloadButton.setDefaultClickListener(card.data, downloadChildEpisodeTextExtra, movieClickCallback) downloadButton.setDefaultClickListener(card.data, downloadChildEpisodeTextExtra, mediaClickCallback)
downloadChildEpisodeText.apply { downloadChildEpisodeText.apply {
text = context.getNameFull(d.name, d.episode, d.season) text = context.getNameFull(d.name, d.episode, d.season)
@ -182,7 +169,7 @@ class DownloadAdapter(
} }
downloadChildEpisodeHolder.setOnClickListener { downloadChildEpisodeHolder.setOnClickListener {
movieClickCallback.invoke(DownloadClickEvent(DOWNLOAD_ACTION_PLAY_FILE, d)) mediaClickCallback.invoke(DownloadClickEvent(DOWNLOAD_ACTION_PLAY_FILE, d))
} }
} }
} }
@ -209,7 +196,7 @@ class DownloadAdapter(
else -> throw IllegalArgumentException("Invalid view type") else -> throw IllegalArgumentException("Invalid view type")
}, },
clickCallback, clickCallback,
movieClickCallback mediaClickCallback
) )
override fun onBindViewHolder(holder: DownloadViewHolder, position: Int) { override fun onBindViewHolder(holder: DownloadViewHolder, position: Int) {
@ -221,7 +208,9 @@ class DownloadAdapter(
override fun getItemViewType(position: Int): Int { override fun getItemViewType(position: Int): Int {
if (viewType != 0) return viewType if (viewType != 0) return viewType
val isChildView = cardList[position] !is VisualDownloadHeaderCached val card = cardList.getOrNull(position) ?: return 0
val isChildView = card is VisualDownloadChildCached
return if (isChildView) VIEW_TYPE_CHILD else VIEW_TYPE_HEADER return if (isChildView) VIEW_TYPE_CHILD else VIEW_TYPE_HEADER
} }

View file

@ -3,7 +3,7 @@ package com.lagradost.cloudstream3.utils
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.TvType import com.lagradost.cloudstream3.TvType
object VideoDownloadHelper { object VideoDownloadHelper {
abstract class DownloadCachedAbstract( abstract class DownloadCached(
@JsonProperty("id") open val id: Int, @JsonProperty("id") open val id: Int,
) )
@ -17,7 +17,7 @@ object VideoDownloadHelper {
@JsonProperty("description") val description: String?, @JsonProperty("description") val description: String?,
@JsonProperty("cacheTime") val cacheTime: Long, @JsonProperty("cacheTime") val cacheTime: Long,
override val id: Int, override val id: Int,
): DownloadCachedAbstract(id) ): DownloadCached(id)
data class DownloadHeaderCached( data class DownloadHeaderCached(
@JsonProperty("apiName") val apiName: String, @JsonProperty("apiName") val apiName: String,
@ -27,7 +27,7 @@ object VideoDownloadHelper {
@JsonProperty("poster") val poster: String?, @JsonProperty("poster") val poster: String?,
@JsonProperty("cacheTime") val cacheTime: Long, @JsonProperty("cacheTime") val cacheTime: Long,
override val id: Int, override val id: Int,
): DownloadCachedAbstract(id) ): DownloadCached(id)
data class ResumeWatching( data class ResumeWatching(
@JsonProperty("parentId") val parentId: Int, @JsonProperty("parentId") val parentId: Int,