diff --git a/changelog.d/8042.misc b/changelog.d/8042.misc new file mode 100644 index 0000000000..dbfe98140c --- /dev/null +++ b/changelog.d/8042.misc @@ -0,0 +1 @@ +[Voice Broadcast] Show Live broadcast in the room list only if the feature flag is enabled in the lab diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/usecase/GetLatestPreviewableEventUseCase.kt b/vector/src/main/java/im/vector/app/features/home/room/list/usecase/GetLatestPreviewableEventUseCase.kt index 6a50e87562..94f9136a2f 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/usecase/GetLatestPreviewableEventUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/usecase/GetLatestPreviewableEventUseCase.kt @@ -17,6 +17,7 @@ package im.vector.app.features.home.room.list.usecase import im.vector.app.core.di.ActiveSessionHolder +import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.voicebroadcast.isLive import im.vector.app.features.voicebroadcast.isVoiceBroadcast import im.vector.app.features.voicebroadcast.model.asVoiceBroadcastEvent @@ -35,14 +36,21 @@ import javax.inject.Inject class GetLatestPreviewableEventUseCase @Inject constructor( private val sessionHolder: ActiveSessionHolder, private val getRoomLiveVoiceBroadcastsUseCase: GetRoomLiveVoiceBroadcastsUseCase, + private val vectorPreferences: VectorPreferences, ) { fun execute(roomId: String): TimelineEvent? { val room = sessionHolder.getSafeActiveSession()?.getRoom(roomId) ?: return null val roomSummary = room.roomSummary() ?: return null - return getCallEvent(roomSummary) - ?: getLiveVoiceBroadcastEvent(room) - ?: getDefaultLatestEvent(room, roomSummary) + // FIXME Observing live broadcasts results in many db requests, + // to prevent performances issues, we only enable this mechanism if the voice broadcast flag is enabled + return if (vectorPreferences.isVoiceBroadcastEnabled()) { + getCallEvent(roomSummary) + ?: getLiveVoiceBroadcastEvent(room) + ?: getDefaultLatestEvent(room, roomSummary) + } else { + roomSummary.latestPreviewableEvent + } } private fun getCallEvent(roomSummary: RoomSummary): TimelineEvent? { 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 b2aebd9932..6f7444849a 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 @@ -24,17 +24,15 @@ import im.vector.app.features.voicebroadcast.model.VoiceBroadcastEvent 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.GetVoiceBroadcastStateEventLiveUseCase +import im.vector.app.features.voicebroadcast.usecase.GetVoiceBroadcastStateEventUseCase import im.vector.app.features.voicebroadcast.voiceBroadcastId import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.emptyFlow -import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.runningReduce -import kotlinx.coroutines.runBlocking import org.matrix.android.sdk.api.session.events.model.RelationType import org.matrix.android.sdk.api.session.room.model.message.MessageAudioEvent import org.matrix.android.sdk.api.session.room.model.message.asMessageAudioEvent @@ -48,7 +46,7 @@ import javax.inject.Inject */ class GetLiveVoiceBroadcastChunksUseCase @Inject constructor( private val activeSessionHolder: ActiveSessionHolder, - private val getVoiceBroadcastEventUseCase: GetVoiceBroadcastStateEventLiveUseCase, + private val getVoiceBroadcastEventUseCase: GetVoiceBroadcastStateEventUseCase, ) { fun execute(voiceBroadcast: VoiceBroadcast): Flow> { @@ -60,7 +58,7 @@ class GetLiveVoiceBroadcastChunksUseCase @Inject constructor( val existingChunks = room.timelineService().getTimelineEventsRelatedTo(RelationType.REFERENCE, voiceBroadcast.voiceBroadcastId) .mapNotNull { timelineEvent -> timelineEvent.root.asMessageAudioEvent().takeIf { it.isVoiceBroadcast() } } - val voiceBroadcastEvent = runBlocking { getVoiceBroadcastEventUseCase.execute(voiceBroadcast).firstOrNull()?.getOrNull() } + val voiceBroadcastEvent = getVoiceBroadcastEventUseCase.execute(voiceBroadcast) val voiceBroadcastState = voiceBroadcastEvent?.content?.voiceBroadcastState return if (voiceBroadcastState == null || voiceBroadcastState == VoiceBroadcastState.STOPPED) { diff --git a/vector/src/test/java/im/vector/app/features/home/room/list/usecase/GetLatestPreviewableEventUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/home/room/list/usecase/GetLatestPreviewableEventUseCaseTest.kt index 5d526c783b..f7dd5da30e 100644 --- a/vector/src/test/java/im/vector/app/features/home/room/list/usecase/GetLatestPreviewableEventUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/home/room/list/usecase/GetLatestPreviewableEventUseCaseTest.kt @@ -23,6 +23,7 @@ import im.vector.app.features.voicebroadcast.model.asVoiceBroadcastEvent import im.vector.app.features.voicebroadcast.usecase.GetRoomLiveVoiceBroadcastsUseCase import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.fakes.FakeRoom +import im.vector.app.test.fakes.FakeVectorPreferences import io.mockk.every import io.mockk.mockk import org.amshove.kluent.shouldBe @@ -46,10 +47,12 @@ internal class GetLatestPreviewableEventUseCaseTest { private val fakeSessionHolder = FakeActiveSessionHolder() private val fakeRoomSummary = mockk() private val fakeGetRoomLiveVoiceBroadcastsUseCase = mockk() + private val fakeVectorPreferences = FakeVectorPreferences() private val getLatestPreviewableEventUseCase = GetLatestPreviewableEventUseCase( fakeSessionHolder.instance, fakeGetRoomLiveVoiceBroadcastsUseCase, + fakeVectorPreferences.instance, ) @Before @@ -62,6 +65,7 @@ internal class GetLatestPreviewableEventUseCaseTest { every { eventId } returns firstArg() } } + fakeVectorPreferences.givenIsVoiceBroadcastEnabled(true) } @Test diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeVectorPreferences.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeVectorPreferences.kt index 3d3f415778..7a5831ffed 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeVectorPreferences.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeVectorPreferences.kt @@ -85,4 +85,8 @@ class FakeVectorPreferences { fun verifySetIpAddressVisibilityInDeviceManagerScreens(isVisible: Boolean) { verify { instance.setIpAddressVisibilityInDeviceManagerScreens(isVisible) } } + + fun givenIsVoiceBroadcastEnabled(isEnabled: Boolean) { + every { instance.isVoiceBroadcastEnabled() } returns isEnabled + } }