@ -2,12 +2,15 @@ package org.mosad.teapod.ui.activity.player
import android.app.Application
import android.net.Uri
import android.support.v4.media.session.MediaSessionCompat
import android.support.v4.media.session.PlaybackStateCompat
import android.util.Log
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import com.google.android.exoplayer2.C
import com.google.android.exoplayer2.MediaItem
import com.google.android.exoplayer2.SimpleExoPlayer
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
import com.google.android.exoplayer2.source.MediaSource
import com.google.android.exoplayer2.source.hls.HlsMediaSource
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
@ -23,6 +26,7 @@ import org.mosad.teapod.util.Media
import java.util.*
import kotlin.collections.ArrayList
/ * *
* PlayerViewModel handles all stuff related to media / episodes .
* When currentEpisode is changed the player will start playing it ( not initial media ) ,
@ -31,10 +35,13 @@ import kotlin.collections.ArrayList
class PlayerViewModel ( application : Application ) : AndroidViewModel ( application ) {
val player = SimpleExoPlayer . Builder ( application ) . build ( )
val dataSourceFactory = DefaultDataSourceFactory ( application , Util . getUserAgent ( application , " Teapod " ) )
private val dataSourceFactory = DefaultDataSourceFactory ( application , Util . getUserAgent ( application , " Teapod " ) )
private val mediaSession = MediaSessionCompat ( application , " TEAPOD_PLAYER_SESSION " )
lateinit var mStateBuilder : PlaybackStateCompat
val currentEpisodeChangedListener = ArrayList < ( ) -> Unit > ( )
val preferredLanguage = if ( Preferences . preferSecondary ) Locale . JAPANESE else Locale . GERMAN
private val preferredLanguage = if ( Preferences . preferSecondary ) Locale . JAPANESE else Locale . GERMAN
var media : Media = Media ( - 1 , " " , DataTypes . MediaType . OTHER )
internal set
@ -45,13 +52,30 @@ class PlayerViewModel(application: Application) : AndroidViewModel(application)
var currentLanguage : Locale = Locale . ROOT
internal set
init {
initMediaSession ( )
}
override fun onCleared ( ) {
super . onCleared ( )
mediaSession . release ( )
player . release ( )
Log . d ( javaClass . name , " Released player " )
}
/ * *
* set the media session to active
* create a media session connector to set title and description
* /
private fun initMediaSession ( ) {
val mediaSessionConnector = MediaSessionConnector ( mediaSession )
mediaSessionConnector . setPlayer ( player )
mediaSession . isActive = true
}
fun loadMedia ( mediaId : Int , episodeId : Int ) {
runBlocking {
media = AoDParser . getMediaById ( mediaId )
@ -115,6 +139,9 @@ class PlayerViewModel(application: Application) : AndroidViewModel(application)
}
}
/ * *
* change the players media source and start playback
* /
fun playMedia ( source : MediaSource , replace : Boolean = false , seekPosition : Long = 0 ) {
if ( replace || player . contentDuration == C . TIME _UNSET ) {
player . setMediaSource ( source )