diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt index ae43cba..56d8514 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt @@ -151,14 +151,14 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic } } - suspend fun updateOnResume(): List { - return listOf( + suspend fun updateOnResume() { + listOf( viewModelScope.launch { val episodeIDs = episodesCrunchy.items.map { it.id } currentPlayheads = Crunchyroll.playheads(episodeIDs) }, viewModelScope.launch { upNextSeries = Crunchyroll.upNextSeries(seriesCrunchy.id) } - ) + ).joinAll() } /** diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/player/PlayerViewModel.kt b/app/src/main/java/org/mosad/teapod/ui/activity/player/PlayerViewModel.kt index 23c19be..4a50821 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/player/PlayerViewModel.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/player/PlayerViewModel.kt @@ -27,12 +27,16 @@ import android.net.Uri import android.support.v4.media.session.MediaSessionCompat import android.util.Log import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewModelScope +import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem +import com.google.android.exoplayer2.Player import com.google.android.exoplayer2.SimpleExoPlayer import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector import com.google.android.exoplayer2.source.hls.HlsMediaSource import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory import com.google.android.exoplayer2.util.Util +import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import org.mosad.teapod.R import org.mosad.teapod.parser.crunchyroll.Crunchyroll @@ -82,6 +86,22 @@ class PlayerViewModel(application: Application) : AndroidViewModel(application) init { initMediaSession() + + player.addListener(object : Player.Listener { + override fun onPlaybackStateChanged(state: Int) { + super.onPlaybackStateChanged(state) + + if (state == ExoPlayer.STATE_ENDED) updatePlayhead() + } + + override fun onIsPlayingChanged(isPlaying: Boolean) { + super.onIsPlayingChanged(isPlaying) + + if (!isPlaying) updatePlayhead() + } + }) + + } override fun onCleared() { @@ -200,8 +220,6 @@ class PlayerViewModel(application: Application) : AndroidViewModel(application) currentPlayback.streams.adaptive_hls[Locale.ROOT.toLanguageTag()]?.url ?: "" } } - - println("stream url: $url") // create the media source object @@ -214,8 +232,6 @@ class PlayerViewModel(application: Application) : AndroidViewModel(application) player.prepare() if (seekPosition > 0) player.seekTo(seekPosition) player.playWhenReady = true - - // TODO reimplement mark as watched for cr, if needed } /** @@ -254,4 +270,16 @@ class PlayerViewModel(application: Application) : AndroidViewModel(application) return null } -} \ No newline at end of file + /** + * Update the playhead of the current episode, if currentPosition > 1000ms. + */ + private fun updatePlayhead() { + val playhead = (player.currentPosition / 1000) + + if (playhead > 0) { + viewModelScope.launch { Crunchyroll.postPlayheads(currentEpisode.id, playhead.toInt()) } + Log.i(javaClass.name, "Set playhead for episode ${currentEpisode.id} to $playhead sec.") + } + } + +}