2020-10-15 19:01:37 +02:00
package org.mosad.teapod.ui.fragments
2020-10-11 10:02:00 +02:00
2020-10-12 22:43:42 +02:00
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
2020-10-11 10:02:00 +02:00
import android.os.Bundle
2020-10-11 23:16:47 +02:00
import android.util.Log
2020-10-11 10:02:00 +02:00
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
2020-10-16 18:24:34 +02:00
import androidx.fragment.app.Fragment
2020-10-12 09:54:32 +02:00
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
2020-10-11 10:02:00 +02:00
import com.bumptech.glide.Glide
2020-10-12 22:43:42 +02:00
import com.bumptech.glide.request.RequestOptions
import jp.wasabeef.glide.transformations.BlurTransformation
2020-10-11 10:02:00 +02:00
import kotlinx.android.synthetic.main.fragment_media.*
2020-10-11 13:18:20 +02:00
import org.mosad.teapod.MainActivity
2020-10-11 10:02:00 +02:00
import org.mosad.teapod.R
2020-10-13 23:47:48 +02:00
import org.mosad.teapod.parser.AoDParser
2020-10-11 23:16:47 +02:00
import org.mosad.teapod.util.DataTypes.MediaType
2020-10-12 17:52:24 +02:00
import org.mosad.teapod.util.Media
2020-10-16 18:24:34 +02:00
import org.mosad.teapod.util.StorageController
2020-10-12 20:30:45 +02:00
import org.mosad.teapod.util.TMDBResponse
2020-10-16 18:24:34 +02:00
import org.mosad.teapod.util.adapter.EpisodeItemAdapter
2020-10-11 10:02:00 +02:00
2020-10-12 20:30:45 +02:00
class MediaFragment ( private val media : Media , private val tmdb : TMDBResponse ) : Fragment ( ) {
2020-10-11 23:16:47 +02:00
2020-10-14 20:22:20 +02:00
private lateinit var adapterRecEpisodes : EpisodeItemAdapter
2020-10-12 09:54:32 +02:00
private lateinit var viewManager : RecyclerView . LayoutManager
2020-10-11 10:02:00 +02:00
override fun onCreateView ( inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ) : View ? {
return inflater . inflate ( R . layout . fragment _media , container , false )
}
override fun onViewCreated ( view : View , savedInstanceState : Bundle ? ) {
super . onViewCreated ( view , savedInstanceState )
2020-10-12 22:43:42 +02:00
initGUI ( )
initActions ( )
}
/ * *
* if tmdb data is present , use it , else use the aod data
* /
private fun initGUI ( ) {
2020-10-11 23:16:47 +02:00
// generic gui
2020-10-16 19:56:08 +02:00
val backdropUrl = if ( tmdb . backdropUrl . isNotEmpty ( ) ) tmdb . backdropUrl else media . info . posterUrl
val posterUrl = if ( tmdb . posterUrl . isNotEmpty ( ) ) tmdb . posterUrl else media . info . posterUrl
2020-10-12 20:30:45 +02:00
2020-10-13 12:27:13 +02:00
Glide . with ( requireContext ( ) ) . load ( backdropUrl )
. apply ( RequestOptions . placeholderOf ( ColorDrawable ( Color . DKGRAY ) ) )
2020-10-16 10:05:11 +02:00
. apply ( RequestOptions . bitmapTransform ( BlurTransformation ( 20 , 3 ) ) )
2020-10-13 12:27:13 +02:00
. into ( image _backdrop )
2020-10-12 22:43:42 +02:00
2020-10-13 12:27:13 +02:00
Glide . with ( requireContext ( ) ) . load ( posterUrl )
. into ( image _poster )
2020-10-12 22:43:42 +02:00
2020-10-16 19:56:08 +02:00
text _title . text = media . info . title
2020-10-13 15:56:07 +02:00
text _year . text = media . info . year . toString ( )
text _age . text = media . info . age . toString ( )
2020-10-14 20:22:20 +02:00
text _overview . text = media . info . shortDesc
2020-10-16 19:56:08 +02:00
if ( StorageController . myList . contains ( media . id ) ) {
2020-10-16 18:24:34 +02:00
Glide . with ( requireContext ( ) ) . load ( R . drawable . ic _baseline _check _24 ) . into ( image _my _list _action )
} else {
Glide . with ( requireContext ( ) ) . load ( R . drawable . ic _baseline _add _24 ) . into ( image _my _list _action )
}
2020-10-11 23:16:47 +02:00
// specific gui
2020-10-12 17:52:24 +02:00
if ( media . type == MediaType . TVSHOW ) {
2020-10-16 18:24:34 +02:00
adapterRecEpisodes = EpisodeItemAdapter ( media . episodes )
2020-10-12 09:54:32 +02:00
viewManager = LinearLayoutManager ( context )
recycler _episodes . layoutManager = viewManager
recycler _episodes . adapter = adapterRecEpisodes
2020-10-11 23:16:47 +02:00
2020-10-13 15:56:07 +02:00
text _episodes _or _runtime . text = getString ( R . string . text _episodes _count , media . info . episodesCount )
2020-10-12 17:52:24 +02:00
} else if ( media . type == MediaType . MOVIE ) {
2020-10-12 09:54:32 +02:00
recycler _episodes . visibility = View . GONE
2020-10-13 15:56:07 +02:00
if ( tmdb . runtime > 0 ) {
text _episodes _or _runtime . text = getString ( R . string . text _runtime , tmdb . runtime )
} else {
text _episodes _or _runtime . visibility = View . GONE
}
2020-10-11 23:16:47 +02:00
}
2020-10-11 10:02:00 +02:00
}
private fun initActions ( ) {
2020-10-11 23:16:47 +02:00
button _play . setOnClickListener {
2020-10-12 17:52:24 +02:00
when ( media . type ) {
MediaType . MOVIE -> playStream ( media . episodes . first ( ) . streamUrl )
MediaType . TVSHOW -> playStream ( media . episodes . first ( ) . streamUrl )
2020-10-12 22:43:42 +02:00
else -> Log . e ( javaClass . name , " Wrong Type: $media .type " )
2020-10-12 17:52:24 +02:00
}
2020-10-11 23:16:47 +02:00
}
2020-10-15 21:00:31 +02:00
// add or remove media from myList
2020-10-16 18:24:34 +02:00
linear _my _list _action . setOnClickListener {
2020-10-16 19:56:08 +02:00
if ( StorageController . myList . contains ( media . id ) ) {
StorageController . myList . remove ( media . id )
2020-10-16 18:24:34 +02:00
Glide . with ( requireContext ( ) ) . load ( R . drawable . ic _baseline _add _24 ) . into ( image _my _list _action )
} else {
2020-10-16 19:56:08 +02:00
StorageController . myList . add ( media . id )
2020-10-16 18:24:34 +02:00
Glide . with ( requireContext ( ) ) . load ( R . drawable . ic _baseline _check _24 ) . into ( image _my _list _action )
2020-10-15 21:00:31 +02:00
}
2020-10-16 19:56:08 +02:00
StorageController . saveMyList ( requireContext ( ) )
2020-10-16 11:23:32 +02:00
2020-10-16 18:24:34 +02:00
// notify home fragment on change
2020-10-16 11:23:32 +02:00
parentFragmentManager . findFragmentByTag ( " HomeFragment " ) ?. let {
( it as HomeFragment ) . updateMyListMedia ( )
}
2020-10-15 21:00:31 +02:00
}
2020-10-12 09:54:32 +02:00
// set onItemClick only in adapter is initialized
if ( this :: adapterRecEpisodes . isInitialized ) {
2020-10-16 10:05:11 +02:00
adapterRecEpisodes . onImageClick = { _ , position ->
2020-10-12 17:52:24 +02:00
playStream ( media . episodes [ position ] . streamUrl )
2020-10-13 23:47:48 +02:00
// update watched state
AoDParser ( ) . sendCallback ( media . episodes [ position ] . watchedCallback )
adapterRecEpisodes . updateWatchedState ( true , position )
adapterRecEpisodes . notifyDataSetChanged ( )
2020-10-12 09:54:32 +02:00
}
2020-10-11 23:16:47 +02:00
}
2020-10-11 10:02:00 +02:00
}
2020-10-11 23:16:47 +02:00
private fun playStream ( url : String ) {
2020-10-16 18:24:34 +02:00
Log . d ( javaClass . name , " Playing stream: $url " )
( activity as MainActivity ) . startPlayer ( url )
2020-10-11 10:02:00 +02:00
}
}