diff --git a/app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaFragment.kt b/app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaFragment.kt index 248d710..6fda407 100644 --- a/app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaFragment.kt +++ b/app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaFragment.kt @@ -17,6 +17,8 @@ import com.google.android.material.tabs.TabLayoutMediator import jp.wasabeef.glide.transformations.BlurTransformation import kotlinx.coroutines.* import org.mosad.teapod.R +import org.mosad.teapod.activity.main.MainActivity +import org.mosad.teapod.activity.main.viewmodel.MediaFragmentViewModel import org.mosad.teapod.databinding.FragmentMediaBinding import org.mosad.teapod.util.* import org.mosad.teapod.util.DataTypes.MediaType @@ -116,7 +118,7 @@ class MediaFragment(private val mediaId: Int) : Fragment() { ) // episodes - fragments.add(MediaEpisodesFragment()) + fragments.add(MediaFragmentEpisodes()) pagerAdapter.notifyDataSetChanged() } else if (media.type == MediaType.MOVIE) { @@ -141,7 +143,7 @@ class MediaFragment(private val mediaId: Int) : Fragment() { private fun initActions() = with(model) { binding.buttonPlay.setOnClickListener { when (media.type) { - MediaType.MOVIE -> playStream(media.episodes.first()) + MediaType.MOVIE -> playEpisode(media.episodes.first()) MediaType.TVSHOW -> playEpisode(nextEpisode) else -> Log.e(javaClass.name, "Wrong Type: $media.type") } @@ -165,6 +167,17 @@ class MediaFragment(private val mediaId: Int) : Fragment() { } } + /** + * play the current episode + * TODO this is also used in MediaFragmentEpisode, we should only have on implementation + */ + private fun playEpisode(ep: Episode) { + (activity as MainActivity).startPlayer(model.media.id, ep.id) + Log.d(javaClass.name, "Started Player with episodeId: ${ep.id}") + + model.updateNextEpisode() // set the correct next episode + } + /** * A simple pager adapter */ diff --git a/app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaEpisodesFragment.kt b/app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaFragmentEpisodes.kt similarity index 71% rename from app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaEpisodesFragment.kt rename to app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaFragmentEpisodes.kt index 9bbd93b..d16a50e 100644 --- a/app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaEpisodesFragment.kt +++ b/app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaFragmentEpisodes.kt @@ -1,15 +1,19 @@ package org.mosad.teapod.activity.main.fragments import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import org.mosad.teapod.activity.main.MainActivity +import org.mosad.teapod.activity.main.viewmodel.MediaFragmentViewModel import org.mosad.teapod.databinding.FragmentMediaEpisodesBinding +import org.mosad.teapod.util.Episode import org.mosad.teapod.util.adapter.EpisodeItemAdapter -class MediaEpisodesFragment : Fragment() { +class MediaFragmentEpisodes : Fragment() { private lateinit var binding: FragmentMediaEpisodesBinding private lateinit var adapterRecEpisodes: EpisodeItemAdapter @@ -27,12 +31,10 @@ class MediaEpisodesFragment : Fragment() { adapterRecEpisodes = EpisodeItemAdapter(model.media.episodes) binding.recyclerEpisodes.adapter = adapterRecEpisodes - println(model.media.episodes) - // set onItemClick only in adapter is initialized if (this::adapterRecEpisodes.isInitialized) { adapterRecEpisodes.onImageClick = { _, position -> - model.playEpisode(model.media.episodes[position]) + playEpisode(model.media.episodes[position]) } } } @@ -40,6 +42,7 @@ class MediaEpisodesFragment : Fragment() { override fun onResume() { super.onResume() + // if adapterRecEpisodes is initialized, update the watched state for the episodes if (this::adapterRecEpisodes.isInitialized) { model.media.episodes.forEachIndexed { index, episode -> adapterRecEpisodes.updateWatchedState(episode.watched, index) @@ -48,4 +51,11 @@ class MediaEpisodesFragment : Fragment() { } } + private fun playEpisode(ep: Episode) { + (activity as MainActivity).startPlayer(model.media.id, ep.id) + Log.d(javaClass.name, "Started Player with episodeId: ${ep.id}") + + model.updateNextEpisode() // set the correct next episode + } + } \ No newline at end of file diff --git a/app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaFragmentViewModel.kt b/app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaFragmentViewModel.kt deleted file mode 100644 index 57cb71c..0000000 --- a/app/src/main/java/org/mosad/teapod/activity/main/fragments/MediaFragmentViewModel.kt +++ /dev/null @@ -1,63 +0,0 @@ -package org.mosad.teapod.activity.main.fragments - -import android.app.Application -import android.util.Log -import androidx.lifecycle.AndroidViewModel -import org.mosad.teapod.activity.main.MainActivity -import org.mosad.teapod.parser.AoDParser -import org.mosad.teapod.util.* - -class MediaFragmentViewModel(application: Application) : AndroidViewModel(application) { - - var media = Media(-1, "", DataTypes.MediaType.OTHER) - internal set - var nextEpisode = Episode() - internal set - var tmdb = TMDBResponse() - internal set - - suspend fun load(mediaId: Int) { - media = AoDParser.getMediaById(mediaId) - tmdb = TMDBApiController().search(media.info.title, media.type) - - if (media.type == DataTypes.MediaType.TVSHOW) { - nextEpisode = if (media.episodes.firstOrNull{ !it.watched } != null) { - media.episodes.first{ !it.watched } - } else { - media.episodes.first() - } - } - } - - fun playEpisode(ep: Episode) { - playStream(ep) - - // update nextEpisode - val currentEpNumber = nextEpisode.number - nextEpisode = if (media.episodes.firstOrNull{ !it.watched } != null) { - media.episodes.first{ !it.watched && it.number > currentEpNumber } - } else { - media.episodes.first() - } - } - - fun playStream(ep: Episode) { - Log.d(javaClass.name, "Starting Player with mediaId: ${media.id}") - - // TODO somehow start the player ... - MainActivity.instance.startPlayer(media.id, ep.id) // this is just a workaround! - - // not working TODO once thsi is solved, use ViewModel instead of AndroidViewModel -// with(getApplication().baseContext) { -// val intent = Intent(this, PlayerActivity::class.java).apply { -// putExtra(getString(R.string.intent_media_id), media.id) -// putExtra(getString(R.string.intent_episode_id), ep.id) -// addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) -// } -// startActivity(intent) -// } - - //(activity as MainActivity).startPlayer(media.id, ep.id) - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/mosad/teapod/activity/main/viewmodel/MediaFragmentViewModel.kt b/app/src/main/java/org/mosad/teapod/activity/main/viewmodel/MediaFragmentViewModel.kt new file mode 100644 index 0000000..9352049 --- /dev/null +++ b/app/src/main/java/org/mosad/teapod/activity/main/viewmodel/MediaFragmentViewModel.kt @@ -0,0 +1,49 @@ +package org.mosad.teapod.activity.main.viewmodel + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import org.mosad.teapod.parser.AoDParser +import org.mosad.teapod.util.* +import org.mosad.teapod.util.DataTypes.MediaType + +/** + * handle media, next ep and tmdb + */ +class MediaFragmentViewModel(application: Application) : AndroidViewModel(application) { + + var media = Media(-1, "", MediaType.OTHER) + internal set + var nextEpisode = Episode() + internal set + var tmdb = TMDBResponse() + internal set + + suspend fun load(mediaId: Int) { + media = AoDParser.getMediaById(mediaId) + tmdb = TMDBApiController().search(media.info.title, media.type) + + if (media.type == MediaType.TVSHOW) { + nextEpisode = if (media.episodes.firstOrNull{ !it.watched } != null) { + media.episodes.first{ !it.watched } + } else { + media.episodes.first() + } + } + } + + /** + * based on watched state and current episode number set the next episode + * if no matching is found, use first episode + */ + fun updateNextEpisode() { + if (media.type == MediaType.MOVIE) return // return if movie + + val currentEpNumber = nextEpisode.number + nextEpisode = if (media.episodes.firstOrNull{ !it.watched } != null) { + media.episodes.first{ !it.watched && it.number > currentEpNumber } + } else { + media.episodes.first() + } + } + +} \ No newline at end of file