misc : use new_latest_event api (+ some renaming)

This commit is contained in:
ganfra 2025-11-17 20:53:55 +01:00
parent ec6f615a68
commit b04524e566
42 changed files with 352 additions and 290 deletions

View file

@ -1,20 +0,0 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
* Copyright 2023-2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.matrix.api.room.message
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.timeline.item.event.EventTimelineItem
data class RoomMessage(
val eventId: EventId,
val event: EventTimelineItem,
val sender: UserId,
val originServerTs: Long,
)

View file

@ -0,0 +1,31 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.matrix.api.roomlist
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.timeline.item.event.EventContent
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileDetails
sealed interface LatestEventValue {
data object None : LatestEventValue
data class Remote(
val timestamp: Long,
val content: EventContent,
val senderId: UserId,
val senderProfile: ProfileDetails,
val isOwn: Boolean,
) : LatestEventValue
data class Local(
val timestamp: Long,
val content: EventContent,
val senderId: UserId,
val senderProfile: ProfileDetails,
val isSending: Boolean,
) : LatestEventValue
}

View file

@ -9,13 +9,16 @@
package io.element.android.libraries.matrix.api.roomlist
import io.element.android.libraries.matrix.api.room.RoomInfo
import io.element.android.libraries.matrix.api.room.message.RoomMessage
data class RoomSummary(
val info: RoomInfo,
val lastMessage: RoomMessage?,
val latestEvent: LatestEventValue,
) {
val roomId = info.id
val lastMessageTimestamp = lastMessage?.originServerTs
val latestEventTimestamp = when (latestEvent) {
is LatestEventValue.None -> null
is LatestEventValue.Local -> latestEvent.timestamp
is LatestEventValue.Remote -> latestEvent.timestamp
}
val isOneToOne get() = info.activeMembersCount == 2L
}

View file

@ -13,7 +13,7 @@ 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.timeline.item.event.EventContent
import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileDetails
sealed interface EventThreadInfo {
data class ThreadRoot(val summary: ThreadSummary) : EventThreadInfo
@ -29,6 +29,6 @@ data class EmbeddedEventInfo(
val eventOrTransactionId: EventOrTransactionId,
val content: EventContent,
val senderId: UserId,
val senderProfile: ProfileTimelineDetails,
val senderProfile: ProfileDetails,
val timestamp: Long,
)

View file

@ -27,7 +27,7 @@ data class EventTimelineItem(
val reactions: ImmutableList<EventReaction>,
val receipts: ImmutableList<Receipt>,
val sender: UserId,
val senderProfile: ProfileTimelineDetails,
val senderProfile: ProfileDetails,
val timestamp: Long,
val content: EventContent,
val origin: TimelineItemEventOrigin?,

View file

@ -25,7 +25,7 @@ sealed interface InReplyTo {
val eventId: EventId,
val content: EventContent,
val senderId: UserId,
val senderProfile: ProfileTimelineDetails,
val senderProfile: ProfileDetails,
) : InReplyTo
/**

View file

@ -12,20 +12,20 @@ import androidx.compose.runtime.Immutable
import io.element.android.libraries.matrix.api.core.UserId
@Immutable
sealed interface ProfileTimelineDetails {
data object Unavailable : ProfileTimelineDetails
sealed interface ProfileDetails {
data object Unavailable : ProfileDetails
data object Pending : ProfileTimelineDetails
data object Pending : ProfileDetails
data class Ready(
val displayName: String?,
val displayNameAmbiguous: Boolean,
val avatarUrl: String?
) : ProfileTimelineDetails
) : ProfileDetails
data class Error(
val message: String
) : ProfileTimelineDetails
) : ProfileDetails
}
/**
@ -34,9 +34,9 @@ sealed interface ProfileTimelineDetails {
* If the display name is ambiguous, the user ID is appended in parentheses.
* Otherwise, the display name is returned.
*/
fun ProfileTimelineDetails.getDisambiguatedDisplayName(userId: UserId): String {
fun ProfileDetails.getDisambiguatedDisplayName(userId: UserId): String {
return when (this) {
is ProfileTimelineDetails.Ready -> when {
is ProfileDetails.Ready -> when {
displayName == null -> userId.value
displayNameAmbiguous -> "$displayName ($userId)"
else -> displayName
@ -45,16 +45,16 @@ fun ProfileTimelineDetails.getDisambiguatedDisplayName(userId: UserId): String {
}
}
fun ProfileTimelineDetails.getDisplayName(): String? {
fun ProfileDetails.getDisplayName(): String? {
return when (this) {
is ProfileTimelineDetails.Ready -> displayName
is ProfileDetails.Ready -> displayName
else -> null
}
}
fun ProfileTimelineDetails.getAvatarUrl(): String? {
fun ProfileDetails.getAvatarUrl(): String? {
return when (this) {
is ProfileTimelineDetails.Ready -> avatarUrl
is ProfileDetails.Ready -> avatarUrl
else -> null
}
}

View file

@ -18,23 +18,23 @@ private val aUserId = UserId(A_USER_ID)
class ProfileTimelineDetailsTest {
@Test
fun `getDisambiguatedDisplayName of Unavailable should be equal to userId`() {
assertThat(ProfileTimelineDetails.Unavailable.getDisambiguatedDisplayName(aUserId)).isEqualTo(A_USER_ID)
assertThat(ProfileDetails.Unavailable.getDisambiguatedDisplayName(aUserId)).isEqualTo(A_USER_ID)
}
@Test
fun `getDisambiguatedDisplayName of Error should be equal to userId`() {
assertThat(ProfileTimelineDetails.Error("An error").getDisambiguatedDisplayName(aUserId)).isEqualTo(A_USER_ID)
assertThat(ProfileDetails.Error("An error").getDisambiguatedDisplayName(aUserId)).isEqualTo(A_USER_ID)
}
@Test
fun `getDisambiguatedDisplayName of Pending should be equal to userId`() {
assertThat(ProfileTimelineDetails.Pending.getDisambiguatedDisplayName(aUserId)).isEqualTo(A_USER_ID)
assertThat(ProfileDetails.Pending.getDisambiguatedDisplayName(aUserId)).isEqualTo(A_USER_ID)
}
@Test
fun `getDisambiguatedDisplayName of Ready without display name should be equal to userId`() {
assertThat(
ProfileTimelineDetails.Ready(
ProfileDetails.Ready(
displayName = null,
displayNameAmbiguous = false,
avatarUrl = null,
@ -45,7 +45,7 @@ class ProfileTimelineDetailsTest {
@Test
fun `getDisambiguatedDisplayName of Ready with display name should be equal to display name`() {
assertThat(
ProfileTimelineDetails.Ready(
ProfileDetails.Ready(
displayName = "Alice",
displayNameAmbiguous = false,
avatarUrl = null,
@ -56,7 +56,7 @@ class ProfileTimelineDetailsTest {
@Test
fun `getDisambiguatedDisplayName of Ready with display name and ambiguous should be equal to display name with user id`() {
assertThat(
ProfileTimelineDetails.Ready(
ProfileDetails.Ready(
displayName = "Alice",
displayNameAmbiguous = true,
avatarUrl = null,