From 2962032fe5cffece9becb4ae4958da731c79f108 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Oct 2023 16:01:36 +0200 Subject: [PATCH 01/10] Move `InReplyTo` to its own file. --- .../api/timeline/item/event/EventContent.kt | 28 ----------- .../api/timeline/item/event/InReplyTo.kt | 47 +++++++++++++++++++ 2 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/InReplyTo.kt diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt index 85b7d4b66a..57117eda88 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt @@ -16,7 +16,6 @@ package io.element.android.libraries.matrix.api.timeline.item.event -import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.media.AudioInfo import io.element.android.libraries.matrix.api.media.FileInfo @@ -36,33 +35,6 @@ data class MessageContent( val type: MessageType? ) : EventContent -sealed interface InReplyTo { - /** The event details are not loaded yet. We can fetch them. */ - data class NotLoaded(val eventId: EventId) : InReplyTo - - /** The event details are pending to be fetched. We should **not** fetch them again. */ - data object Pending : InReplyTo - - /** The event details are available. */ - data class Ready( - val eventId: EventId, - val content: EventContent, - val senderId: UserId, - val senderDisplayName: String?, - val senderAvatarUrl: String?, - ) : InReplyTo - - /** - * Fetching the event details failed. - * - * We can try to fetch them again **with a proper retry strategy**, but not blindly: - * - * If the reason for the failure is consistent on the server, we'd enter a loop - * where we keep trying to fetch the same event. - * */ - data object Error : InReplyTo -} - data object RedactedContent : EventContent data class StickerContent( diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/InReplyTo.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/InReplyTo.kt new file mode 100644 index 0000000000..14a84e2a90 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/InReplyTo.kt @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2023 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 io.element.android.libraries.matrix.api.timeline.item.event + +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.UserId + +sealed interface InReplyTo { + /** The event details are not loaded yet. We can fetch them. */ + data class NotLoaded(val eventId: EventId) : InReplyTo + + /** The event details are pending to be fetched. We should **not** fetch them again. */ + data object Pending : InReplyTo + + /** The event details are available. */ + data class Ready( + val eventId: EventId, + val content: EventContent, + val senderId: UserId, + val senderDisplayName: String?, + val senderAvatarUrl: String?, + ) : InReplyTo + + /** + * Fetching the event details failed. + * + * We can try to fetch them again **with a proper retry strategy**, but not blindly: + * + * If the reason for the failure is consistent on the server, we'd enter a loop + * where we keep trying to fetch the same event. + * */ + data object Error : InReplyTo +} From 9cb8537c4e494b23c00ff9ee41b6e902128ed794 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Oct 2023 16:03:04 +0200 Subject: [PATCH 02/10] Move `MessageType` to its own file. --- .../api/timeline/item/event/EventContent.kt | 53 -------------- .../api/timeline/item/event/MessageType.kt | 72 +++++++++++++++++++ 2 files changed, 72 insertions(+), 53 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MessageType.kt diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt index 57117eda88..bea8a9e4a7 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt @@ -17,11 +17,7 @@ package io.element.android.libraries.matrix.api.timeline.item.event import io.element.android.libraries.matrix.api.core.UserId -import io.element.android.libraries.matrix.api.media.AudioInfo -import io.element.android.libraries.matrix.api.media.FileInfo import io.element.android.libraries.matrix.api.media.ImageInfo -import io.element.android.libraries.matrix.api.media.MediaSource -import io.element.android.libraries.matrix.api.media.VideoInfo import io.element.android.libraries.matrix.api.poll.PollAnswer import io.element.android.libraries.matrix.api.poll.PollKind @@ -98,10 +94,6 @@ data class FailedToParseStateContent( data object UnknownContent : EventContent -sealed interface MessageType - -data object UnknownMessageType : MessageType - enum class MessageFormat { HTML, UNKNOWN } @@ -111,51 +103,6 @@ data class FormattedBody( val body: String ) -data class EmoteMessageType( - val body: String, - val formatted: FormattedBody? -) : MessageType - -data class ImageMessageType( - val body: String, - val source: MediaSource, - val info: ImageInfo? -) : MessageType - -data class LocationMessageType( - val body: String, - val geoUri: String, - val description: String?, -) : MessageType - -data class AudioMessageType( - val body: String, - val source: MediaSource, - val info: AudioInfo? -) : MessageType - -data class VideoMessageType( - val body: String, - val source: MediaSource, - val info: VideoInfo? -) : MessageType - -data class FileMessageType( - val body: String, - val source: MediaSource, - val info: FileInfo? -) : MessageType - -data class NoticeMessageType( - val body: String, - val formatted: FormattedBody? -) : MessageType - -data class TextMessageType( - val body: String, - val formatted: FormattedBody? -) : MessageType - enum class MembershipChange { NONE, ERROR, diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MessageType.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MessageType.kt new file mode 100644 index 0000000000..dc06d5c94a --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MessageType.kt @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2023 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 io.element.android.libraries.matrix.api.timeline.item.event + +import io.element.android.libraries.matrix.api.media.AudioInfo +import io.element.android.libraries.matrix.api.media.FileInfo +import io.element.android.libraries.matrix.api.media.ImageInfo +import io.element.android.libraries.matrix.api.media.MediaSource +import io.element.android.libraries.matrix.api.media.VideoInfo + +sealed interface MessageType + +data object UnknownMessageType : MessageType + +data class EmoteMessageType( + val body: String, + val formatted: FormattedBody? +) : MessageType + +data class ImageMessageType( + val body: String, + val source: MediaSource, + val info: ImageInfo? +) : MessageType + +data class LocationMessageType( + val body: String, + val geoUri: String, + val description: String?, +) : MessageType + +data class AudioMessageType( + val body: String, + val source: MediaSource, + val info: AudioInfo? +) : MessageType + +data class VideoMessageType( + val body: String, + val source: MediaSource, + val info: VideoInfo? +) : MessageType + +data class FileMessageType( + val body: String, + val source: MediaSource, + val info: FileInfo? +) : MessageType + +data class NoticeMessageType( + val body: String, + val formatted: FormattedBody? +) : MessageType + +data class TextMessageType( + val body: String, + val formatted: FormattedBody? +) : MessageType From 4c97a63cd3bd6caf4b2c088f3b11d211af1c48eb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Oct 2023 16:04:41 +0200 Subject: [PATCH 03/10] Move `MessageFormat` to its own file. --- .../api/timeline/item/event/EventContent.kt | 4 ---- .../api/timeline/item/event/MessageFormat.kt | 21 +++++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MessageFormat.kt diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt index bea8a9e4a7..925d6d4061 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt @@ -94,10 +94,6 @@ data class FailedToParseStateContent( data object UnknownContent : EventContent -enum class MessageFormat { - HTML, UNKNOWN -} - data class FormattedBody( val format: MessageFormat, val body: String diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MessageFormat.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MessageFormat.kt new file mode 100644 index 0000000000..4e88113355 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MessageFormat.kt @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2023 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 io.element.android.libraries.matrix.api.timeline.item.event + +enum class MessageFormat { + HTML, UNKNOWN +} From d8a30f30c58979931aff20a84227cc197e566eda Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Oct 2023 16:05:19 +0200 Subject: [PATCH 04/10] Move `MembershipChange` to its own file. --- .../api/timeline/item/event/EventContent.kt | 20 ---------- .../timeline/item/event/MembershipChange.kt | 37 +++++++++++++++++++ 2 files changed, 37 insertions(+), 20 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MembershipChange.kt diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt index 925d6d4061..728b2bf2d4 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt @@ -99,26 +99,6 @@ data class FormattedBody( val body: String ) -enum class MembershipChange { - NONE, - ERROR, - JOINED, - LEFT, - BANNED, - UNBANNED, - KICKED, - INVITED, - KICKED_AND_BANNED, - INVITATION_ACCEPTED, - INVITATION_REJECTED, - INVITATION_REVOKED, - KNOCKED, - KNOCK_ACCEPTED, - KNOCK_RETRACTED, - KNOCK_DENIED, - NOT_IMPLEMENTED; -} - sealed interface OtherState { data object PolicyRuleRoom : OtherState data object PolicyRuleServer : OtherState diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MembershipChange.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MembershipChange.kt new file mode 100644 index 0000000000..8aa8845f23 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MembershipChange.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2023 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 io.element.android.libraries.matrix.api.timeline.item.event + +enum class MembershipChange { + NONE, + ERROR, + JOINED, + LEFT, + BANNED, + UNBANNED, + KICKED, + INVITED, + KICKED_AND_BANNED, + INVITATION_ACCEPTED, + INVITATION_REJECTED, + INVITATION_REVOKED, + KNOCKED, + KNOCK_ACCEPTED, + KNOCK_RETRACTED, + KNOCK_DENIED, + NOT_IMPLEMENTED; +} From 8482e2da6f4f0f7eca8e3e61045a32560e7e28c8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Oct 2023 16:05:47 +0200 Subject: [PATCH 05/10] Move `FormattedBody` to its own file. --- .../api/timeline/item/event/EventContent.kt | 5 ----- .../api/timeline/item/event/FormattedBody.kt | 22 +++++++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/FormattedBody.kt diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt index 728b2bf2d4..332f96fc75 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt @@ -94,11 +94,6 @@ data class FailedToParseStateContent( data object UnknownContent : EventContent -data class FormattedBody( - val format: MessageFormat, - val body: String -) - sealed interface OtherState { data object PolicyRuleRoom : OtherState data object PolicyRuleServer : OtherState diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/FormattedBody.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/FormattedBody.kt new file mode 100644 index 0000000000..a11043b200 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/FormattedBody.kt @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2023 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 io.element.android.libraries.matrix.api.timeline.item.event + +data class FormattedBody( + val format: MessageFormat, + val body: String +) From 1b0e0445657bbfdfeef10e1bc38c969c602e74c1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Oct 2023 16:06:49 +0200 Subject: [PATCH 06/10] Move `OtherState` to its own file. --- .../api/timeline/item/event/EventContent.kt | 24 ----------- .../api/timeline/item/event/OtherState.kt | 41 +++++++++++++++++++ 2 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/OtherState.kt diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt index 332f96fc75..dc5e2af043 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt @@ -93,27 +93,3 @@ data class FailedToParseStateContent( ) : EventContent data object UnknownContent : EventContent - -sealed interface OtherState { - data object PolicyRuleRoom : OtherState - data object PolicyRuleServer : OtherState - data object PolicyRuleUser : OtherState - data object RoomAliases : OtherState - data class RoomAvatar(val url: String?) : OtherState - data object RoomCanonicalAlias : OtherState - data object RoomCreate : OtherState - data object RoomEncryption : OtherState - data object RoomGuestAccess : OtherState - data object RoomHistoryVisibility : OtherState - data object RoomJoinRules : OtherState - data class RoomName(val name: String?) : OtherState - data object RoomPinnedEvents : OtherState - data object RoomPowerLevels : OtherState - data object RoomServerAcl : OtherState - data class RoomThirdPartyInvite(val displayName: String?) : OtherState - data object RoomTombstone : OtherState - data class RoomTopic(val topic: String?) : OtherState - data object SpaceChild : OtherState - data object SpaceParent : OtherState - data class Custom(val eventType: String) : OtherState -} diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/OtherState.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/OtherState.kt new file mode 100644 index 0000000000..2cbfaf76b4 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/OtherState.kt @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023 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 io.element.android.libraries.matrix.api.timeline.item.event + +sealed interface OtherState { + data object PolicyRuleRoom : OtherState + data object PolicyRuleServer : OtherState + data object PolicyRuleUser : OtherState + data object RoomAliases : OtherState + data class RoomAvatar(val url: String?) : OtherState + data object RoomCanonicalAlias : OtherState + data object RoomCreate : OtherState + data object RoomEncryption : OtherState + data object RoomGuestAccess : OtherState + data object RoomHistoryVisibility : OtherState + data object RoomJoinRules : OtherState + data class RoomName(val name: String?) : OtherState + data object RoomPinnedEvents : OtherState + data object RoomPowerLevels : OtherState + data object RoomServerAcl : OtherState + data class RoomThirdPartyInvite(val displayName: String?) : OtherState + data object RoomTombstone : OtherState + data class RoomTopic(val topic: String?) : OtherState + data object SpaceChild : OtherState + data object SpaceParent : OtherState + data class Custom(val eventType: String) : OtherState +} From 8c2a5f281b8b4301d4e0cb12870ff8ab0649b79e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Oct 2023 16:12:20 +0200 Subject: [PATCH 07/10] MessageContent.type cannot be null --- .../factories/event/TimelineItemContentMessageFactory.kt | 2 +- .../eventformatter/impl/DefaultRoomLastMessageFormatter.kt | 4 +--- .../libraries/matrix/api/timeline/item/event/EventContent.kt | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt index 8e6561543c..18e5353a1f 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt @@ -49,7 +49,7 @@ class TimelineItemContentMessageFactory @Inject constructor( ) { fun create(content: MessageContent, senderDisplayName: String): TimelineItemEventContent { - return when (val messageType = content.type ?: UnknownMessageType) { + return when (val messageType = content.type) { is EmoteMessageType -> TimelineItemEmoteContent( body = "* $senderDisplayName ${messageType.body}", htmlDocument = messageType.formatted?.toHtmlDocument(prefix = "* senderDisplayName"), diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt index 70ec625fe9..992d64ef1c 100644 --- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt +++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt @@ -106,9 +106,7 @@ class DefaultRoomLastMessageFormatter @Inject constructor( } private fun processMessageContents(messageContent: MessageContent, senderDisplayName: String, isDmRoom: Boolean): CharSequence? { - val messageType: MessageType = messageContent.type ?: return null - - val internalMessage = when (messageType) { + val internalMessage = when (val messageType: MessageType = messageContent.type) { // Doesn't need a prefix is EmoteMessageType -> { return "* $senderDisplayName ${messageType.body}" diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt index dc5e2af043..f63953e260 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt @@ -28,7 +28,7 @@ data class MessageContent( val inReplyTo: InReplyTo?, val isEdited: Boolean, val isThreaded: Boolean, - val type: MessageType? + val type: MessageType ) : EventContent data object RedactedContent : EventContent From bcefbb98613bcbfc5cf8a5c3cb3dc6361b090b87 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Oct 2023 16:18:24 +0200 Subject: [PATCH 08/10] Render body for m.room.message if msgtype is unknown, in timeline and as room list last message. #1539 --- .../factories/event/TimelineItemContentMessageFactory.kt | 8 ++++++-- .../impl/DefaultRoomLastMessageFormatter.kt | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt index 18e5353a1f..ae2ea4f350 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt @@ -25,7 +25,6 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLocationContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemNoticeContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextContent -import io.element.android.features.messages.impl.timeline.model.event.TimelineItemUnknownContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVideoContent import io.element.android.features.messages.impl.timeline.util.FileExtensionExtractor import io.element.android.features.messages.impl.timeline.util.toHtmlDocument @@ -131,7 +130,12 @@ class TimelineItemContentMessageFactory @Inject constructor( htmlDocument = messageType.formatted?.toHtmlDocument(), isEdited = content.isEdited, ) - UnknownMessageType -> TimelineItemUnknownContent + UnknownMessageType -> TimelineItemTextContent( + // Display the body as a fallback + body = content.body, + htmlDocument = null, + isEdited = content.isEdited, + ) } } diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt index 992d64ef1c..d041078051 100644 --- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt +++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt @@ -130,7 +130,8 @@ class DefaultRoomLastMessageFormatter @Inject constructor( sp.getString(CommonStrings.common_audio) } UnknownMessageType -> { - sp.getString(CommonStrings.common_unsupported_event) + // Display the body as a fallback + messageContent.body } is NoticeMessageType -> { messageType.body From edd7f5934abe36c35bc5e5690a03fe202ac3cc20 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Oct 2023 16:29:34 +0200 Subject: [PATCH 09/10] changelog --- changelog.d/1539.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/1539.bugfix diff --git a/changelog.d/1539.bugfix b/changelog.d/1539.bugfix new file mode 100644 index 0000000000..0d514b8308 --- /dev/null +++ b/changelog.d/1539.bugfix @@ -0,0 +1 @@ +Render body of unknown msgtype in the timeline and in the room list From 71b836a4c60edae02e0956a6db471f18070929a7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Oct 2023 16:55:48 +0200 Subject: [PATCH 10/10] Fix test, and distinguish failure message. --- .../impl/DefaultRoomLastMessageFormatterTests.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTests.kt b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTests.kt index b66b044a66..c906952bbb 100644 --- a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTests.kt +++ b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTests.kt @@ -202,10 +202,11 @@ class DefaultRoomLastMessageFormatterTests { is FileMessageType -> "File" is LocationMessageType -> "Shared location" is EmoteMessageType -> "* $senderName ${type.body}" - is TextMessageType, is NoticeMessageType -> body - UnknownMessageType -> "Unsupported event" + is TextMessageType, + is NoticeMessageType, + UnknownMessageType -> body } - Truth.assertWithMessage("$type was not properly handled").that(result).isEqualTo(expectedResult) + Truth.assertWithMessage("$type was not properly handled for DM").that(result).isEqualTo(expectedResult) } // Verify results of Room mode @@ -217,9 +218,10 @@ class DefaultRoomLastMessageFormatterTests { is ImageMessageType -> "$senderName: Image" is FileMessageType -> "$senderName: File" is LocationMessageType -> "$senderName: Shared location" + is TextMessageType, + is NoticeMessageType, + UnknownMessageType -> "$senderName: $body" is EmoteMessageType -> "* $senderName ${type.body}" - is TextMessageType, is NoticeMessageType -> "$senderName: $body" - UnknownMessageType -> "$senderName: Unsupported event" } val shouldCreateAnnotatedString = when (type) { is VideoMessageType -> true @@ -236,7 +238,7 @@ class DefaultRoomLastMessageFormatterTests { .that(result) .isInstanceOf(AnnotatedString::class.java) } - Truth.assertWithMessage("$type was not properly handled").that(string).isEqualTo(expectedResult) + Truth.assertWithMessage("$type was not properly handled for room").that(string).isEqualTo(expectedResult) } }