replace runBlocking{} in setCurrentEpisode with suspend

this fixes the player frezzing for a few 100ms when loading a new episode
This commit is contained in:
Jannik 2022-11-26 18:34:32 +01:00
parent 0a31c2fd88
commit 2004a3f483
Signed by: Seil0
GPG Key ID: E8459F3723C52C24
2 changed files with 23 additions and 21 deletions

View File

@ -167,14 +167,14 @@ class PlayerViewModel(application: Application) : AndroidViewModel(application)
*/ */
fun playNextEpisode() = currentEpisode.nextEpisodeId?.let { nextEpisodeId -> fun playNextEpisode() = currentEpisode.nextEpisodeId?.let { nextEpisodeId ->
updatePlayhead() // update playhead before switching to new episode updatePlayhead() // update playhead before switching to new episode
setCurrentEpisode(nextEpisodeId, startPlayback = true) viewModelScope.launch { setCurrentEpisode(nextEpisodeId, startPlayback = true) }
} }
/** /**
* Set currentEpisodeCr to the episode of the given ID * Set currentEpisodeCr to the episode of the given ID
* @param episodeId The ID of the episode you want to set currentEpisodeCr to * @param episodeId The ID of the episode you want to set currentEpisodeCr to
*/ */
fun setCurrentEpisode(episodeId: String, startPlayback: Boolean = false) { suspend fun setCurrentEpisode(episodeId: String, startPlayback: Boolean = false) {
currentEpisode = episodes.items.find { episode -> currentEpisode = episodes.items.find { episode ->
episode.id == episodeId episode.id == episodeId
} ?: NoneEpisode } ?: NoneEpisode
@ -193,26 +193,24 @@ class PlayerViewModel(application: Application) : AndroidViewModel(application)
currentEpisodeChangedListener.forEach { it() } currentEpisodeChangedListener.forEach { it() }
// needs to be blocking, currentPlayback must be present when calling playCurrentMedia() // needs to be blocking, currentPlayback must be present when calling playCurrentMedia()
runBlocking { joinAll(
joinAll( viewModelScope.launch(Dispatchers.IO) {
viewModelScope.launch(Dispatchers.IO) { currentPlayback = Crunchyroll.playback(currentEpisode.playback)
currentPlayback = Crunchyroll.playback(currentEpisode.playback) },
}, viewModelScope.launch(Dispatchers.IO) {
viewModelScope.launch(Dispatchers.IO) { Crunchyroll.playheads(listOf(currentEpisode.id))[currentEpisode.id]?.let {
Crunchyroll.playheads(listOf(currentEpisode.id))[currentEpisode.id]?.let { // if the episode was fully watched, start at the beginning
// if the episode was fully watched, start at the beginning currentPlayhead = if (it.fullyWatched) {
currentPlayhead = if (it.fullyWatched) { 0
0 } else {
} else { (it.playhead.times(1000)).toLong()
(it.playhead.times(1000)).toLong()
}
} }
},
viewModelScope.launch(Dispatchers.IO) {
currentIntroMetadata = Crunchyroll.datalabIntro(currentEpisode.id)
} }
) },
} viewModelScope.launch(Dispatchers.IO) {
currentIntroMetadata = Crunchyroll.datalabIntro(currentEpisode.id)
}
)
Log.d(classTag, "playback: ${currentEpisode.playback}") Log.d(classTag, "playback: ${currentEpisode.playback}")
if (startPlayback) { if (startPlayback) {

View File

@ -7,6 +7,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import kotlinx.coroutines.runBlocking
import org.mosad.teapod.R import org.mosad.teapod.R
import org.mosad.teapod.databinding.PlayerEpisodesListBinding import org.mosad.teapod.databinding.PlayerEpisodesListBinding
import org.mosad.teapod.ui.activity.player.PlayerViewModel import org.mosad.teapod.ui.activity.player.PlayerViewModel
@ -46,7 +47,10 @@ class EpisodeListDialogFragment : DialogFragment() {
model.currentPlayheads.toMap(), model.currentPlayheads.toMap(),
EpisodeItemAdapter.OnClickListener { episode -> EpisodeItemAdapter.OnClickListener { episode ->
dismiss() dismiss()
model.setCurrentEpisode(episode.id, startPlayback = true) // TODO make this none blocking, if necessary?
runBlocking {
model.setCurrentEpisode(episode.id, startPlayback = true)
}
}, },
EpisodeItemAdapter.ViewType.PLAYER EpisodeItemAdapter.ViewType.PLAYER
) )