From a3cd0ee790d30bae0f2a5360119f0f3f7edadfce Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Thu, 10 Nov 2022 16:34:43 +0100 Subject: [PATCH] Fix fetch playlist task getting stopped event from other voice broadcast --- .../voicebroadcast/VoiceBroadcastExtensions.kt | 3 +++ .../usecase/GetLiveVoiceBroadcastChunksUseCase.kt | 14 ++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/voicebroadcast/VoiceBroadcastExtensions.kt b/vector/src/main/java/im/vector/app/features/voicebroadcast/VoiceBroadcastExtensions.kt index fa8033a211..6faec5a262 100644 --- a/vector/src/main/java/im/vector/app/features/voicebroadcast/VoiceBroadcastExtensions.kt +++ b/vector/src/main/java/im/vector/app/features/voicebroadcast/VoiceBroadcastExtensions.kt @@ -39,6 +39,9 @@ val MessageAudioEvent.sequence: Int? get() = getVoiceBroadcastChunk()?.sequence val MessageAudioEvent.duration get() = content.audioInfo?.duration ?: content.audioWaveformInfo?.duration ?: 0 +val VoiceBroadcastEvent.voiceBroadcastId + get() = reference?.eventId + val VoiceBroadcastEvent.isLive get() = content?.isLive.orFalse() diff --git a/vector/src/main/java/im/vector/app/features/voicebroadcast/listening/usecase/GetLiveVoiceBroadcastChunksUseCase.kt b/vector/src/main/java/im/vector/app/features/voicebroadcast/listening/usecase/GetLiveVoiceBroadcastChunksUseCase.kt index d12a329142..16b15b9a77 100644 --- a/vector/src/main/java/im/vector/app/features/voicebroadcast/listening/usecase/GetLiveVoiceBroadcastChunksUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/voicebroadcast/listening/usecase/GetLiveVoiceBroadcastChunksUseCase.kt @@ -25,6 +25,7 @@ import im.vector.app.features.voicebroadcast.model.VoiceBroadcastState import im.vector.app.features.voicebroadcast.model.asVoiceBroadcastEvent import im.vector.app.features.voicebroadcast.sequence import im.vector.app.features.voicebroadcast.usecase.GetVoiceBroadcastEventUseCase +import im.vector.app.features.voicebroadcast.voiceBroadcastId import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow @@ -73,14 +74,15 @@ class GetLiveVoiceBroadcastChunksUseCase @Inject constructor( // Observe new timeline events val listener = object : Timeline.Listener { - private var lastEventId: String? = null + private var latestEventId: String? = null private var lastSequence: Int? = null override fun onTimelineUpdated(snapshot: List) { - val newEvents = lastEventId?.let { eventId -> snapshot.subList(0, snapshot.indexOfFirst { it.eventId == eventId }) } ?: snapshot + val latestEventIndex = latestEventId?.let { eventId -> snapshot.indexOfFirst { it.eventId == eventId } } + val newEvents = if (latestEventIndex != null) snapshot.subList(0, latestEventIndex) else snapshot // Detect a potential stopped voice broadcast state event - val stopEvent = newEvents.findStopEvent() + val stopEvent = newEvents.findStopEvent(voiceBroadcast) if (stopEvent != null) { lastSequence = stopEvent.content?.lastChunkSequence } @@ -98,7 +100,7 @@ class GetLiveVoiceBroadcastChunksUseCase @Inject constructor( timeline.dispose() } - lastEventId = snapshot.firstOrNull()?.eventId + latestEventId = snapshot.firstOrNull()?.eventId } } @@ -117,8 +119,8 @@ class GetLiveVoiceBroadcastChunksUseCase @Inject constructor( /** * Find a [VoiceBroadcastEvent] with a [VoiceBroadcastState.STOPPED] state. */ - private fun List.findStopEvent(): VoiceBroadcastEvent? = - this.mapNotNull { it.root.asVoiceBroadcastEvent() } + private fun List.findStopEvent(voiceBroadcast: VoiceBroadcast): VoiceBroadcastEvent? = + this.mapNotNull { timelineEvent -> timelineEvent.root.asVoiceBroadcastEvent()?.takeIf { it.voiceBroadcastId == voiceBroadcast.voiceBroadcastId } } .find { it.content?.voiceBroadcastState == VoiceBroadcastState.STOPPED } /**