From f7f6fdc7709a9aba9e2863cc5241dec0ea836af6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Wed, 19 Jul 2023 13:14:45 +0200 Subject: [PATCH] Don't blindly retry fetching pending or failed event details --- .../matrix/api/timeline/item/event/EventContent.kt | 14 ++++++++++++++ .../api/timeline/item/event/EventTimelineItem.kt | 2 +- .../impl/timeline/item/event/EventMessageMapper.kt | 3 ++- 3 files changed, 17 insertions(+), 2 deletions(-) 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 843c232890..203fb30794 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 @@ -35,7 +35,13 @@ data class MessageContent( 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. */ + object Pending : InReplyTo + + /** The event details are available. */ data class Ready( val eventId: EventId, val content: MessageContent, @@ -44,6 +50,14 @@ sealed interface InReplyTo { 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. + * */ object Error : InReplyTo } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt index ef7f4d47b0..50bf5f8ce5 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt @@ -42,6 +42,6 @@ data class EventTimelineItem( } fun hasNotLoadedInReplyTo(): Boolean { val details = inReplyTo() - return details is InReplyTo.NotLoaded || details is InReplyTo.Error + return details is InReplyTo.NotLoaded } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt index 2ecad95e4f..9f4df1f6b3 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt @@ -58,7 +58,8 @@ class EventMessageMapper { ) } is RepliedToEventDetails.Error -> InReplyTo.Error - is RepliedToEventDetails.Pending, is RepliedToEventDetails.Unavailable -> InReplyTo.NotLoaded(inReplyToId!!) + is RepliedToEventDetails.Pending -> InReplyTo.Pending + is RepliedToEventDetails.Unavailable -> InReplyTo.NotLoaded(inReplyToId!!) } } MessageContent(