diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt index 3ea3345814..d3780ebe60 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/events/model/Event.kt @@ -228,12 +228,3 @@ fun Event.isVideoMessage(): Boolean { else -> false } } - -fun Event.isPreviewableMessage(): Boolean { - return getClearType() == EventType.MESSAGE - && when (getClearContent()?.toModel()?.msgType) { - MessageType.MSGTYPE_IMAGE, - MessageType.MSGTYPE_VIDEO -> true - else -> false - } -} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/uploads/GetUploadsResult.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/uploads/GetUploadsResult.kt index 3e194beae5..bbe8641edd 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/uploads/GetUploadsResult.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/uploads/GetUploadsResult.kt @@ -16,13 +16,12 @@ package im.vector.matrix.android.api.session.room.uploads -import im.vector.matrix.android.api.session.events.model.Event - data class GetUploadsResult( // List of fetched Events, most recent first - val events: List, + val events: List, // token to get more events val nextToken: String, // True if there are more event to load val hasMore: Boolean ) + diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/uploads/UploadEvent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/uploads/UploadEvent.kt new file mode 100644 index 0000000000..93ce59a233 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/uploads/UploadEvent.kt @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.matrix.android.api.session.room.uploads + +import im.vector.matrix.android.api.session.events.model.Event +import im.vector.matrix.android.api.session.room.model.message.MessageWithAttachmentContent + +/** + * Wrapper around on Event. + * Similar to [im.vector.matrix.android.api.session.room.timeline.TimelineEvent], contains an Event with extra useful data + */ +data class UploadEvent( + val root: Event, + val eventId: String, + val contentWithAttachmentContent: MessageWithAttachmentContent, + val uploadSenderInfo: UploadSenderInfo +) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/uploads/UploadSenderInfo.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/uploads/UploadSenderInfo.kt new file mode 100644 index 0000000000..0fa4b2cb68 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/uploads/UploadSenderInfo.kt @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.matrix.android.api.session.room.uploads + +// TODO Maybe use this model for TimelineEvent as well +data class UploadSenderInfo( + val senderId: String, + val senderName: String?, + val isUniqueDisplayName: Boolean, + val senderAvatar: String? +) { + fun getDisambiguatedDisplayName(): String { + return when { + senderName.isNullOrBlank() -> senderId + isUniqueDisplayName -> senderName + else -> "$senderName (${senderId})" + } + } +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomDisplayNameResolver.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomDisplayNameResolver.kt index feb05a3275..e7a68b3b5b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomDisplayNameResolver.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/RoomDisplayNameResolver.kt @@ -126,6 +126,7 @@ internal class RoomDisplayNameResolver @Inject constructor(private val context: return name ?: roomId } + /** See [im.vector.matrix.android.api.session.room.timeline.TimelineEvent.getDisambiguatedDisplayName] */ private fun resolveRoomMemberName(roomMemberSummary: RoomMemberSummaryEntity?, roomMemberHelper: RoomMemberHelper): String? { if (roomMemberSummary == null) return null diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/uploads/GetUploadsTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/uploads/GetUploadsTask.kt index d51c72046f..f6fd2a442b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/uploads/GetUploadsTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/uploads/GetUploadsTask.kt @@ -16,10 +16,17 @@ package im.vector.matrix.android.internal.session.room.uploads +import com.zhuinden.monarchy.Monarchy +import im.vector.matrix.android.api.session.events.model.toModel +import im.vector.matrix.android.api.session.room.model.message.MessageContent +import im.vector.matrix.android.api.session.room.model.message.MessageWithAttachmentContent import im.vector.matrix.android.api.session.room.uploads.GetUploadsResult +import im.vector.matrix.android.api.session.room.uploads.UploadEvent +import im.vector.matrix.android.api.session.room.uploads.UploadSenderInfo import im.vector.matrix.android.internal.network.executeRequest import im.vector.matrix.android.internal.session.filter.FilterFactory import im.vector.matrix.android.internal.session.room.RoomAPI +import im.vector.matrix.android.internal.session.room.membership.RoomMemberHelper import im.vector.matrix.android.internal.session.room.timeline.PaginationDirection import im.vector.matrix.android.internal.session.room.timeline.PaginationResponse import im.vector.matrix.android.internal.session.sync.SyncTokenStore @@ -39,6 +46,7 @@ internal interface GetUploadsTask : Task() + + val cacheOfSenderInfos = mutableMapOf() + + // Get a snapshot of all room members + monarchy.doWithRealm { realm -> + val roomMemberHelper = RoomMemberHelper(realm, params.roomId) + + uploadEvents = chunk.events.mapNotNull { event -> + val eventId = event.eventId ?: return@mapNotNull null + val messageContent = event.getClearContent()?.toModel() ?: return@mapNotNull null + val messageWithAttachmentContent = (messageContent as? MessageWithAttachmentContent) ?: return@mapNotNull null + val senderId = event.senderId ?: return@mapNotNull null + + val senderInfo = cacheOfSenderInfos.getOrPut(senderId) { + val roomMemberSummaryEntity = roomMemberHelper.getLastRoomMember(senderId) + UploadSenderInfo( + senderId = senderId, + senderName = roomMemberSummaryEntity?.displayName, + isUniqueDisplayName = roomMemberHelper.isUniqueDisplayName(roomMemberSummaryEntity?.displayName), + senderAvatar = roomMemberSummaryEntity?.avatarUrl + ) + } + + UploadEvent( + root = event, + eventId = eventId, + contentWithAttachmentContent = messageWithAttachmentContent, + uploadSenderInfo = senderInfo + ) + } + } + + return GetUploadsResult( - events = chunk.events, + events = uploadEvents, nextToken = chunk.end ?: "", hasMore = chunk.hasMore() ) diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsAction.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsAction.kt index 667e5ab770..59571de122 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsAction.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsAction.kt @@ -16,13 +16,12 @@ package im.vector.riotx.features.roomprofile.uploads -import im.vector.matrix.android.api.session.events.model.Event -import im.vector.matrix.android.api.session.room.model.message.MessageWithAttachmentContent +import im.vector.matrix.android.api.session.room.uploads.UploadEvent import im.vector.riotx.core.platform.VectorViewModelAction sealed class RoomUploadsAction : VectorViewModelAction { - data class Download(val event: Event, val messageContent: MessageWithAttachmentContent) : RoomUploadsAction() - data class Share(val event: Event, val messageContent: MessageWithAttachmentContent) : RoomUploadsAction() + data class Download(val uploadEvent: UploadEvent) : RoomUploadsAction() + data class Share(val uploadEvent: UploadEvent) : RoomUploadsAction() object Retry : RoomUploadsAction() object LoadMore : RoomUploadsAction() diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsViewModel.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsViewModel.kt index 3239f88ace..dcb0963ef0 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsViewModel.kt @@ -27,11 +27,8 @@ import com.airbnb.mvrx.ViewModelContext import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject import im.vector.matrix.android.api.session.Session -import im.vector.matrix.android.api.session.events.model.EventType -import im.vector.matrix.android.api.session.events.model.isPreviewableMessage -import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.file.FileService -import im.vector.matrix.android.api.session.room.model.message.MessageContent +import im.vector.matrix.android.api.session.room.model.message.MessageType import im.vector.matrix.android.api.session.room.model.message.getFileUrl import im.vector.matrix.android.api.session.room.uploads.GetUploadsResult import im.vector.matrix.android.internal.crypto.attachments.toElementToDecrypt @@ -100,8 +97,10 @@ class RoomUploadsViewModel @AssistedInject constructor( token = result.nextToken val groupedEvents = result.events - .filter { it.getClearType() == EventType.MESSAGE && it.getClearContent()?.toModel() != null } - .groupBy { it.isPreviewableMessage() } + .groupBy { + it.contentWithAttachmentContent.msgType == MessageType.MSGTYPE_IMAGE + || it.contentWithAttachmentContent.msgType == MessageType.MSGTYPE_VIDEO + } setState { copy( @@ -139,10 +138,10 @@ class RoomUploadsViewModel @AssistedInject constructor( val file = awaitCallback { session.downloadFile( FileService.DownloadMode.FOR_EXTERNAL_SHARE, - action.event.eventId ?: "", - action.messageContent.body, - action.messageContent.getFileUrl(), - action.messageContent.encryptedFileInfo?.toElementToDecrypt(), + action.uploadEvent.eventId, + action.uploadEvent.contentWithAttachmentContent.body, + action.uploadEvent.contentWithAttachmentContent.getFileUrl(), + action.uploadEvent.contentWithAttachmentContent.encryptedFileInfo?.toElementToDecrypt(), it ) } @@ -159,14 +158,14 @@ class RoomUploadsViewModel @AssistedInject constructor( val file = awaitCallback { session.downloadFile( FileService.DownloadMode.FOR_EXTERNAL_SHARE, - action.event.eventId ?: "", - action.messageContent.body, - action.messageContent.getFileUrl(), - action.messageContent.encryptedFileInfo?.toElementToDecrypt(), + action.uploadEvent.eventId, + action.uploadEvent.contentWithAttachmentContent.body, + action.uploadEvent.contentWithAttachmentContent.getFileUrl(), + action.uploadEvent.contentWithAttachmentContent.encryptedFileInfo?.toElementToDecrypt(), it) } - _viewEvents.post(RoomUploadsViewEvents.FileReadyForSaving(file, action.messageContent.body)) + _viewEvents.post(RoomUploadsViewEvents.FileReadyForSaving(file, action.uploadEvent.contentWithAttachmentContent.body)) } catch (failure: Throwable) { _viewEvents.post(RoomUploadsViewEvents.Failure(failure)) } diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsViewState.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsViewState.kt index 31c4e937c8..bed3b264cd 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsViewState.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/RoomUploadsViewState.kt @@ -19,16 +19,16 @@ package im.vector.riotx.features.roomprofile.uploads import com.airbnb.mvrx.Async import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.Uninitialized -import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.room.model.RoomSummary +import im.vector.matrix.android.api.session.room.uploads.UploadEvent import im.vector.riotx.features.roomprofile.RoomProfileArgs data class RoomUploadsViewState( val roomId: String = "", val roomSummary: Async = Uninitialized, // Store cumul of pagination result, grouped by type - val mediaEvents: List = emptyList(), - val fileEvents: List = emptyList(), + val mediaEvents: List = emptyList(), + val fileEvents: List = emptyList(), // Current pagination request val asyncEventsRequest: Async = Uninitialized, // True if more result are available server side diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/files/RoomUploadsFilesFragment.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/files/RoomUploadsFilesFragment.kt index 2798cdc683..63f9e5215e 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/files/RoomUploadsFilesFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/files/RoomUploadsFilesFragment.kt @@ -20,8 +20,7 @@ import android.os.Bundle import android.view.View import com.airbnb.mvrx.parentFragmentViewModel import com.airbnb.mvrx.withState -import im.vector.matrix.android.api.session.events.model.Event -import im.vector.matrix.android.api.session.room.model.message.MessageWithAttachmentContent +import im.vector.matrix.android.api.session.room.uploads.UploadEvent import im.vector.riotx.R import im.vector.riotx.core.extensions.cleanup import im.vector.riotx.core.extensions.configureWith @@ -54,8 +53,9 @@ class RoomUploadsFilesFragment @Inject constructor( controller.listener = null } - override fun onOpenClicked(event: Event) { - TODO() + override fun onOpenClicked(uploadEvent: UploadEvent) { + // Same action than Share + uploadsViewModel.handle(RoomUploadsAction.Share(uploadEvent)) } override fun onRetry() { @@ -66,12 +66,12 @@ class RoomUploadsFilesFragment @Inject constructor( uploadsViewModel.handle(RoomUploadsAction.LoadMore) } - override fun onDownloadClicked(event: Event, messageWithAttachmentContent: MessageWithAttachmentContent) { - uploadsViewModel.handle(RoomUploadsAction.Download(event, messageWithAttachmentContent)) + override fun onDownloadClicked(uploadEvent: UploadEvent) { + uploadsViewModel.handle(RoomUploadsAction.Download(uploadEvent)) } - override fun onShareClicked(event: Event, messageWithAttachmentContent: MessageWithAttachmentContent) { - uploadsViewModel.handle(RoomUploadsAction.Share(event, messageWithAttachmentContent)) + override fun onShareClicked(uploadEvent: UploadEvent) { + uploadsViewModel.handle(RoomUploadsAction.Share(uploadEvent)) } override fun invalidate() = withState(uploadsViewModel) { state -> diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/files/UploadsFileController.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/files/UploadsFileController.kt index 0ad173be88..918fc433c9 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/files/UploadsFileController.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/files/UploadsFileController.kt @@ -21,10 +21,7 @@ import com.airbnb.epoxy.VisibilityState import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Loading import com.airbnb.mvrx.Success -import im.vector.matrix.android.api.session.events.model.Event -import im.vector.matrix.android.api.session.events.model.toModel -import im.vector.matrix.android.api.session.room.model.message.MessageContent -import im.vector.matrix.android.api.session.room.model.message.MessageWithAttachmentContent +import im.vector.matrix.android.api.session.room.uploads.UploadEvent import im.vector.riotx.R import im.vector.riotx.core.date.VectorDateFormatter import im.vector.riotx.core.epoxy.errorWithRetryItem @@ -44,9 +41,9 @@ class UploadsFileController @Inject constructor( interface Listener { fun onRetry() fun loadMore() - fun onOpenClicked(event: Event) - fun onDownloadClicked(event: Event, messageWithAttachmentContent: MessageWithAttachmentContent) - fun onShareClicked(event: Event, messageWithAttachmentContent: MessageWithAttachmentContent) + fun onOpenClicked(uploadEvent: UploadEvent) + fun onDownloadClicked(uploadEvent: UploadEvent) + fun onShareClicked(uploadEvent: UploadEvent) } var listener: Listener? = null @@ -106,27 +103,25 @@ class UploadsFileController @Inject constructor( } } - private fun buildFileItems(fileEvents: List) { - fileEvents.forEach { - val messageContent = it.getClearContent()?.toModel() ?: return@forEach - val messageWithAttachmentContent = (messageContent as? MessageWithAttachmentContent) ?: return@forEach - + private fun buildFileItems(fileEvents: List) { + fileEvents.forEach { uploadEvent -> uploadsFileItem { - id(it.eventId ?: "") - title(messageWithAttachmentContent.body) - // TODO Resolve user displayName - subtitle(stringProvider.getString(R.string.uploads_files_subtitle, it.senderId, dateFormatter.formatRelativeDateTime(it.originServerTs))) + id(uploadEvent.eventId) + title(uploadEvent.contentWithAttachmentContent.body) + subtitle(stringProvider.getString(R.string.uploads_files_subtitle, + uploadEvent.uploadSenderInfo.getDisambiguatedDisplayName(), + dateFormatter.formatRelativeDateTime(uploadEvent.root.originServerTs))) listener(object : UploadsFileItem.Listener { override fun onItemClicked() { - listener?.onOpenClicked(it) + listener?.onOpenClicked(uploadEvent) } override fun onDownloadClicked() { - listener?.onDownloadClicked(it, messageWithAttachmentContent) + listener?.onDownloadClicked(uploadEvent) } override fun onShareClicked() { - listener?.onShareClicked(it, messageWithAttachmentContent) + listener?.onShareClicked(uploadEvent) } }) } diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/media/UploadsMediaController.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/media/UploadsMediaController.kt index c6e3666fb5..1d797bec78 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/media/UploadsMediaController.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/uploads/media/UploadsMediaController.kt @@ -22,13 +22,11 @@ import com.airbnb.epoxy.VisibilityState import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Loading import com.airbnb.mvrx.Success -import im.vector.matrix.android.api.session.events.model.Event -import im.vector.matrix.android.api.session.events.model.isImageMessage -import im.vector.matrix.android.api.session.events.model.isVideoMessage -import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.room.model.message.MessageImageContent +import im.vector.matrix.android.api.session.room.model.message.MessageType import im.vector.matrix.android.api.session.room.model.message.MessageVideoContent import im.vector.matrix.android.api.session.room.model.message.getFileUrl +import im.vector.matrix.android.api.session.room.uploads.UploadEvent import im.vector.matrix.android.internal.crypto.attachments.toElementToDecrypt import im.vector.riotx.R import im.vector.riotx.core.epoxy.errorWithRetryItem @@ -115,13 +113,13 @@ class UploadsMediaController @Inject constructor( } } - private fun buildMediaItems(mediaEvents: List) { - mediaEvents.forEach { event -> - when { - event.isImageMessage() -> { - val data = event.toImageContentRendererData() ?: return@forEach + private fun buildMediaItems(mediaEvents: List) { + mediaEvents.forEach { uploadEvent -> + when (uploadEvent.contentWithAttachmentContent.msgType) { + MessageType.MSGTYPE_IMAGE -> { + val data = uploadEvent.toImageContentRendererData() ?: return@forEach uploadsImageItem { - id(event.eventId ?: "") + id(uploadEvent.eventId) imageContentRenderer(imageContentRenderer) data(data) listener(object : UploadsImageItem.Listener { @@ -131,10 +129,10 @@ class UploadsMediaController @Inject constructor( }) } } - event.isVideoMessage() -> { - val data = event.toVideoContentRendererData() ?: return@forEach + MessageType.MSGTYPE_VIDEO -> { + val data = uploadEvent.toVideoContentRendererData() ?: return@forEach uploadsVideoItem { - id(event.eventId ?: "") + id(uploadEvent.eventId) imageContentRenderer(imageContentRenderer) data(data) listener(object : UploadsVideoItem.Listener { @@ -148,11 +146,11 @@ class UploadsMediaController @Inject constructor( } } - private fun Event.toImageContentRendererData(): ImageContentRenderer.Data? { - val messageContent = getClearContent()?.toModel() ?: return null + private fun UploadEvent.toImageContentRendererData(): ImageContentRenderer.Data? { + val messageContent = (contentWithAttachmentContent as? MessageImageContent) ?: return null return ImageContentRenderer.Data( - eventId = eventId ?: "", + eventId = eventId, filename = messageContent.body, url = messageContent.getFileUrl(), elementToDecrypt = messageContent.encryptedFileInfo?.toElementToDecrypt(), @@ -163,11 +161,11 @@ class UploadsMediaController @Inject constructor( ) } - private fun Event.toVideoContentRendererData(): VideoContentRenderer.Data? { - val messageContent = getClearContent()?.toModel() ?: return null + private fun UploadEvent.toVideoContentRendererData(): VideoContentRenderer.Data? { + val messageContent = (contentWithAttachmentContent as? MessageVideoContent) ?: return null val thumbnailData = ImageContentRenderer.Data( - eventId = eventId ?: "", + eventId = eventId, filename = messageContent.body, url = messageContent.videoInfo?.thumbnailFile?.url ?: messageContent.videoInfo?.thumbnailUrl, elementToDecrypt = messageContent.videoInfo?.thumbnailFile?.toElementToDecrypt(), @@ -178,7 +176,7 @@ class UploadsMediaController @Inject constructor( ) return VideoContentRenderer.Data( - eventId = eventId ?: "", + eventId = eventId, filename = messageContent.body, url = messageContent.getFileUrl(), elementToDecrypt = messageContent.encryptedFileInfo?.toElementToDecrypt(),