diff --git a/changelog.d/4753.feature b/changelog.d/4753.feature new file mode 100644 index 0000000000..1a474f0f5f --- /dev/null +++ b/changelog.d/4753.feature @@ -0,0 +1 @@ +Support tagged events in Room Account Data (MSC2437) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt index 96eb86c0d6..312fb7e164 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt @@ -21,4 +21,5 @@ object RoomAccountDataTypes { const val EVENT_TYPE_TAG = "m.tag" const val EVENT_TYPE_FULLY_READ = "m.fully_read" const val EVENT_TYPE_SPACE_ORDER = "org.matrix.msc3230.space_order" // m.space_order + const val EVENT_TYPE_TAGGED_EVENTS = "m.tagged_events" } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/taggedevents/TaggedEventsContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/taggedevents/TaggedEventsContent.kt new file mode 100644 index 0000000000..1b19d27e1d --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/taggedevents/TaggedEventsContent.kt @@ -0,0 +1,79 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.internal.session.room.taggedevents + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +/** + * Keys are event IDs, values are event information. + */ +typealias TaggedEvent = Map + +/** + * Keys are tagged event names (eg. m.favourite), values are the related events. + */ +typealias TaggedEvents = Map + +/** + * Class used to parse the content of a m.tagged_events type event. + * This kind of event defines the tagged events in a room. + * + * The content of this event is a tags key whose value is an object mapping the name of each tag + * to another object. The JSON object associated with each tag is an object where the keys are the + * event IDs and values give information about the events. + * + * Ref: https://github.com/matrix-org/matrix-doc/pull/2437 + */ +@JsonClass(generateAdapter = true) +data class TaggedEventsContent( + @Json(name = "tags") + var tags: TaggedEvents = emptyMap() +) { + val favouriteEvents + get() = tags[TAG_FAVOURITE].orEmpty() + + val hiddenEvents + get() = tags[TAG_HIDDEN].orEmpty() + + fun tagEvent(eventId: String, info: TaggedEventInfo, tag: String) { + val taggedEvents = tags[tag].orEmpty().plus(eventId to info) + tags = tags.plus(tag to taggedEvents) + } + + fun untagEvent(eventId: String, tag: String) { + val taggedEvents = tags[tag]?.minus(eventId).orEmpty() + tags = tags.plus(tag to taggedEvents) + } + + companion object { + const val TAG_FAVOURITE = "m.favourite" + const val TAG_HIDDEN = "m.hidden" + } +} + +@JsonClass(generateAdapter = true) +data class TaggedEventInfo( + @Json(name = "keywords") + val keywords: List? = null, + + @Json(name = "origin_server_ts") + val originServerTs: Long? = null, + + @Json(name = "tagged_at") + val taggedAt: Long? = null +)