diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/TimelineConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/TimelineConfig.kt index 2ad2916550..2bbb96cabb 100644 --- a/appconfig/src/main/kotlin/io/element/android/appconfig/TimelineConfig.kt +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/TimelineConfig.kt @@ -31,7 +31,6 @@ object TimelineConfig { StateEventType.ROOM_GUEST_ACCESS, StateEventType.ROOM_HISTORY_VISIBILITY, StateEventType.ROOM_JOIN_RULES, - StateEventType.ROOM_PINNED_EVENTS, StateEventType.ROOM_POWER_LEVELS, StateEventType.ROOM_SERVER_ACL, StateEventType.ROOM_TOMBSTONE, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d04849d390..686f3b5b20 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -163,7 +163,7 @@ jsoup = "org.jsoup:jsoup:1.18.1" appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = "app.cash.molecule:molecule-runtime:2.0.0" timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.35" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.37" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt index 164f54f911..09cb6ef2ce 100644 --- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt +++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt @@ -80,11 +80,13 @@ class StateContentFormatter @Inject constructor( else -> sp.getString(R.string.state_event_room_topic_removed, senderDisambiguatedDisplayName) } } - OtherState.RoomPinnedEvents -> { - when { - //TODO manage all cases when available - senderIsYou -> sp.getString(R.string.state_event_room_pinned_events_changed_by_you) - else -> sp.getString(R.string.state_event_room_pinned_events_changed, senderDisambiguatedDisplayName) + is OtherState.RoomPinnedEvents -> when (renderingMode) { + RenderingMode.RoomList -> { + Timber.v("Filtering timeline item for room state change: $content") + null + } + RenderingMode.Timeline -> { + formatRoomPinnedEvents(content, senderIsYou, senderDisambiguatedDisplayName) } } is OtherState.Custom -> when (renderingMode) { @@ -215,4 +217,23 @@ class StateContentFormatter @Inject constructor( } } } + + private fun formatRoomPinnedEvents( + content: OtherState.RoomPinnedEvents, + senderIsYou: Boolean, + senderDisambiguatedDisplayName: String + ) = when (content.change) { + OtherState.RoomPinnedEvents.Change.ADDED -> when { + senderIsYou -> sp.getString(R.string.state_event_room_pinned_events_pinned_by_you) + else -> sp.getString(R.string.state_event_room_pinned_events_pinned, senderDisambiguatedDisplayName) + } + OtherState.RoomPinnedEvents.Change.REMOVED -> when { + senderIsYou -> sp.getString(R.string.state_event_room_pinned_events_unpinned_by_you) + else -> sp.getString(R.string.state_event_room_pinned_events_unpinned, senderDisambiguatedDisplayName) + } + OtherState.RoomPinnedEvents.Change.CHANGED -> when { + senderIsYou -> sp.getString(R.string.state_event_room_pinned_events_changed_by_you) + else -> sp.getString(R.string.state_event_room_pinned_events_changed, senderDisambiguatedDisplayName) + } + } } diff --git a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt index 5465882479..3f742c0954 100644 --- a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt +++ b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt @@ -660,7 +660,7 @@ class DefaultRoomLastMessageFormatterTest { OtherState.RoomGuestAccess, OtherState.RoomHistoryVisibility, OtherState.RoomJoinRules, - OtherState.RoomPinnedEvents, + OtherState.RoomPinnedEvents(OtherState.RoomPinnedEvents.Change.CHANGED), OtherState.RoomUserPowerLevels(emptyMap()), OtherState.RoomServerAcl, OtherState.RoomTombstone, 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 index d963b71a63..c046f6b2ae 100644 --- 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 @@ -32,7 +32,14 @@ sealed interface OtherState { data object RoomHistoryVisibility : OtherState data object RoomJoinRules : OtherState data class RoomName(val name: String?) : OtherState - data object RoomPinnedEvents : OtherState + data class RoomPinnedEvents(val change: Change) : OtherState { + enum class Change { + ADDED, + REMOVED, + CHANGED + } + } + data class RoomUserPowerLevels(val users: Map) : OtherState data object RoomServerAcl : OtherState data class RoomThirdPartyInvite(val displayName: String?) : OtherState 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 6b0da71eee..6e44579d7c 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 @@ -40,6 +40,7 @@ import kotlinx.collections.immutable.toImmutableMap import org.matrix.rustcomponents.sdk.TimelineItemContent import org.matrix.rustcomponents.sdk.TimelineItemContentKind import org.matrix.rustcomponents.sdk.use +import uniffi.matrix_sdk_ui.RoomPinnedEventsChange import org.matrix.rustcomponents.sdk.EncryptedMessage as RustEncryptedMessage import org.matrix.rustcomponents.sdk.MembershipChange as RustMembershipChange import org.matrix.rustcomponents.sdk.OtherState as RustOtherState @@ -176,7 +177,7 @@ private fun RustOtherState.map(): OtherState { RustOtherState.RoomHistoryVisibility -> OtherState.RoomHistoryVisibility RustOtherState.RoomJoinRules -> OtherState.RoomJoinRules is RustOtherState.RoomName -> OtherState.RoomName(name) - RustOtherState.RoomPinnedEvents -> OtherState.RoomPinnedEvents + is RustOtherState.RoomPinnedEvents -> OtherState.RoomPinnedEvents(change.map()) is RustOtherState.RoomPowerLevels -> OtherState.RoomUserPowerLevels(users) RustOtherState.RoomServerAcl -> OtherState.RoomServerAcl is RustOtherState.RoomThirdPartyInvite -> OtherState.RoomThirdPartyInvite(displayName) @@ -187,6 +188,14 @@ private fun RustOtherState.map(): OtherState { } } +private fun RoomPinnedEventsChange.map(): OtherState.RoomPinnedEvents.Change { + return when (this) { + RoomPinnedEventsChange.ADDED -> OtherState.RoomPinnedEvents.Change.ADDED + RoomPinnedEventsChange.REMOVED -> OtherState.RoomPinnedEvents.Change.REMOVED + RoomPinnedEventsChange.CHANGED -> OtherState.RoomPinnedEvents.Change.CHANGED + } +} + private fun RustEncryptedMessage.map(): UnableToDecryptContent.Data { return when (this) { is RustEncryptedMessage.MegolmV1AesSha2 -> UnableToDecryptContent.Data.MegolmV1AesSha2(sessionId, cause.map())