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:
parent
0a31c2fd88
commit
2004a3f483
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue