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/build.gradle.kts b/build.gradle.kts index 87771dae05..d71f24b69f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -61,7 +61,7 @@ allprojects { config.from(files("$rootDir/tools/detekt/detekt.yml")) } dependencies { - detektPlugins("io.nlopez.compose.rules:detekt:0.4.8") + detektPlugins("io.nlopez.compose.rules:detekt:0.4.9") } // KtLint 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 ef15216a66..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,6 +80,15 @@ class StateContentFormatter @Inject constructor( else -> sp.getString(R.string.state_event_room_topic_removed, 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) { RenderingMode.RoomList -> { Timber.v("Filtering timeline item for room state change: $content") @@ -161,15 +170,6 @@ class StateContentFormatter @Inject constructor( "RoomJoinRules" } } - OtherState.RoomPinnedEvents -> when (renderingMode) { - RenderingMode.RoomList -> { - Timber.v("Filtering timeline item for room state change: $content") - null - } - RenderingMode.Timeline -> { - "RoomPinnedEvents" - } - } is OtherState.RoomUserPowerLevels -> when (renderingMode) { RenderingMode.RoomList -> { Timber.v("Filtering timeline item for room state change: $content") @@ -217,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 90b13e356d..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) - is 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())