diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt index b9889b73..1a5594f2 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt @@ -154,7 +154,7 @@ internal class SessionModule(private val sessionParams: SessionParams) { scope(DefaultSession.SCOPE) { val groupSummaryUpdater = GroupSummaryUpdater(get()) - val eventsPruner = EventsPruner(get()) + val eventsPruner = EventsPruner(get(), get()) val userEntityUpdater = UserEntityUpdater(get(), get(), get()) listOf(groupSummaryUpdater, eventsPruner, userEntityUpdater) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/EventsPruner.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/EventsPruner.kt index d6792f30..36e280bb 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/EventsPruner.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/EventsPruner.kt @@ -20,6 +20,7 @@ import androidx.work.ExistingWorkPolicy import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import com.zhuinden.monarchy.Monarchy +import im.vector.matrix.android.api.auth.data.Credentials import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.internal.database.RealmLiveEntityObserver import im.vector.matrix.android.internal.database.mapper.asDomain @@ -29,7 +30,7 @@ import im.vector.matrix.android.internal.util.WorkerParamsFactory private const val PRUNE_EVENT_WORKER = "PRUNE_EVENT_WORKER" -internal class EventsPruner(monarchy: Monarchy) : +internal class EventsPruner(monarchy: Monarchy, private val credentials: Credentials) : RealmLiveEntityObserver(monarchy) { override val query = Monarchy.Query { EventEntity.where(it, type = EventType.REDACTION) } @@ -38,7 +39,7 @@ internal class EventsPruner(monarchy: Monarchy) : val redactionEvents = inserted .mapNotNull { it.asDomain() } - val pruneEventWorkerParams = PruneEventWorker.Params(redactionEvents) + val pruneEventWorkerParams = PruneEventWorker.Params(redactionEvents, credentials.userId) val workData = WorkerParamsFactory.toData(pruneEventWorkerParams) val sendWork = OneTimeWorkRequestBuilder() diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/PruneEventWorker.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/PruneEventWorker.kt index a65988a5..08a1491e 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/PruneEventWorker.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/prune/PruneEventWorker.kt @@ -40,13 +40,15 @@ import io.realm.Realm import org.koin.standalone.inject import timber.log.Timber +//TODO should be a task instead of worker internal class PruneEventWorker(context: Context, workerParameters: WorkerParameters ) : Worker(context, workerParameters), MatrixKoinComponent { @JsonClass(generateAdapter = true) internal class Params( - val redactionEvents: List + val redactionEvents: List, + val userId: String ) private val monarchy by inject() @@ -57,7 +59,7 @@ internal class PruneEventWorker(context: Context, val result = monarchy.tryTransactionSync { realm -> params.redactionEvents.forEach { event -> - pruneEvent(realm, event) + pruneEvent(realm, event, params.userId) } } return result.fold({ @@ -67,7 +69,7 @@ internal class PruneEventWorker(context: Context, }) } - private fun pruneEvent(realm: Realm, redactionEvent: Event) { + private fun pruneEvent(realm: Realm, redactionEvent: Event, userId: String) { if (redactionEvent.redacts.isNullOrBlank()) { return } @@ -88,6 +90,7 @@ internal class PruneEventWorker(context: Context, val modified = unsignedData.copy(redactedEvent = redactionEvent) eventToPrune.content = ContentMapper.map(emptyMap()) eventToPrune.unsignedData = MoshiProvider.providesMoshi().adapter(UnsignedData::class.java).toJson(modified) + } EventType.REACTION -> { Timber.d("REDACTION of reaction ${eventToPrune.eventId}") @@ -110,6 +113,10 @@ internal class PruneEventWorker(context: Context, summary.sourceEvents.remove(eventToPrune.eventId) Timber.d("Known reactions after ${summary.sourceEvents.joinToString(",")}") summary.count = summary.count - 1 + if (eventToPrune.sender == userId) { + //Was it a redact on my reaction? + summary.addedByMe = false + } if (summary.count == 0) { //delete! summary.deleteFromRealm()