mirror of
https://github.com/element-hq/element-android
synced 2024-11-28 13:38:49 +03:00
Enhance RoomEventFilter with MSC3440
This commit is contained in:
parent
7048080ee0
commit
5a7d12a9a5
8 changed files with 33 additions and 12 deletions
|
@ -367,9 +367,9 @@ fun Event.isReply(): Boolean {
|
||||||
return getRelationContent()?.inReplyTo?.eventId != null
|
return getRelationContent()?.inReplyTo?.eventId != null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Event.isThread(): Boolean = getRelationContentForType(RelationType.THREAD)?.eventId != null
|
fun Event.isThread(): Boolean = getRelationContentForType(RelationType.IO_THREAD)?.eventId != null
|
||||||
|
|
||||||
fun Event.getRootThreadEventId(): String? = getRelationContentForType(RelationType.THREAD)?.eventId
|
fun Event.getRootThreadEventId(): String? = getRelationContentForType(RelationType.IO_THREAD)?.eventId
|
||||||
|
|
||||||
fun Event.isEdition(): Boolean {
|
fun Event.isEdition(): Boolean {
|
||||||
return getRelationContentForType(RelationType.REPLACE)?.eventId != null
|
return getRelationContentForType(RelationType.REPLACE)?.eventId != null
|
||||||
|
|
|
@ -29,8 +29,8 @@ object RelationType {
|
||||||
const val REFERENCE = "m.reference"
|
const val REFERENCE = "m.reference"
|
||||||
|
|
||||||
/** Lets you define an event which is a reply to an existing event.*/
|
/** Lets you define an event which is a reply to an existing event.*/
|
||||||
// const val THREAD = "m.thread"
|
const val THREAD = "m.thread"
|
||||||
const val THREAD = "io.element.thread"
|
const val IO_THREAD = "io.element.thread"
|
||||||
|
|
||||||
/** Lets you define an event which adds a response to an existing event.*/
|
/** Lets you define an event which adds a response to an existing event.*/
|
||||||
const val RESPONSE = "org.matrix.response"
|
const val RESPONSE = "org.matrix.response"
|
||||||
|
|
|
@ -48,6 +48,16 @@ data class RoomEventFilter(
|
||||||
* a wildcard to match any sequence of characters.
|
* a wildcard to match any sequence of characters.
|
||||||
*/
|
*/
|
||||||
@Json(name = "types") val types: List<String>? = null,
|
@Json(name = "types") val types: List<String>? = null,
|
||||||
|
/**
|
||||||
|
* A list of relation types which must be exist pointing to the event being filtered.
|
||||||
|
* If this list is absent then no filtering is done on relation types.
|
||||||
|
*/
|
||||||
|
@Json(name = "relation_types") val relationTypes: List<String>? = null,
|
||||||
|
/**
|
||||||
|
* A list of senders of relations which must exist pointing to the event being filtered.
|
||||||
|
* If this list is absent then no filtering is done on relation types.
|
||||||
|
*/
|
||||||
|
@Json(name = "relation_senders") val relationSenders: List<String>? = null,
|
||||||
/**
|
/**
|
||||||
* A list of room IDs to include. If this list is absent then all rooms are included.
|
* A list of room IDs to include. If this list is absent then all rooms are included.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -376,4 +376,15 @@ internal interface RoomAPI {
|
||||||
@GET(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "im.nheko.summary/rooms/{roomIdOrAlias}/summary")
|
@GET(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "im.nheko.summary/rooms/{roomIdOrAlias}/summary")
|
||||||
suspend fun getRoomSummary(@Path("roomIdOrAlias") roomidOrAlias: String,
|
suspend fun getRoomSummary(@Path("roomIdOrAlias") roomidOrAlias: String,
|
||||||
@Query("via") viaServers: List<String>?): RoomStrippedState
|
@Query("via") viaServers: List<String>?): RoomStrippedState
|
||||||
|
|
||||||
|
// TODO add doc
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
@GET(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "rooms/{roomId}/messages")
|
||||||
|
suspend fun getRoomThreadMessages(@Path("roomId") roomId: String,
|
||||||
|
@Query("from") from: String,
|
||||||
|
@Query("dir") dir: String,
|
||||||
|
@Query("limit") limit: Int,
|
||||||
|
@Query("filter") filter: String?
|
||||||
|
): PaginationResponse
|
||||||
}
|
}
|
||||||
|
|
|
@ -290,7 +290,7 @@ internal class LocalEchoEventFactory @Inject constructor(
|
||||||
size = attachment.size
|
size = attachment.size
|
||||||
),
|
),
|
||||||
url = attachment.queryUri.toString(),
|
url = attachment.queryUri.toString(),
|
||||||
relatesTo = rootThreadEventId?.let { RelationDefaultContent(RelationType.THREAD, it) }
|
relatesTo = rootThreadEventId?.let { RelationDefaultContent(RelationType.IO_THREAD, it) }
|
||||||
)
|
)
|
||||||
return createMessageEvent(roomId, content)
|
return createMessageEvent(roomId, content)
|
||||||
}
|
}
|
||||||
|
@ -327,7 +327,7 @@ internal class LocalEchoEventFactory @Inject constructor(
|
||||||
thumbnailInfo = thumbnailInfo
|
thumbnailInfo = thumbnailInfo
|
||||||
),
|
),
|
||||||
url = attachment.queryUri.toString(),
|
url = attachment.queryUri.toString(),
|
||||||
relatesTo = rootThreadEventId?.let { RelationDefaultContent(RelationType.THREAD, it) }
|
relatesTo = rootThreadEventId?.let { RelationDefaultContent(RelationType.IO_THREAD, it) }
|
||||||
)
|
)
|
||||||
return createMessageEvent(roomId, content)
|
return createMessageEvent(roomId, content)
|
||||||
}
|
}
|
||||||
|
@ -351,7 +351,7 @@ internal class LocalEchoEventFactory @Inject constructor(
|
||||||
waveform = waveformSanitizer.sanitize(attachment.waveform)
|
waveform = waveformSanitizer.sanitize(attachment.waveform)
|
||||||
),
|
),
|
||||||
voiceMessageIndicator = if (!isVoiceMessage) null else emptyMap(),
|
voiceMessageIndicator = if (!isVoiceMessage) null else emptyMap(),
|
||||||
relatesTo = rootThreadEventId?.let { RelationDefaultContent(RelationType.THREAD, it) }
|
relatesTo = rootThreadEventId?.let { RelationDefaultContent(RelationType.IO_THREAD, it) }
|
||||||
)
|
)
|
||||||
return createMessageEvent(roomId, content)
|
return createMessageEvent(roomId, content)
|
||||||
}
|
}
|
||||||
|
@ -365,7 +365,7 @@ internal class LocalEchoEventFactory @Inject constructor(
|
||||||
size = attachment.size
|
size = attachment.size
|
||||||
),
|
),
|
||||||
url = attachment.queryUri.toString(),
|
url = attachment.queryUri.toString(),
|
||||||
relatesTo = rootThreadEventId?.let { RelationDefaultContent(RelationType.THREAD, it) }
|
relatesTo = rootThreadEventId?.let { RelationDefaultContent(RelationType.IO_THREAD, it) }
|
||||||
)
|
)
|
||||||
return createMessageEvent(roomId, content)
|
return createMessageEvent(roomId, content)
|
||||||
}
|
}
|
||||||
|
@ -454,7 +454,7 @@ internal class LocalEchoEventFactory @Inject constructor(
|
||||||
private fun generateReplyRelationContent(eventId: String, rootThreadEventId: String? = null): RelationDefaultContent =
|
private fun generateReplyRelationContent(eventId: String, rootThreadEventId: String? = null): RelationDefaultContent =
|
||||||
rootThreadEventId?.let {
|
rootThreadEventId?.let {
|
||||||
RelationDefaultContent(
|
RelationDefaultContent(
|
||||||
type = RelationType.THREAD,
|
type = RelationType.IO_THREAD,
|
||||||
eventId = it,
|
eventId = it,
|
||||||
inReplyTo = ReplyToContent(eventId))
|
inReplyTo = ReplyToContent(eventId))
|
||||||
} ?: RelationDefaultContent(null, null, ReplyToContent(eventId))
|
} ?: RelationDefaultContent(null, null, ReplyToContent(eventId))
|
||||||
|
|
|
@ -48,7 +48,7 @@ fun TextContent.toThreadTextContent(rootThreadEventId: String, msgType: String =
|
||||||
msgType = msgType,
|
msgType = msgType,
|
||||||
format = MessageFormat.FORMAT_MATRIX_HTML.takeIf { formattedText != null },
|
format = MessageFormat.FORMAT_MATRIX_HTML.takeIf { formattedText != null },
|
||||||
body = text,
|
body = text,
|
||||||
relatesTo = RelationDefaultContent(RelationType.THREAD, rootThreadEventId),
|
relatesTo = RelationDefaultContent(RelationType.IO_THREAD, rootThreadEventId),
|
||||||
formattedBody = formattedText
|
formattedBody = formattedText
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -272,7 +272,7 @@ internal class ThreadsAwarenessHandler @Inject constructor(
|
||||||
* @param event
|
* @param event
|
||||||
*/
|
*/
|
||||||
private fun isThreadEvent(event: Event): Boolean =
|
private fun isThreadEvent(event: Event): Boolean =
|
||||||
event.content.toModel<MessageRelationContent>()?.relatesTo?.type == RelationType.THREAD
|
event.content.toModel<MessageRelationContent>()?.relatesTo?.type == RelationType.IO_THREAD
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the root thread eventId or null otherwise
|
* Returns the root thread eventId or null otherwise
|
||||||
|
|
|
@ -436,7 +436,7 @@ class RoomDetailViewModel @AssistedInject constructor(
|
||||||
|
|
||||||
private fun handleSendSticker(action: RoomDetailAction.SendSticker) {
|
private fun handleSendSticker(action: RoomDetailAction.SendSticker) {
|
||||||
val content = initialState.rootThreadEventId?.let {
|
val content = initialState.rootThreadEventId?.let {
|
||||||
action.stickerContent.copy(relatesTo = RelationDefaultContent(RelationType.THREAD, it))
|
action.stickerContent.copy(relatesTo = RelationDefaultContent(RelationType.IO_THREAD, it))
|
||||||
} ?: action.stickerContent
|
} ?: action.stickerContent
|
||||||
room.sendEvent(EventType.STICKER, content.toContent())
|
room.sendEvent(EventType.STICKER, content.toContent())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue