From a7e254cc8414c43920c178f9ee57d29b9ca71798 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 25 Mar 2026 19:57:34 +0100 Subject: [PATCH] Live location : format the endsAt timeline item content --- .../factories/event/TimelineItemContentFactory.kt | 13 +++++++++++-- .../matrix/api/timeline/item/event/EventContent.kt | 5 ++++- .../item/event/TimelineEventContentMapper.kt | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt index a9457edfa4..8b81ae0906 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt @@ -38,6 +38,8 @@ import io.element.android.libraries.matrix.api.timeline.item.event.StickerConten import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecryptContent import io.element.android.libraries.matrix.api.timeline.item.event.UnknownContent import io.element.android.libraries.matrix.api.timeline.item.event.getDisambiguatedDisplayName +import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.services.toolbox.api.strings.StringProvider @Inject class TimelineItemContentFactory( @@ -52,6 +54,8 @@ class TimelineItemContentFactory( private val failedToParseMessageFactory: TimelineItemContentFailedToParseMessageFactory, private val failedToParseStateFactory: TimelineItemContentFailedToParseStateFactory, private val sessionId: SessionId, + private val dateFormatter: DateFormatter, + private val stringProvider: StringProvider, ) { suspend fun create(eventTimelineItem: EventTimelineItem): TimelineItemEventContent { return create( @@ -105,7 +109,12 @@ class TimelineItemContentFactory( val lastKnownLocation = itemContent.locations.mapNotNull { beacon -> Location.fromGeoUri(beacon.geoUri) }.lastOrNull() - // Always create content - location can be null for "loading/waiting" state + + val endsAt = dateFormatter.format( + timestamp = itemContent.endsAt, + mode = DateFormatterMode.TimeOnly + ) + // Always create content, location can be null for "loading/waiting" state TimelineItemLocationContent( description = itemContent.description?.trimEnd(), assetType = itemContent.assetType, @@ -114,7 +123,7 @@ class TimelineItemContentFactory( mode = TimelineItemLocationContent.Mode.Live( lastKnownLocation = lastKnownLocation, isActive = itemContent.isLive, - endsAt = "", + endsAt = stringProvider.getString(CommonStrings.common_ends_at, endsAt), ), ) } 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 35c37fc4a9..931287cfe7 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 @@ -107,10 +107,13 @@ data class FailedToParseStateContent( data class LiveLocationContent( val isLive: Boolean, val description: String?, + val timestamp: Long, val timeout: Long, val assetType: AssetType?, val locations: List, -) : EventContent +) : EventContent { + val endsAt = timestamp + timeout +} data object LegacyCallInviteContent : EventContent diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt index 24a4c97fbf..11d107cd8b 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt @@ -114,6 +114,7 @@ class TimelineEventContentMapper( is MsgLikeKind.LiveLocation -> { LiveLocationContent( isLive = kind.content.isLive, + timestamp = kind.content.ts.toLong(), description = kind.content.description, timeout = kind.content.timeoutMs.toLong(), assetType = kind.content.assetType.into(),