2020-10-14 20:22:20 +02:00
package org.mosad.teapod.util.adapter
2020-10-12 09:54:32 +02:00
2021-01-11 22:12:21 +01:00
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
2022-01-05 01:28:39 +01:00
import android.graphics.drawable.Drawable
2020-10-12 09:54:32 +02:00
import android.view.LayoutInflater
import android.view.ViewGroup
2022-01-05 01:28:39 +01:00
import androidx.core.content.ContextCompat
2020-10-12 09:54:32 +02:00
import androidx.recyclerview.widget.RecyclerView
2020-10-13 15:56:07 +02:00
import com.bumptech.glide.Glide
2020-10-14 18:33:02 +02:00
import com.bumptech.glide.request.RequestOptions
import jp.wasabeef.glide.transformations.RoundedCornersTransformation
2020-10-12 09:54:32 +02:00
import org.mosad.teapod.R
2020-11-25 22:35:55 +01:00
import org.mosad.teapod.databinding.ItemEpisodeBinding
2021-12-29 19:36:33 +01:00
import org.mosad.teapod.parser.crunchyroll.Episode
2022-01-05 01:28:39 +01:00
import org.mosad.teapod.parser.crunchyroll.PlayheadsMap
2021-07-25 19:15:31 +02:00
import org.mosad.teapod.util.tmdb.TMDBTVEpisode
2020-10-12 09:54:32 +02:00
2022-01-05 01:28:39 +01:00
class EpisodeItemAdapter (
private val episodes : List < Episode > ,
private val tmdbEpisodes : List < TMDBTVEpisode > ? ,
private val playheads : PlayheadsMap
) : RecyclerView . Adapter < EpisodeItemAdapter . EpisodeViewHolder > ( ) {
2020-10-12 09:54:32 +02:00
2021-12-20 22:14:58 +01:00
var onImageClick : ( ( seasonId : String , episodeId : String ) -> Unit ) ? = null
2020-10-12 09:54:32 +02:00
2020-11-21 19:40:55 +01:00
override fun onCreateViewHolder ( parent : ViewGroup , viewType : Int ) : EpisodeViewHolder {
2020-11-25 22:35:55 +01:00
return EpisodeViewHolder ( ItemEpisodeBinding . inflate ( LayoutInflater . from ( parent . context ) , parent , false ) )
2020-10-12 09:54:32 +02:00
}
2020-11-21 19:40:55 +01:00
override fun onBindViewHolder ( holder : EpisodeViewHolder , position : Int ) {
2020-11-25 22:35:55 +01:00
val context = holder . binding . root . context
2021-12-29 19:36:33 +01:00
val ep = episodes [ position ]
2020-10-16 18:24:34 +02:00
2021-12-29 20:51:53 +01:00
val titleText = if ( ep . episodeNumber != null ) {
// for tv shows add ep prefix and episode number
if ( ep . isDubbed ) {
context . getString ( R . string . component _episode _title , ep . episode , ep . title )
} else {
context . getString ( R . string . component _episode _title _sub , ep . episode , ep . title )
}
2020-12-26 14:39:35 +01:00
} else {
2021-12-29 20:51:53 +01:00
ep . title
2020-10-19 21:57:02 +02:00
}
2020-11-25 22:35:55 +01:00
holder . binding . textEpisodeTitle . text = titleText
2021-12-20 22:14:58 +01:00
holder . binding . textEpisodeDesc . text = if ( ep . description . isNotEmpty ( ) ) {
ep . description
2021-07-11 12:56:21 +02:00
} else if ( tmdbEpisodes != null && position < tmdbEpisodes . size ) {
tmdbEpisodes [ position ] . overview
} else {
" "
}
2020-10-13 20:23:55 +02:00
2021-12-26 20:22:00 +01:00
// TODO is isNotEmpty() needed? also in PlayerEpisodeItemAdapter
2021-12-20 22:14:58 +01:00
if ( ep . images . thumbnail [ 0 ] [ 0 ] . source . isNotEmpty ( ) ) {
Glide . with ( context ) . load ( ep . images . thumbnail [ 0 ] [ 0 ] . source )
2021-01-11 22:12:21 +01:00
. apply ( RequestOptions . placeholderOf ( ColorDrawable ( Color . DKGRAY ) ) )
2020-10-14 18:33:02 +02:00
. apply ( RequestOptions . bitmapTransform ( RoundedCornersTransformation ( 10 , 0 ) ) )
2020-11-25 22:35:55 +01:00
. into ( holder . binding . imageEpisode )
2020-10-13 20:23:55 +02:00
}
2020-10-13 15:56:07 +02:00
2022-01-05 01:28:39 +01:00
// add watched icon to episode, if the episode id is present in playheads and fullyWatched
val watchedImage : Drawable ? = if ( playheads [ ep . id ] ?. fullyWatched == true ) {
ContextCompat . getDrawable ( context , R . drawable . ic _baseline _check _circle _24 )
} else {
null
}
holder . binding . imageWatched . setImageDrawable ( watchedImage )
2020-10-12 09:54:32 +02:00
}
override fun getItemCount ( ) : Int {
2021-12-29 19:36:33 +01:00
return episodes . size
2020-10-12 09:54:32 +02:00
}
2021-12-20 22:14:58 +01:00
inner class EpisodeViewHolder ( val binding : ItemEpisodeBinding ) :
RecyclerView . ViewHolder ( binding . root ) {
2020-10-12 09:54:32 +02:00
init {
2021-12-20 22:14:58 +01:00
// on image click return the episode id and index (within the adapter)
2020-11-25 22:35:55 +01:00
binding . imageEpisode . setOnClickListener {
2021-12-20 22:14:58 +01:00
onImageClick ?. invoke (
2021-12-29 19:36:33 +01:00
episodes [ bindingAdapterPosition ] . seasonId ,
episodes [ bindingAdapterPosition ] . id
2021-12-20 22:14:58 +01:00
)
2020-10-16 10:05:11 +02:00
}
2020-10-12 09:54:32 +02:00
}
}
}