Bind listener to live playback flag
This commit is contained in:
parent
5eb260e674
commit
2d006f8725
@ -44,7 +44,15 @@ abstract class MessageVoiceBroadcastListeningItem : AbsMessageVoiceBroadcastItem
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun bindVoiceBroadcastItem(holder: Holder) {
|
private fun bindVoiceBroadcastItem(holder: Holder) {
|
||||||
playerListener = VoiceBroadcastPlayer.Listener { renderPlayingState(holder, it) }
|
playerListener = object : VoiceBroadcastPlayer.Listener {
|
||||||
|
override fun onPlayingStateChanged(state: VoiceBroadcastPlayer.State) {
|
||||||
|
renderPlayingState(holder, state)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onLiveModeChanged(isLive: Boolean) {
|
||||||
|
renderLiveIndicator(holder)
|
||||||
|
}
|
||||||
|
}
|
||||||
player.addListener(voiceBroadcast, playerListener)
|
player.addListener(voiceBroadcast, playerListener)
|
||||||
bindSeekBar(holder)
|
bindSeekBar(holder)
|
||||||
bindButtons(holder)
|
bindButtons(holder)
|
||||||
|
@ -78,10 +78,15 @@ interface VoiceBroadcastPlayer {
|
|||||||
/**
|
/**
|
||||||
* Listener related to [VoiceBroadcastPlayer].
|
* Listener related to [VoiceBroadcastPlayer].
|
||||||
*/
|
*/
|
||||||
fun interface Listener {
|
interface Listener {
|
||||||
/**
|
/**
|
||||||
* Notify about [VoiceBroadcastPlayer.playingState] changes.
|
* Notify about [VoiceBroadcastPlayer.playingState] changes.
|
||||||
*/
|
*/
|
||||||
fun onStateChanged(state: State)
|
fun onPlayingStateChanged(state: State) = Unit
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify about [VoiceBroadcastPlayer.isLiveListening] changes.
|
||||||
|
*/
|
||||||
|
fun onLiveModeChanged(isLive: Boolean) = Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,8 @@ class VoiceBroadcastPlayerImpl @Inject constructor(
|
|||||||
listeners[voiceBroadcast.voiceBroadcastId]?.add(listener) ?: run {
|
listeners[voiceBroadcast.voiceBroadcastId]?.add(listener) ?: run {
|
||||||
listeners[voiceBroadcast.voiceBroadcastId] = CopyOnWriteArrayList<Listener>().apply { add(listener) }
|
listeners[voiceBroadcast.voiceBroadcastId] = CopyOnWriteArrayList<Listener>().apply { add(listener) }
|
||||||
}
|
}
|
||||||
listener.onStateChanged(if (voiceBroadcast == currentVoiceBroadcast) playingState else State.IDLE)
|
listener.onPlayingStateChanged(if (voiceBroadcast == currentVoiceBroadcast) playingState else State.IDLE)
|
||||||
|
listener.onLiveModeChanged(if (voiceBroadcast == currentVoiceBroadcast) isLiveListening else false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun removeListener(voiceBroadcast: VoiceBroadcast, listener: Listener) {
|
override fun removeListener(voiceBroadcast: VoiceBroadcast, listener: Listener) {
|
||||||
@ -318,17 +319,41 @@ class VoiceBroadcastPlayerImpl @Inject constructor(
|
|||||||
State.IDLE -> playbackTicker.stopPlaybackTicker(voiceBroadcastId)
|
State.IDLE -> playbackTicker.stopPlaybackTicker(voiceBroadcastId)
|
||||||
}
|
}
|
||||||
// Notify state change to all the listeners attached to the current voice broadcast id
|
// Notify state change to all the listeners attached to the current voice broadcast id
|
||||||
listeners[voiceBroadcastId]?.forEach { listener -> listener.onStateChanged(playingState) }
|
listeners[voiceBroadcastId]?.forEach { listener -> listener.onPlayingStateChanged(playingState) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateLiveListeningMode(playbackPosition: Int? = null) {
|
/**
|
||||||
|
* Update the live listening state according to:
|
||||||
|
* - the voice broadcast state,
|
||||||
|
* - the playing state,
|
||||||
|
* - the potential seek position.
|
||||||
|
*/
|
||||||
|
private fun updateLiveListeningMode(seekPosition: Int? = null) {
|
||||||
isLiveListening = when {
|
isLiveListening = when {
|
||||||
|
// the current voice broadcast is not live (ended)
|
||||||
!currentVoiceBroadcastEvent?.isLive.orFalse() -> false
|
!currentVoiceBroadcastEvent?.isLive.orFalse() -> false
|
||||||
|
// the player is stopped or paused
|
||||||
playingState == State.IDLE || playingState == State.PAUSED -> false
|
playingState == State.IDLE || playingState == State.PAUSED -> false
|
||||||
playbackPosition != null -> playlist.findByPosition(playbackPosition)?.sequence == playlist.lastOrNull()?.sequence
|
// the user has sought
|
||||||
|
seekPosition != null -> {
|
||||||
|
val seekDirection = seekPosition.compareTo(getCurrentPlaybackPosition() ?: 0)
|
||||||
|
when {
|
||||||
|
// backward
|
||||||
|
seekDirection < 0 -> false
|
||||||
|
// forward: check if new sequence is the last one
|
||||||
|
else -> playlist.findByPosition(seekPosition)?.sequence == playlist.lastOrNull()?.sequence
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// otherwise, stay in live or go in live if we reached the last sequence
|
||||||
else -> isLiveListening || playlist.currentSequence == playlist.lastOrNull()?.sequence
|
else -> isLiveListening || playlist.currentSequence == playlist.lastOrNull()?.sequence
|
||||||
}
|
}
|
||||||
|
|
||||||
|
currentVoiceBroadcast?.voiceBroadcastId?.let { voiceBroadcastId ->
|
||||||
|
// Notify live mode change to all the listeners attached to the current voice broadcast id
|
||||||
|
listeners[voiceBroadcastId]?.forEach { listener -> listener.onLiveModeChanged(isLiveListening) }
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getCurrentPlaybackPosition(): Int? {
|
private fun getCurrentPlaybackPosition(): Int? {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user