Improve VoiceBroadcastItemFactory

This commit is contained in:
Florian Renaud 2022-10-24 16:35:16 +02:00
parent 4defc3dded
commit a7c24b23a0
2 changed files with 27 additions and 24 deletions

View File

@ -15,14 +15,14 @@
*/ */
package im.vector.app.features.home.room.detail.timeline.factory package im.vector.app.features.home.room.detail.timeline.factory
import im.vector.app.core.epoxy.VectorEpoxyHolder
import im.vector.app.core.epoxy.VectorEpoxyModel
import im.vector.app.core.resources.ColorProvider import im.vector.app.core.resources.ColorProvider
import im.vector.app.core.resources.DrawableProvider import im.vector.app.core.resources.DrawableProvider
import im.vector.app.features.displayname.getBestName
import im.vector.app.features.home.room.detail.timeline.TimelineEventController import im.vector.app.features.home.room.detail.timeline.TimelineEventController
import im.vector.app.features.home.room.detail.timeline.helper.AvatarSizeProvider import im.vector.app.features.home.room.detail.timeline.helper.AvatarSizeProvider
import im.vector.app.features.home.room.detail.timeline.helper.VoiceBroadcastEventsGroup 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.AbsMessageItem
import im.vector.app.features.home.room.detail.timeline.item.AbsMessageVoiceBroadcastItem
import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceBroadcastListeningItem import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceBroadcastListeningItem
import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceBroadcastListeningItem_ import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceBroadcastListeningItem_
import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceBroadcastRecordingItem import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceBroadcastRecordingItem
@ -34,7 +34,7 @@ import im.vector.app.features.voicebroadcast.model.VoiceBroadcastState
import im.vector.app.features.voicebroadcast.model.asVoiceBroadcastEvent import im.vector.app.features.voicebroadcast.model.asVoiceBroadcastEvent
import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.getRoom import org.matrix.android.sdk.api.session.getRoom
import org.matrix.android.sdk.api.session.getUser import org.matrix.android.sdk.api.session.getUserOrDefault
import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.api.util.toMatrixItem
import javax.inject.Inject import javax.inject.Inject
@ -53,31 +53,31 @@ class VoiceBroadcastItemFactory @Inject constructor(
highlight: Boolean, highlight: Boolean,
callback: TimelineEventController.Callback?, callback: TimelineEventController.Callback?,
attributes: AbsMessageItem.Attributes, attributes: AbsMessageItem.Attributes,
): VectorEpoxyModel<out VectorEpoxyHolder>? { ): AbsMessageVoiceBroadcastItem<*>? {
// Only display item of the initial event with updated data // Only display item of the initial event with updated data
if (messageContent.voiceBroadcastState != VoiceBroadcastState.STARTED) return null if (messageContent.voiceBroadcastState != VoiceBroadcastState.STARTED) return null
val eventsGroup = params.eventsGroup ?: return null
val voiceBroadcastEventsGroup = VoiceBroadcastEventsGroup(eventsGroup) val voiceBroadcastEventsGroup = params.eventsGroup?.let { VoiceBroadcastEventsGroup(it) } ?: return null
val mostRecentTimelineEvent = voiceBroadcastEventsGroup.getLastDisplayableEvent() val voiceBroadcastEvent = voiceBroadcastEventsGroup.getLastDisplayableEvent().root.asVoiceBroadcastEvent() ?: return null
val mostRecentEvent = mostRecentTimelineEvent.root.asVoiceBroadcastEvent() val voiceBroadcastContent = voiceBroadcastEvent.content ?: return null
val mostRecentMessageContent = mostRecentEvent?.content ?: return null val voiceBroadcastId = voiceBroadcastEventsGroup.voiceBroadcastId
val isRecording = mostRecentMessageContent.voiceBroadcastState != VoiceBroadcastState.STOPPED && mostRecentEvent.root.stateKey == session.myUserId
val recorderName = mostRecentTimelineEvent.root.stateKey?.let { session.getUser(it) }?.displayName ?: mostRecentTimelineEvent.root.stateKey val isRecording = voiceBroadcastContent.voiceBroadcastState != VoiceBroadcastState.STOPPED && voiceBroadcastEvent.root.stateKey == session.myUserId
return if (isRecording) { return if (isRecording) {
createRecordingItem( createRecordingItem(
params.event.roomId, params,
eventsGroup.groupId, voiceBroadcastId,
mostRecentMessageContent.voiceBroadcastState, voiceBroadcastContent.voiceBroadcastState,
highlight, highlight,
callback, callback,
attributes attributes
) )
} else { } else {
createListeningItem( createListeningItem(
params.event.roomId, params,
eventsGroup.groupId, voiceBroadcastId,
mostRecentMessageContent.voiceBroadcastState, voiceBroadcastContent.voiceBroadcastState,
recorderName,
highlight, highlight,
callback, callback,
attributes attributes
@ -86,14 +86,14 @@ class VoiceBroadcastItemFactory @Inject constructor(
} }
private fun createRecordingItem( private fun createRecordingItem(
roomId: String, params: TimelineItemFactoryParams,
voiceBroadcastId: String, voiceBroadcastId: String,
voiceBroadcastState: VoiceBroadcastState?, voiceBroadcastState: VoiceBroadcastState?,
highlight: Boolean, highlight: Boolean,
callback: TimelineEventController.Callback?, callback: TimelineEventController.Callback?,
attributes: AbsMessageItem.Attributes, attributes: AbsMessageItem.Attributes,
): MessageVoiceBroadcastRecordingItem { ): MessageVoiceBroadcastRecordingItem {
val roomSummary = session.getRoom(roomId)?.roomSummary() val roomSummary = session.getRoom(params.event.roomId)?.roomSummary()
return MessageVoiceBroadcastRecordingItem_() return MessageVoiceBroadcastRecordingItem_()
.id("voice_broadcast_$voiceBroadcastId") .id("voice_broadcast_$voiceBroadcastId")
.attributes(attributes) .attributes(attributes)
@ -109,15 +109,15 @@ class VoiceBroadcastItemFactory @Inject constructor(
} }
private fun createListeningItem( private fun createListeningItem(
roomId: String, params: TimelineItemFactoryParams,
voiceBroadcastId: String, voiceBroadcastId: String,
voiceBroadcastState: VoiceBroadcastState?, voiceBroadcastState: VoiceBroadcastState?,
broadcasterName: String?,
highlight: Boolean, highlight: Boolean,
callback: TimelineEventController.Callback?, callback: TimelineEventController.Callback?,
attributes: AbsMessageItem.Attributes, attributes: AbsMessageItem.Attributes,
): MessageVoiceBroadcastListeningItem { ): MessageVoiceBroadcastListeningItem {
val roomSummary = session.getRoom(roomId)?.roomSummary() val roomSummary = session.getRoom(params.event.roomId)?.roomSummary()
val recorderName = params.event.root.stateKey?.let { session.getUserOrDefault(it) }?.toMatrixItem()?.getBestName()
return MessageVoiceBroadcastListeningItem_() return MessageVoiceBroadcastListeningItem_()
.id("voice_broadcast_$voiceBroadcastId") .id("voice_broadcast_$voiceBroadcastId")
.attributes(attributes) .attributes(attributes)
@ -128,7 +128,7 @@ class VoiceBroadcastItemFactory @Inject constructor(
.voiceBroadcastPlayer(voiceBroadcastPlayer) .voiceBroadcastPlayer(voiceBroadcastPlayer)
.voiceBroadcastId(voiceBroadcastId) .voiceBroadcastId(voiceBroadcastId)
.voiceBroadcastState(voiceBroadcastState) .voiceBroadcastState(voiceBroadcastState)
.broadcasterName(broadcasterName) .broadcasterName(recorderName)
.leftGuideline(avatarSizeProvider.leftGuideline) .leftGuideline(avatarSizeProvider.leftGuideline)
.callback(callback) .callback(callback)
} }

View File

@ -141,6 +141,9 @@ class CallSignalingEventsGroup(private val group: TimelineEventsGroup) {
} }
class VoiceBroadcastEventsGroup(private val group: TimelineEventsGroup) { class VoiceBroadcastEventsGroup(private val group: TimelineEventsGroup) {
val voiceBroadcastId = group.groupId
fun getLastDisplayableEvent(): TimelineEvent { fun getLastDisplayableEvent(): TimelineEvent {
return group.events.find { it.root.asVoiceBroadcastEvent()?.content?.voiceBroadcastState == VoiceBroadcastState.STOPPED } return group.events.find { it.root.asVoiceBroadcastEvent()?.content?.voiceBroadcastState == VoiceBroadcastState.STOPPED }
?: group.events.filter { it.root.type == VoiceBroadcastConstants.STATE_ROOM_VOICE_BROADCAST_INFO }.maxBy { it.root.originServerTs ?: 0L } ?: group.events.filter { it.root.type == VoiceBroadcastConstants.STATE_ROOM_VOICE_BROADCAST_INFO }.maxBy { it.root.originServerTs ?: 0L }