Map sdk timeline item for LiveLocation

This commit is contained in:
ganfra 2026-03-17 12:28:44 +01:00
parent d1a6363a57
commit a217c1fcdf
7 changed files with 22 additions and 9 deletions

View file

@ -33,7 +33,7 @@ fun TimelineItemLocationView(
lat = content.location.lat, lat = content.location.lat,
lon = content.location.lon, lon = content.location.lon,
zoom = 15.0, zoom = 15.0,
contentDescription = content.body contentDescription = content.description
) )
} }

View file

@ -105,7 +105,6 @@ class TimelineItemContentFactory(
}.lastOrNull() }.lastOrNull()
if (lastKnownLocation != null) { if (lastKnownLocation != null) {
TimelineItemLocationContent( TimelineItemLocationContent(
body = itemContent.body.trimEnd(),
description = itemContent.description?.trimEnd(), description = itemContent.description?.trimEnd(),
assetType = itemContent.assetType, assetType = itemContent.assetType,
senderId = sender, senderId = sender,

View file

@ -150,7 +150,6 @@ class TimelineItemContentMessageFactory(
) )
} else { } else {
TimelineItemLocationContent( TimelineItemLocationContent(
body = body,
location = location, location = location,
description = messageType.description, description = messageType.description,
senderId = senderId, senderId = senderId,

View file

@ -19,7 +19,6 @@ import io.element.android.libraries.matrix.api.timeline.item.event.getAvatarUrl
import io.element.android.libraries.matrix.api.timeline.item.event.getDisplayName import io.element.android.libraries.matrix.api.timeline.item.event.getDisplayName
data class TimelineItemLocationContent( data class TimelineItemLocationContent(
val body: String,
val senderId: UserId, val senderId: UserId,
val senderProfile: ProfileDetails, val senderProfile: ProfileDetails,
val location: Location, val location: Location,

View file

@ -24,12 +24,11 @@ open class TimelineItemLocationContentProvider : PreviewParameterProvider<Timeli
} }
fun aTimelineItemLocationContent( fun aTimelineItemLocationContent(
body: String = "",
senderId: UserId = UserId("@sender:matrix.org"), senderId: UserId = UserId("@sender:matrix.org"),
senderProfile: ProfileDetails = aProfileDetailsReady(), senderProfile: ProfileDetails = aProfileDetailsReady(),
description: String? = null,
mode: TimelineItemLocationContent.Mode = TimelineItemLocationContent.Mode.Static, mode: TimelineItemLocationContent.Mode = TimelineItemLocationContent.Mode.Static,
) = TimelineItemLocationContent( ) = TimelineItemLocationContent(
body = body,
location = Location( location = Location(
lat = 52.2445, lat = 52.2445,
lon = 0.7186, lon = 0.7186,
@ -37,5 +36,6 @@ fun aTimelineItemLocationContent(
), ),
senderId = senderId, senderId = senderId,
senderProfile = senderProfile, senderProfile = senderProfile,
description = description,
mode = mode mode = mode
) )

View file

@ -105,7 +105,6 @@ data class FailedToParseStateContent(
) : EventContent ) : EventContent
data class LiveLocationContent( data class LiveLocationContent(
val body: String,
val isLive: Boolean, val isLive: Boolean,
val description: String?, val description: String?,
val timeout: Long, val timeout: Long,

View file

@ -11,6 +11,7 @@ package io.element.android.libraries.matrix.impl.timeline.item.event
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.location.LiveLocationInfo
import io.element.android.libraries.matrix.api.timeline.item.EmbeddedEventInfo import io.element.android.libraries.matrix.api.timeline.item.EmbeddedEventInfo
import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo
import io.element.android.libraries.matrix.api.timeline.item.ThreadSummary import io.element.android.libraries.matrix.api.timeline.item.ThreadSummary
@ -19,6 +20,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.EventContent
import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseMessageLikeContent import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseMessageLikeContent
import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseStateContent import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseStateContent
import io.element.android.libraries.matrix.api.timeline.item.event.LegacyCallInviteContent import io.element.android.libraries.matrix.api.timeline.item.event.LegacyCallInviteContent
import io.element.android.libraries.matrix.api.timeline.item.event.LiveLocationContent
import io.element.android.libraries.matrix.api.timeline.item.event.MembershipChange import io.element.android.libraries.matrix.api.timeline.item.event.MembershipChange
import io.element.android.libraries.matrix.api.timeline.item.event.OtherState import io.element.android.libraries.matrix.api.timeline.item.event.OtherState
import io.element.android.libraries.matrix.api.timeline.item.event.PollContent import io.element.android.libraries.matrix.api.timeline.item.event.PollContent
@ -33,8 +35,10 @@ import io.element.android.libraries.matrix.api.timeline.item.event.UtdCause
import io.element.android.libraries.matrix.impl.media.map import io.element.android.libraries.matrix.impl.media.map
import io.element.android.libraries.matrix.impl.poll.map import io.element.android.libraries.matrix.impl.poll.map
import io.element.android.libraries.matrix.impl.room.join.map import io.element.android.libraries.matrix.impl.room.join.map
import io.element.android.libraries.matrix.impl.room.location.into
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toImmutableMap import kotlinx.collections.immutable.toImmutableMap
import org.matrix.rustcomponents.sdk.BeaconInfo
import org.matrix.rustcomponents.sdk.EmbeddedEventDetails import org.matrix.rustcomponents.sdk.EmbeddedEventDetails
import org.matrix.rustcomponents.sdk.MsgLikeContent import org.matrix.rustcomponents.sdk.MsgLikeContent
import org.matrix.rustcomponents.sdk.MsgLikeKind import org.matrix.rustcomponents.sdk.MsgLikeKind
@ -108,8 +112,13 @@ class TimelineEventContentMapper(
) )
} }
is MsgLikeKind.LiveLocation -> { is MsgLikeKind.LiveLocation -> {
// Live location messages are a special kind of message that we want to treat as unknown content for now LiveLocationContent(
UnknownContent isLive = kind.content.isLive,
description = kind.content.description,
timeout = kind.content.timeoutMs.toLong(),
assetType = kind.content.assetType.into(),
locations = kind.content.locations.map { location -> location.map() }
)
} }
is MsgLikeKind.Other -> UnknownContent is MsgLikeKind.Other -> UnknownContent
} }
@ -260,3 +269,11 @@ private fun RustEncryptedMessage.map(): UnableToDecryptContent.Data {
RustEncryptedMessage.Unknown -> UnableToDecryptContent.Data.Unknown RustEncryptedMessage.Unknown -> UnableToDecryptContent.Data.Unknown
} }
} }
private fun BeaconInfo.map(): LiveLocationInfo {
return LiveLocationInfo(
description = description,
geoUri = geoUri,
timestamp = ts.toLong(),
)
}