Make PlayerState stable
This commit is contained in:
@@ -2,56 +2,55 @@ package it.vfsfitvnm.vimusic.utils
|
|||||||
|
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.*
|
||||||
import androidx.compose.runtime.mutableStateOf
|
|
||||||
import androidx.compose.runtime.setValue
|
|
||||||
import androidx.media3.common.*
|
import androidx.media3.common.*
|
||||||
import kotlin.math.absoluteValue
|
import kotlin.math.absoluteValue
|
||||||
|
|
||||||
open class PlayerState(val mediaController: Player) : Player.Listener {
|
@Stable
|
||||||
|
open class PlayerState(private val player: Player) : Player.Listener {
|
||||||
private val handler = Handler(Looper.getMainLooper())
|
private val handler = Handler(Looper.getMainLooper())
|
||||||
|
|
||||||
var currentPosition by mutableStateOf(mediaController.currentPosition)
|
var currentPosition by mutableStateOf(player.currentPosition)
|
||||||
|
|
||||||
var duration by mutableStateOf(mediaController.duration)
|
var duration by mutableStateOf(player.duration)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
val progress: Float
|
val progress: Float
|
||||||
get() = currentPosition.toFloat() / duration.absoluteValue
|
get() = currentPosition.toFloat() / duration.absoluteValue
|
||||||
|
|
||||||
var playbackState by mutableStateOf(mediaController.playbackState)
|
var playbackState by mutableStateOf(player.playbackState)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var mediaItemIndex by mutableStateOf(mediaController.currentMediaItemIndex)
|
var mediaItemIndex by mutableStateOf(player.currentMediaItemIndex)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var mediaItem by mutableStateOf(mediaController.currentMediaItem)
|
var mediaItem by mutableStateOf(player.currentMediaItem)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var mediaMetadata by mutableStateOf(mediaController.mediaMetadata)
|
var mediaMetadata by mutableStateOf(player.mediaMetadata)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var isPlaying by mutableStateOf(mediaController.isPlaying)
|
var isPlaying by mutableStateOf(player.isPlaying)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var playWhenReady by mutableStateOf(mediaController.playWhenReady)
|
var playWhenReady by mutableStateOf(player.playWhenReady)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var repeatMode by mutableStateOf(mediaController.repeatMode)
|
var repeatMode by mutableStateOf(player.repeatMode)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var error by mutableStateOf(mediaController.playerError)
|
var error by mutableStateOf(player.playerError)
|
||||||
|
|
||||||
var mediaItems by mutableStateOf(mediaController.currentTimeline.mediaItems)
|
var mediaItems by mutableStateOf(player.currentTimeline.mediaItems)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var volume by mutableStateOf(mediaController.volume)
|
var volume by mutableStateOf(player.volume)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
init {
|
init {
|
||||||
handler.post(object : Runnable {
|
handler.post(object : Runnable {
|
||||||
override fun run() {
|
override fun run() {
|
||||||
currentPosition = mediaController.currentPosition
|
currentPosition = player.currentPosition
|
||||||
handler.postDelayed(this, 500)
|
handler.postDelayed(this, 500)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -62,7 +61,7 @@ open class PlayerState(val mediaController: Player) : Player.Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onPlaybackStateChanged(playbackState: Int) {
|
override fun onPlaybackStateChanged(playbackState: Int) {
|
||||||
duration = mediaController.duration
|
duration = player.duration
|
||||||
this.playbackState = playbackState
|
this.playbackState = playbackState
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,7 +79,7 @@ open class PlayerState(val mediaController: Player) : Player.Listener {
|
|||||||
|
|
||||||
override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
|
override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
|
||||||
this.mediaItem = mediaItem
|
this.mediaItem = mediaItem
|
||||||
mediaItemIndex = mediaController.currentMediaItemIndex
|
mediaItemIndex = player.currentMediaItemIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRepeatModeChanged(repeatMode: Int) {
|
override fun onRepeatModeChanged(repeatMode: Int) {
|
||||||
@@ -93,6 +92,6 @@ open class PlayerState(val mediaController: Player) : Player.Listener {
|
|||||||
|
|
||||||
override fun onTimelineChanged(timeline: Timeline, reason: Int) {
|
override fun onTimelineChanged(timeline: Timeline, reason: Int) {
|
||||||
mediaItems = timeline.mediaItems
|
mediaItems = timeline.mediaItems
|
||||||
mediaItemIndex = mediaController.currentMediaItemIndex
|
mediaItemIndex = player.currentMediaItemIndex
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import it.vfsfitvnm.youtubemusic.YouTube
|
|||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
class YoutubePlayer(mediaController: Player) : PlayerState(mediaController) {
|
class YoutubePlayer(player: Player) : PlayerState(player) {
|
||||||
data class Radio(
|
data class Radio(
|
||||||
private val videoId: String? = null,
|
private val videoId: String? = null,
|
||||||
private val playlistId: String? = null,
|
private val playlistId: String? = null,
|
||||||
|
|||||||
Reference in New Issue
Block a user