Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Player.cast not available before first source change #49

Merged
merged 1 commit into from
Oct 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
> - 🏠 Internal
> - 💅 Polish

## Unreleased

* 🐛 Fix `Player.cast` not available before first source change.

## v1.9.1 (2024-10-01)

* 🐛 Fix `DurationDisplay` to show the time of the live point when playing a live or DVR stream.
Expand Down
39 changes: 27 additions & 12 deletions ui/src/main/java/com/theoplayer/android/ui/Player.kt
Original file line number Diff line number Diff line change
Expand Up @@ -296,8 +296,6 @@ enum class StreamType {
internal class PlayerImpl(override val theoplayerView: THEOplayerView?) : Player {
override val player = theoplayerView?.player
override val ads = theoplayerView?.player?.ads
override var cast by mutableStateOf<Cast?>(null)
private set
override var currentTime by mutableStateOf(0.0)
private set
override var duration by mutableStateOf(Double.NaN)
Expand Down Expand Up @@ -368,8 +366,6 @@ internal class PlayerImpl(override val theoplayerView: THEOplayerView?) : Player
_source = player?.source
error = null
firstPlay = false
// The cast integration is only registered *after* rememberPlayer() is called,
// so it's not available at construction time. Check if it's available now.
updateCast(theoplayerView?.cast)
updateCurrentTimeAndPlaybackState()
updateDuration()
Expand Down Expand Up @@ -612,12 +608,31 @@ internal class PlayerImpl(override val theoplayerView: THEOplayerView?) : Player
private val textTrackListChangeListener =
EventListener<TextTrackListChangeEvent> { updateActiveSubtitleTrack() }

override var castState: PlayerCastState by mutableStateOf(PlayerCastState.UNAVAILABLE)
override var castReceiverName: String? by mutableStateOf(null)
private var _cast by mutableStateOf<Cast?>(null)
private var _castState: PlayerCastState by mutableStateOf(PlayerCastState.UNAVAILABLE)
private var _castReceiverName: String? by mutableStateOf(null)
override val cast: Cast?
get() {
// The cast integration is only registered *after* rememberPlayer() is called,
// so it might not be available at construction time.
// Always use the getter on THEOplayerView to get the current cast integration.
updateCast(theoplayerView?.cast)
return _cast
}
override val castState: PlayerCastState
get() {
updateCast(theoplayerView?.cast)
return _castState
}
override val castReceiverName: String?
get() {
updateCast(theoplayerView?.cast)
return _castReceiverName
}

private fun updateCast(cast: Cast?) {
if (this.cast == cast) return
this.cast?.let { oldCast ->
if (_cast == cast) return
_cast?.let { oldCast ->
oldCast.chromecast.removeEventListener(
ChromecastEventTypes.STATECHANGE,
chromecastStateChangeListener
Expand All @@ -627,7 +642,7 @@ internal class PlayerImpl(override val theoplayerView: THEOplayerView?) : Player
chromecastErrorListener
)
}
this.cast = cast
_cast = cast
cast?.let {
cast.chromecast.addEventListener(
ChromecastEventTypes.STATECHANGE,
Expand All @@ -639,8 +654,8 @@ internal class PlayerImpl(override val theoplayerView: THEOplayerView?) : Player
}

private fun updateCastState() {
castState = cast?.chromecast?.state ?: PlayerCastState.UNAVAILABLE
castReceiverName = cast?.chromecast?.receiverName
_castState = cast?.chromecast?.state ?: PlayerCastState.UNAVAILABLE
_castReceiverName = cast?.chromecast?.receiverName
}

private val chromecastStateChangeListener =
Expand All @@ -657,6 +672,7 @@ internal class PlayerImpl(override val theoplayerView: THEOplayerView?) : Player
updateActiveVideoTrack()
updateAudioTracks()
updateSubtitleTracks()
updateCast(theoplayerView?.cast)
updateCastState()
player?.addEventListener(PlayerEventTypes.PLAY, playListener)
player?.addEventListener(PlayerEventTypes.PAUSE, pauseListener)
Expand Down Expand Up @@ -710,7 +726,6 @@ internal class PlayerImpl(override val theoplayerView: THEOplayerView?) : Player
ads?.addEventListener(AdsEventTypes.AD_BREAK_BEGIN, adListener)
ads?.addEventListener(AdsEventTypes.AD_SKIP, adListener)
ads?.addEventListener(AdsEventTypes.AD_BREAK_END, adListener)
updateCast(theoplayerView?.cast)
fullscreenHandler?.onFullscreenChangeListener = fullscreenListener
}

Expand Down