move startPlayer() call to the fragment

This commit is contained in:
Jannik 2021-01-31 21:05:43 +01:00
parent d73f9882ff
commit f44dc4ddac
Signed by: Seil0
GPG Key ID: E8459F3723C52C24
4 changed files with 78 additions and 69 deletions

View File

@ -17,6 +17,8 @@ import com.google.android.material.tabs.TabLayoutMediator
import jp.wasabeef.glide.transformations.BlurTransformation import jp.wasabeef.glide.transformations.BlurTransformation
import kotlinx.coroutines.* import kotlinx.coroutines.*
import org.mosad.teapod.R 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.databinding.FragmentMediaBinding
import org.mosad.teapod.util.* import org.mosad.teapod.util.*
import org.mosad.teapod.util.DataTypes.MediaType import org.mosad.teapod.util.DataTypes.MediaType
@ -116,7 +118,7 @@ class MediaFragment(private val mediaId: Int) : Fragment() {
) )
// episodes // episodes
fragments.add(MediaEpisodesFragment()) fragments.add(MediaFragmentEpisodes())
pagerAdapter.notifyDataSetChanged() pagerAdapter.notifyDataSetChanged()
} else if (media.type == MediaType.MOVIE) { } else if (media.type == MediaType.MOVIE) {
@ -141,7 +143,7 @@ class MediaFragment(private val mediaId: Int) : Fragment() {
private fun initActions() = with(model) { private fun initActions() = with(model) {
binding.buttonPlay.setOnClickListener { binding.buttonPlay.setOnClickListener {
when (media.type) { when (media.type) {
MediaType.MOVIE -> playStream(media.episodes.first()) MediaType.MOVIE -> playEpisode(media.episodes.first())
MediaType.TVSHOW -> playEpisode(nextEpisode) MediaType.TVSHOW -> playEpisode(nextEpisode)
else -> Log.e(javaClass.name, "Wrong Type: $media.type") 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 * A simple pager adapter
*/ */

View File

@ -1,15 +1,19 @@
package org.mosad.teapod.activity.main.fragments package org.mosad.teapod.activity.main.fragments
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels 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.databinding.FragmentMediaEpisodesBinding
import org.mosad.teapod.util.Episode
import org.mosad.teapod.util.adapter.EpisodeItemAdapter import org.mosad.teapod.util.adapter.EpisodeItemAdapter
class MediaEpisodesFragment : Fragment() { class MediaFragmentEpisodes : Fragment() {
private lateinit var binding: FragmentMediaEpisodesBinding private lateinit var binding: FragmentMediaEpisodesBinding
private lateinit var adapterRecEpisodes: EpisodeItemAdapter private lateinit var adapterRecEpisodes: EpisodeItemAdapter
@ -27,12 +31,10 @@ class MediaEpisodesFragment : Fragment() {
adapterRecEpisodes = EpisodeItemAdapter(model.media.episodes) adapterRecEpisodes = EpisodeItemAdapter(model.media.episodes)
binding.recyclerEpisodes.adapter = adapterRecEpisodes binding.recyclerEpisodes.adapter = adapterRecEpisodes
println(model.media.episodes)
// set onItemClick only in adapter is initialized // set onItemClick only in adapter is initialized
if (this::adapterRecEpisodes.isInitialized) { if (this::adapterRecEpisodes.isInitialized) {
adapterRecEpisodes.onImageClick = { _, position -> adapterRecEpisodes.onImageClick = { _, position ->
model.playEpisode(model.media.episodes[position]) playEpisode(model.media.episodes[position])
} }
} }
} }
@ -40,6 +42,7 @@ class MediaEpisodesFragment : Fragment() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
// if adapterRecEpisodes is initialized, update the watched state for the episodes
if (this::adapterRecEpisodes.isInitialized) { if (this::adapterRecEpisodes.isInitialized) {
model.media.episodes.forEachIndexed { index, episode -> model.media.episodes.forEachIndexed { index, episode ->
adapterRecEpisodes.updateWatchedState(episode.watched, index) 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
}
} }

View File

@ -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<Application>().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)
}
}

View File

@ -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()
}
}
}