From cc1bb234060f6f2d36eb7ecfff971a52558eab86 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 4 Oct 2022 11:22:20 +0200 Subject: [PATCH 1/3] Aggregate voice broadcast state events --- .../timeline/factory/MessageItemFactory.kt | 12 ++++++-- .../timeline/helper/TimelineEventsGroups.kt | 29 +++++++++++++++---- .../item/MessageVoiceBroadcastItem.kt | 2 ++ 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt index e7833c2824..06da69fc1a 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -43,7 +43,9 @@ import im.vector.app.features.home.room.detail.timeline.helper.ContentUploadStat import im.vector.app.features.home.room.detail.timeline.helper.LocationPinProvider import im.vector.app.features.home.room.detail.timeline.helper.MessageInformationDataFactory import im.vector.app.features.home.room.detail.timeline.helper.MessageItemAttributesFactory +import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventsGroup import im.vector.app.features.home.room.detail.timeline.helper.TimelineMediaSizeProvider +import im.vector.app.features.home.room.detail.timeline.helper.VoiceBroadcastEventsGroup import im.vector.app.features.home.room.detail.timeline.item.AbsMessageItem import im.vector.app.features.home.room.detail.timeline.item.MessageAudioItem import im.vector.app.features.home.room.detail.timeline.item.MessageAudioItem_ @@ -81,6 +83,7 @@ import im.vector.app.features.media.VideoContentRenderer import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.voice.AudioWaveformView import im.vector.app.features.voicebroadcast.model.MessageVoiceBroadcastInfoContent +import im.vector.app.features.voicebroadcast.model.VoiceBroadcastState import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence import me.gujun.android.span.span import org.matrix.android.sdk.api.MatrixUrls.isMxcUrl @@ -200,7 +203,7 @@ class MessageItemFactory @Inject constructor( is MessagePollContent -> buildPollItem(messageContent, informationData, highlight, callback, attributes) is MessageLocationContent -> buildLocationItem(messageContent, informationData, highlight, attributes) is MessageBeaconInfoContent -> liveLocationShareMessageItemFactory.create(params.event, highlight, attributes) - is MessageVoiceBroadcastInfoContent -> buildVoiceBroadcastItem(messageContent, highlight, callback, attributes) + is MessageVoiceBroadcastInfoContent -> buildVoiceBroadcastItem(messageContent, params.eventsGroup, highlight, callback, attributes) else -> buildNotHandledMessageItem(messageContent, informationData, highlight, callback, attributes) } return messageItem?.apply { @@ -712,14 +715,19 @@ class MessageItemFactory @Inject constructor( private fun buildVoiceBroadcastItem( messageContent: MessageVoiceBroadcastInfoContent, + eventsGroup: TimelineEventsGroup?, highlight: Boolean, callback: TimelineEventController.Callback?, attributes: AbsMessageItem.Attributes, ): MessageVoiceBroadcastItem? { + if (messageContent.voiceBroadcastState != VoiceBroadcastState.STARTED) return null + val voiceBroadcastEventsGroup = eventsGroup?.let { VoiceBroadcastEventsGroup(it) } ?: return null + val mostRecentEvent = voiceBroadcastEventsGroup.getLastEvent() + val mostRecentMessageContent = (mostRecentEvent.getVectorLastMessageContent() as? MessageVoiceBroadcastInfoContent) ?: return null return MessageVoiceBroadcastItem_() .attributes(attributes) .highlighted(highlight) - .voiceBroadcastState(messageContent.voiceBroadcastState) + .voiceBroadcastState(mostRecentMessageContent.voiceBroadcastState) .leftGuideline(avatarSizeProvider.leftGuideline) .callback(callback) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventsGroups.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventsGroups.kt index 4ff8a9fa43..c25bc83fee 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventsGroups.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventsGroups.kt @@ -17,6 +17,9 @@ package im.vector.app.features.home.room.detail.timeline.helper import im.vector.app.core.utils.TextUtils +import im.vector.app.features.voicebroadcast.STATE_ROOM_VOICE_BROADCAST_INFO +import im.vector.app.features.voicebroadcast.model.MessageVoiceBroadcastInfoContent +import im.vector.app.features.voicebroadcast.model.VoiceBroadcastState import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel @@ -54,12 +57,18 @@ class TimelineEventsGroups { private fun TimelineEvent.getGroupIdOrNull(): String? { val type = root.getClearType() val content = root.getClearContent() - return if (EventType.isCallEvent(type)) { - (content?.get("call_id") as? String) - } else if (type == EventType.STATE_ROOM_WIDGET || type == EventType.STATE_ROOM_WIDGET_LEGACY) { - root.stateKey - } else { - null + return when { + EventType.isCallEvent(type) -> (content?.get("call_id") as? String) + type == STATE_ROOM_VOICE_BROADCAST_INFO -> { + root.content.toModel() + ?.takeUnless { it.voiceBroadcastState == VoiceBroadcastState.STARTED } + ?.relatesTo?.eventId + ?: eventId + } + type == EventType.STATE_ROOM_WIDGET || type == EventType.STATE_ROOM_WIDGET_LEGACY -> root.stateKey + else -> { + null + } } } @@ -128,3 +137,11 @@ class CallSignalingEventsGroup(private val group: TimelineEventsGroup) { return group.events.firstOrNull { it.root.getClearType() == EventType.CALL_REJECT } } } + +class VoiceBroadcastEventsGroup(private val group: TimelineEventsGroup) { + fun getLastEvent(): TimelineEvent { + return group.events + .find { it.root.getClearContent().toModel()?.voiceBroadcastState == VoiceBroadcastState.STOPPED } + ?: group.events.maxBy { it.root.originServerTs ?: 0L } + } +} diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceBroadcastItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceBroadcastItem.kt index bd6a5b7bdb..14a4fc6b07 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceBroadcastItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceBroadcastItem.kt @@ -35,6 +35,8 @@ abstract class MessageVoiceBroadcastItem : AbsMessageItem Date: Tue, 4 Oct 2022 11:44:54 +0200 Subject: [PATCH 2/3] Add changelog file --- changelog.d/7283.wip | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7283.wip diff --git a/changelog.d/7283.wip b/changelog.d/7283.wip new file mode 100644 index 0000000000..f7cbd323f1 --- /dev/null +++ b/changelog.d/7283.wip @@ -0,0 +1 @@ +[Voice Broadcast] Aggregate state events in the timeline From 0a047b60459db10f77b46dcb736bd953dfc1971b Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 5 Oct 2022 15:44:58 +0200 Subject: [PATCH 3/3] Use VoiceBroadcastEvent wrapper --- .../detail/timeline/helper/TimelineEventsGroups.kt | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventsGroups.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventsGroups.kt index c25bc83fee..bd211a4513 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventsGroups.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineEventsGroups.kt @@ -18,8 +18,8 @@ package im.vector.app.features.home.room.detail.timeline.helper import im.vector.app.core.utils.TextUtils import im.vector.app.features.voicebroadcast.STATE_ROOM_VOICE_BROADCAST_INFO -import im.vector.app.features.voicebroadcast.model.MessageVoiceBroadcastInfoContent import im.vector.app.features.voicebroadcast.model.VoiceBroadcastState +import im.vector.app.features.voicebroadcast.model.asVoiceBroadcastEvent import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel @@ -59,12 +59,7 @@ class TimelineEventsGroups { val content = root.getClearContent() return when { EventType.isCallEvent(type) -> (content?.get("call_id") as? String) - type == STATE_ROOM_VOICE_BROADCAST_INFO -> { - root.content.toModel() - ?.takeUnless { it.voiceBroadcastState == VoiceBroadcastState.STARTED } - ?.relatesTo?.eventId - ?: eventId - } + type == STATE_ROOM_VOICE_BROADCAST_INFO -> root.asVoiceBroadcastEvent()?.reference?.eventId type == EventType.STATE_ROOM_WIDGET || type == EventType.STATE_ROOM_WIDGET_LEGACY -> root.stateKey else -> { null @@ -140,8 +135,7 @@ class CallSignalingEventsGroup(private val group: TimelineEventsGroup) { class VoiceBroadcastEventsGroup(private val group: TimelineEventsGroup) { fun getLastEvent(): TimelineEvent { - return group.events - .find { it.root.getClearContent().toModel()?.voiceBroadcastState == VoiceBroadcastState.STOPPED } + return group.events.find { it.root.asVoiceBroadcastEvent()?.content?.voiceBroadcastState == VoiceBroadcastState.STOPPED } ?: group.events.maxBy { it.root.originServerTs ?: 0L } } }