Skip to content

Commit 0704fc5

Browse files
author
Florian Renaud
committed
Add missing withRelations fields
1 parent 9c3cacc commit 0704fc5

File tree

11 files changed

+88
-21
lines changed

11 files changed

+88
-21
lines changed

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/send/SendService.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,12 @@ interface SendService {
156156

157157
/**
158158
* Redact (delete) the given event.
159-
* @param event The event to redact
160-
* @param reason Optional reason string
159+
* @param event the event to redact
160+
* @param reason optional reason string
161+
* @param withRelations the list of relation types to redact with this event
161162
* @param additionalContent additional content to put in the event content
162163
*/
163-
fun redactEvent(event: Event, reason: String?, additionalContent: Content? = null): Cancelable
164+
fun redactEvent(event: Event, reason: String?, withRelations: List<String>? = null, additionalContent: Content? = null): Cancelable
164165

165166
/**
166167
* Schedule this message to be resent.

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/RedactEventTask.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ internal class DefaultRedactEventTask @Inject constructor(
5252
txId = params.txID,
5353
roomId = params.roomId,
5454
eventId = params.eventId,
55-
body = EventRedactBody(params.reason, withRelations)
55+
body = EventRedactBody(params.reason, withRelations, withRelations)
5656
)
5757
}
5858
return response.eventId

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo045
6565
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo046
6666
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo047
6767
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo048
68+
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo049
6869
import org.matrix.android.sdk.internal.util.Normalizer
6970
import org.matrix.android.sdk.internal.util.database.MatrixRealmMigration
7071
import javax.inject.Inject
@@ -73,7 +74,7 @@ internal class RealmSessionStoreMigration @Inject constructor(
7374
private val normalizer: Normalizer
7475
) : MatrixRealmMigration(
7576
dbName = "Session",
76-
schemaVersion = 48L,
77+
schemaVersion = 49L,
7778
) {
7879
/**
7980
* Forces all RealmSessionStoreMigration instances to be equal.
@@ -131,5 +132,6 @@ internal class RealmSessionStoreMigration @Inject constructor(
131132
if (oldVersion < 46) MigrateSessionTo046(realm).perform()
132133
if (oldVersion < 47) MigrateSessionTo047(realm).perform()
133134
if (oldVersion < 48) MigrateSessionTo048(realm).perform()
135+
if (oldVersion < 49) MigrateSessionTo049(realm).perform()
134136
}
135137
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright (c) 2023 The Matrix.org Foundation C.I.C.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.matrix.android.sdk.internal.database.migration
18+
19+
import io.realm.DynamicRealm
20+
import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntityFields
21+
import org.matrix.android.sdk.internal.extensions.forceRefreshOfHomeServerCapabilities
22+
import org.matrix.android.sdk.internal.util.database.RealmMigrator
23+
24+
internal class MigrateSessionTo049(realm: DynamicRealm) : RealmMigrator(realm, 49) {
25+
26+
override fun doMigrate(realm: DynamicRealm) {
27+
realm.schema.get("HomeServerCapabilitiesEntity")
28+
?.addField(HomeServerCapabilitiesEntityFields.CAN_REDACT_EVENT_WITH_RELATIONS, Boolean::class.java)
29+
?.transform { obj ->
30+
obj.set(HomeServerCapabilitiesEntityFields.CAN_REDACT_EVENT_WITH_RELATIONS, false)
31+
}
32+
?.forceRefreshOfHomeServerCapabilities()
33+
}
34+
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRedactBody.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,8 @@ internal data class EventRedactBody(
2525
val reason: String? = null,
2626

2727
@Json(name = "with_relations")
28-
val withRelations: List<String>? = null
28+
val withRelations: List<String>? = null,
29+
30+
@Json(name = "org.matrix.msc3912.with_relations")
31+
val withRelationsUnstable: List<String>? = null,
2932
)

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,11 +140,11 @@ internal class DefaultSendService @AssistedInject constructor(
140140
.let { sendEvent(it) }
141141
}
142142

143-
override fun redactEvent(event: Event, reason: String?, additionalContent: Content?): Cancelable {
143+
override fun redactEvent(event: Event, reason: String?, withRelations: List<String>?, additionalContent: Content?): Cancelable {
144144
// TODO manage media/attachements?
145-
val redactionEcho = localEchoEventFactory.createRedactEvent(roomId, event.eventId!!, reason, additionalContent)
145+
val redactionEcho = localEchoEventFactory.createRedactEvent(roomId, event.eventId!!, reason, withRelations, additionalContent)
146146
.also { createLocalEcho(it) }
147-
return eventSenderProcessor.postRedaction(redactionEcho, reason)
147+
return eventSenderProcessor.postRedaction(redactionEcho, reason, withRelations)
148148
}
149149

150150
override fun resendTextMessage(localEcho: TimelineEvent): Cancelable {

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ import org.matrix.android.sdk.api.util.TextContent
7070
import org.matrix.android.sdk.internal.di.UserId
7171
import org.matrix.android.sdk.internal.session.content.ThumbnailExtractor
7272
import org.matrix.android.sdk.internal.session.permalinks.PermalinkFactory
73+
import org.matrix.android.sdk.internal.session.room.EventRedactBody
7374
import org.matrix.android.sdk.internal.session.room.send.pills.TextPillsUtils
7475
import org.matrix.android.sdk.internal.util.time.Clock
7576
import java.util.UUID
@@ -795,16 +796,21 @@ internal class LocalEchoEventFactory @Inject constructor(
795796
}
796797
}
797798
*/
798-
fun createRedactEvent(roomId: String, eventId: String, reason: String?, additionalContent: Content? = null): Event {
799+
fun createRedactEvent(roomId: String, eventId: String, reason: String?, withRelations: List<String>? = null, additionalContent: Content? = null): Event {
799800
val localId = LocalEcho.createLocalEchoId()
801+
val content = if (reason != null || withRelations != null) {
802+
EventRedactBody(reason, withRelations, withRelations).toContent().plus(additionalContent.orEmpty())
803+
} else {
804+
additionalContent
805+
}
800806
return Event(
801807
roomId = roomId,
802808
originServerTs = dummyOriginServerTs(),
803809
senderId = userId,
804810
eventId = localId,
805811
type = EventType.REDACTION,
806812
redacts = eventId,
807-
content = reason?.let { mapOf("reason" to it).toContent().plus(additionalContent.orEmpty()) } ?: additionalContent,
813+
content = content,
808814
unsignedData = UnsignedData(age = null, transactionId = localId)
809815
)
810816
}
@@ -830,10 +836,10 @@ internal class LocalEchoEventFactory @Inject constructor(
830836
createMessageEvent(
831837
roomId,
832838
textContent.toThreadTextContent(
833-
rootThreadEventId = rootThreadEventId,
834-
latestThreadEventId = localEchoRepository.getLatestThreadEvent(rootThreadEventId),
835-
msgType = MessageType.MSGTYPE_TEXT
836-
),
839+
rootThreadEventId = rootThreadEventId,
840+
latestThreadEventId = localEchoRepository.getLatestThreadEvent(rootThreadEventId),
841+
msgType = MessageType.MSGTYPE_TEXT
842+
),
837843
additionalContent,
838844
)
839845
} else {

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/RedactEventWorker.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@ import android.content.Context
1919
import androidx.work.WorkerParameters
2020
import com.squareup.moshi.JsonClass
2121
import org.matrix.android.sdk.api.failure.Failure
22+
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService
2223
import org.matrix.android.sdk.internal.SessionManager
2324
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
2425
import org.matrix.android.sdk.internal.network.executeRequest
2526
import org.matrix.android.sdk.internal.session.SessionComponent
27+
import org.matrix.android.sdk.internal.session.room.EventRedactBody
2628
import org.matrix.android.sdk.internal.session.room.RoomAPI
2729
import org.matrix.android.sdk.internal.worker.SessionSafeCoroutineWorker
2830
import org.matrix.android.sdk.internal.worker.SessionWorkerParams
@@ -43,25 +45,34 @@ internal class RedactEventWorker(context: Context, params: WorkerParameters, ses
4345
val roomId: String,
4446
val eventId: String,
4547
val reason: String?,
48+
val withRelations: List<String>? = null,
4649
override val lastFailureMessage: String? = null
4750
) : SessionWorkerParams
4851

4952
@Inject lateinit var roomAPI: RoomAPI
5053
@Inject lateinit var globalErrorReceiver: GlobalErrorReceiver
54+
@Inject lateinit var homeServerCapabilitiesService: HomeServerCapabilitiesService
5155

5256
override fun injectWith(injector: SessionComponent) {
5357
injector.inject(this)
5458
}
5559

5660
override suspend fun doSafeWork(params: Params): Result {
5761
val eventId = params.eventId
62+
val withRelations = if (homeServerCapabilitiesService.getHomeServerCapabilities().canRedactEventWithRelations &&
63+
!params.withRelations.isNullOrEmpty()) {
64+
params.withRelations
65+
} else {
66+
null
67+
}
68+
5869
return runCatching {
5970
executeRequest(globalErrorReceiver) {
6071
roomAPI.redactEvent(
6172
params.txID,
6273
params.roomId,
6374
eventId,
64-
if (params.reason == null) emptyMap() else mapOf("reason" to params.reason)
75+
EventRedactBody(params.reason, withRelations, withRelations)
6576
)
6677
}
6778
}.fold(

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ internal interface EventSenderProcessor : SessionLifecycleObserver {
2626

2727
fun postEvent(event: Event, encrypt: Boolean): Cancelable
2828

29-
fun postRedaction(redactionLocalEcho: Event, reason: String?, withRelations: List<String>?): Cancelable
29+
fun postRedaction(redactionLocalEcho: Event, reason: String?, withRelations: List<String>? = null): Cancelable
3030

31-
fun postRedaction(redactionLocalEchoId: String, eventToRedactId: String, roomId: String, reason: String?, withRelations: List<String>?): Cancelable
31+
fun postRedaction(redactionLocalEchoId: String, eventToRedactId: String, roomId: String, reason: String?, withRelations: List<String>? = null): Cancelable
3232

3333
fun postTask(task: QueuedTask): Cancelable
3434

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueueMemento.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ package org.matrix.android.sdk.internal.session.room.send.queue
1919
import android.content.Context
2020
import org.matrix.android.sdk.api.extensions.tryOrNull
2121
import org.matrix.android.sdk.api.session.crypto.CryptoService
22+
import org.matrix.android.sdk.api.session.events.model.toModel
2223
import org.matrix.android.sdk.api.session.room.send.SendState
2324
import org.matrix.android.sdk.internal.di.SessionId
25+
import org.matrix.android.sdk.internal.session.room.EventRedactBody
2426
import org.matrix.android.sdk.internal.session.room.send.LocalEchoRepository
2527
import timber.log.Timber
2628
import javax.inject.Inject
@@ -107,10 +109,18 @@ internal class QueueMemento @Inject constructor(
107109
info.redactionLocalEcho?.let { localEchoRepository.getUpToDateEcho(it) }?.let {
108110
localEchoRepository.updateSendState(it.eventId!!, it.roomId, SendState.UNSENT)
109111
// try to get reason
110-
val reason = it.content?.get("reason") as? String
112+
val body = it.content.toModel<EventRedactBody>()
111113
if (it.redacts != null && it.roomId != null) {
112114
Timber.d("## Send -Reschedule redact $info")
113-
eventProcessor.postTask(queuedTaskFactory.createRedactTask(it.eventId, it.redacts, it.roomId, reason))
115+
eventProcessor.postTask(
116+
queuedTaskFactory.createRedactTask(
117+
redactionLocalEcho = it.eventId,
118+
eventId = it.redacts,
119+
roomId = it.roomId,
120+
reason = body?.reason,
121+
withRelations = body?.withRelations ?: body?.withRelationsUnstable
122+
)
123+
)
114124
}
115125
}
116126
// postTask(queuedTaskFactory.createRedactTask(info.eventToRedactId, info.)

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueuedTaskFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ internal class QueuedTaskFactory @Inject constructor(
4343
)
4444
}
4545

46-
fun createRedactTask(redactionLocalEcho: String, eventId: String, roomId: String, reason: String?, withRelations: List<String>?): QueuedTask {
46+
fun createRedactTask(redactionLocalEcho: String, eventId: String, roomId: String, reason: String?, withRelations: List<String>? = null): QueuedTask {
4747
return RedactQueuedTask(
4848
redactionLocalEchoId = redactionLocalEcho,
4949
toRedactEventId = eventId,

0 commit comments

Comments
 (0)