commit
02914495ce
|
@ -19,7 +19,5 @@ package im.vector.matrix.android.internal.extensions
|
||||||
import io.realm.RealmObject
|
import io.realm.RealmObject
|
||||||
|
|
||||||
internal fun RealmObject.assertIsManaged() {
|
internal fun RealmObject.assertIsManaged() {
|
||||||
if (!isManaged) {
|
check(isManaged) { "${javaClass.simpleName} entity should be managed to use this function" }
|
||||||
throw IllegalStateException("${javaClass.simpleName} entity should be managed to use this function")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,10 +32,8 @@ import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
|
||||||
import im.vector.matrix.android.api.util.Cancelable
|
import im.vector.matrix.android.api.util.Cancelable
|
||||||
import im.vector.matrix.android.api.util.Optional
|
import im.vector.matrix.android.api.util.Optional
|
||||||
import im.vector.matrix.android.api.util.toOptional
|
import im.vector.matrix.android.api.util.toOptional
|
||||||
import im.vector.matrix.android.internal.database.helper.addSendingEvent
|
|
||||||
import im.vector.matrix.android.internal.database.mapper.asDomain
|
import im.vector.matrix.android.internal.database.mapper.asDomain
|
||||||
import im.vector.matrix.android.internal.database.model.EventAnnotationsSummaryEntity
|
import im.vector.matrix.android.internal.database.model.EventAnnotationsSummaryEntity
|
||||||
import im.vector.matrix.android.internal.database.model.RoomEntity
|
|
||||||
import im.vector.matrix.android.internal.database.query.where
|
import im.vector.matrix.android.internal.database.query.where
|
||||||
import im.vector.matrix.android.internal.di.UserId
|
import im.vector.matrix.android.internal.di.UserId
|
||||||
import im.vector.matrix.android.internal.session.room.send.EncryptEventWorker
|
import im.vector.matrix.android.internal.session.room.send.EncryptEventWorker
|
||||||
|
@ -67,9 +65,7 @@ internal class DefaultRelationService @AssistedInject constructor(@Assisted priv
|
||||||
|
|
||||||
override fun sendReaction(targetEventId: String, reaction: String): Cancelable {
|
override fun sendReaction(targetEventId: String, reaction: String): Cancelable {
|
||||||
val event = eventFactory.createReactionEvent(roomId, targetEventId, reaction)
|
val event = eventFactory.createReactionEvent(roomId, targetEventId, reaction)
|
||||||
.also {
|
.also { saveLocalEcho(it) }
|
||||||
saveLocalEcho(it)
|
|
||||||
}
|
|
||||||
val sendRelationWork = createSendEventWork(event, true)
|
val sendRelationWork = createSendEventWork(event, true)
|
||||||
TimelineSendEventWorkCommon.postWork(context, roomId, sendRelationWork)
|
TimelineSendEventWorkCommon.postWork(context, roomId, sendRelationWork)
|
||||||
return CancelableWork(context, sendRelationWork.id)
|
return CancelableWork(context, sendRelationWork.id)
|
||||||
|
@ -89,9 +85,8 @@ internal class DefaultRelationService @AssistedInject constructor(@Assisted priv
|
||||||
// TODO?
|
// TODO?
|
||||||
}
|
}
|
||||||
data.redactEventId?.let { toRedact ->
|
data.redactEventId?.let { toRedact ->
|
||||||
val redactEvent = eventFactory.createRedactEvent(roomId, toRedact, null).also {
|
val redactEvent = eventFactory.createRedactEvent(roomId, toRedact, null)
|
||||||
saveLocalEcho(it)
|
.also { saveLocalEcho(it) }
|
||||||
}
|
|
||||||
val redactWork = createRedactEventWork(redactEvent, toRedact, null)
|
val redactWork = createRedactEventWork(redactEvent, toRedact, null)
|
||||||
|
|
||||||
TimelineSendEventWorkCommon.postWork(context, roomId, redactWork)
|
TimelineSendEventWorkCommon.postWork(context, roomId, redactWork)
|
||||||
|
@ -125,9 +120,7 @@ internal class DefaultRelationService @AssistedInject constructor(@Assisted priv
|
||||||
compatibilityBodyText: String): Cancelable {
|
compatibilityBodyText: String): Cancelable {
|
||||||
val event = eventFactory
|
val event = eventFactory
|
||||||
.createReplaceTextEvent(roomId, targetEventId, newBodyText, newBodyAutoMarkdown, msgType, compatibilityBodyText)
|
.createReplaceTextEvent(roomId, targetEventId, newBodyText, newBodyAutoMarkdown, msgType, compatibilityBodyText)
|
||||||
.also {
|
.also { saveLocalEcho(it) }
|
||||||
saveLocalEcho(it)
|
|
||||||
}
|
|
||||||
return if (cryptoService.isRoomEncrypted(roomId)) {
|
return if (cryptoService.isRoomEncrypted(roomId)) {
|
||||||
val encryptWork = createEncryptEventWork(event, listOf("m.relates_to"))
|
val encryptWork = createEncryptEventWork(event, listOf("m.relates_to"))
|
||||||
val workRequest = createSendEventWork(event, false)
|
val workRequest = createSendEventWork(event, false)
|
||||||
|
@ -149,9 +142,7 @@ internal class DefaultRelationService @AssistedInject constructor(@Assisted priv
|
||||||
replyToEdit,
|
replyToEdit,
|
||||||
originalTimelineEvent,
|
originalTimelineEvent,
|
||||||
newBodyText, true, MessageType.MSGTYPE_TEXT, compatibilityBodyText)
|
newBodyText, true, MessageType.MSGTYPE_TEXT, compatibilityBodyText)
|
||||||
.also {
|
.also { saveLocalEcho(it) }
|
||||||
saveLocalEcho(it)
|
|
||||||
}
|
|
||||||
return if (cryptoService.isRoomEncrypted(roomId)) {
|
return if (cryptoService.isRoomEncrypted(roomId)) {
|
||||||
val encryptWork = createEncryptEventWork(event, listOf("m.relates_to"))
|
val encryptWork = createEncryptEventWork(event, listOf("m.relates_to"))
|
||||||
val workRequest = createSendEventWork(event, false)
|
val workRequest = createSendEventWork(event, false)
|
||||||
|
@ -174,9 +165,9 @@ internal class DefaultRelationService @AssistedInject constructor(@Assisted priv
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun replyToMessage(eventReplied: TimelineEvent, replyText: String, autoMarkdown: Boolean): Cancelable? {
|
override fun replyToMessage(eventReplied: TimelineEvent, replyText: String, autoMarkdown: Boolean): Cancelable? {
|
||||||
val event = eventFactory.createReplyTextEvent(roomId, eventReplied, replyText, autoMarkdown)?.also {
|
val event = eventFactory.createReplyTextEvent(roomId, eventReplied, replyText, autoMarkdown)
|
||||||
saveLocalEcho(it)
|
?.also { saveLocalEcho(it) }
|
||||||
} ?: return null
|
?: return null
|
||||||
|
|
||||||
return if (cryptoService.isRoomEncrypted(roomId)) {
|
return if (cryptoService.isRoomEncrypted(roomId)) {
|
||||||
val encryptWork = createEncryptEventWork(event, listOf("m.relates_to"))
|
val encryptWork = createEncryptEventWork(event, listOf("m.relates_to"))
|
||||||
|
@ -220,10 +211,6 @@ internal class DefaultRelationService @AssistedInject constructor(@Assisted priv
|
||||||
* the same transaction id is received (in unsigned data)
|
* the same transaction id is received (in unsigned data)
|
||||||
*/
|
*/
|
||||||
private fun saveLocalEcho(event: Event) {
|
private fun saveLocalEcho(event: Event) {
|
||||||
monarchy.writeAsync { realm ->
|
eventFactory.saveLocalEcho(monarchy, event)
|
||||||
val roomEntity = RoomEntity.where(realm, roomId = roomId).findFirst()
|
|
||||||
?: return@writeAsync
|
|
||||||
roomEntity.addSendingEvent(event)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ import im.vector.matrix.android.api.util.ContentUtils.extractUsefulTextFromReply
|
||||||
*/
|
*/
|
||||||
data class TextContent(
|
data class TextContent(
|
||||||
val text: String,
|
val text: String,
|
||||||
|
|
||||||
val formattedText: String? = null
|
val formattedText: String? = null
|
||||||
) {
|
) {
|
||||||
fun takeFormatted() = formattedText ?: text
|
fun takeFormatted() = formattedText ?: text
|
||||||
|
|
|
@ -39,8 +39,8 @@ internal class TimelineEventDecryptor(
|
||||||
override fun onNewSession(roomId: String?, senderKey: String, sessionId: String) {
|
override fun onNewSession(roomId: String?, senderKey: String, sessionId: String) {
|
||||||
synchronized(unknownSessionsFailure) {
|
synchronized(unknownSessionsFailure) {
|
||||||
unknownSessionsFailure[sessionId]
|
unknownSessionsFailure[sessionId]
|
||||||
|
?.toList()
|
||||||
.orEmpty()
|
.orEmpty()
|
||||||
.toList()
|
|
||||||
.also {
|
.also {
|
||||||
unknownSessionsFailure[sessionId]?.clear()
|
unknownSessionsFailure[sessionId]?.clear()
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ internal class TimelineEventDecryptor(
|
||||||
// Set of eventIds which are currently decrypting
|
// Set of eventIds which are currently decrypting
|
||||||
private val existingRequests = mutableSetOf<String>()
|
private val existingRequests = mutableSetOf<String>()
|
||||||
// sessionId -> list of eventIds
|
// sessionId -> list of eventIds
|
||||||
private val unknownSessionsFailure = mutableMapOf<String, MutableList<String>>()
|
private val unknownSessionsFailure = mutableMapOf<String, MutableSet<String>>()
|
||||||
|
|
||||||
fun start() {
|
fun start() {
|
||||||
executor = Executors.newSingleThreadExecutor()
|
executor = Executors.newSingleThreadExecutor()
|
||||||
|
@ -84,11 +84,10 @@ internal class TimelineEventDecryptor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
synchronized(existingRequests) {
|
synchronized(existingRequests) {
|
||||||
if (eventId in existingRequests) {
|
if (!existingRequests.add(eventId)) {
|
||||||
Timber.d("Skip Decryption request for event $eventId, already requested")
|
Timber.d("Skip Decryption request for event $eventId, already requested")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
existingRequests.add(eventId)
|
|
||||||
}
|
}
|
||||||
executor?.execute {
|
executor?.execute {
|
||||||
Realm.getInstance(realmConfiguration).use { realm ->
|
Realm.getInstance(realmConfiguration).use { realm ->
|
||||||
|
@ -120,7 +119,7 @@ internal class TimelineEventDecryptor(
|
||||||
event.content?.toModel<EncryptedEventContent>()?.let { content ->
|
event.content?.toModel<EncryptedEventContent>()?.let { content ->
|
||||||
content.sessionId?.let { sessionId ->
|
content.sessionId?.let { sessionId ->
|
||||||
synchronized(unknownSessionsFailure) {
|
synchronized(unknownSessionsFailure) {
|
||||||
val list = unknownSessionsFailure.getOrPut(sessionId) { ArrayList() }
|
val list = unknownSessionsFailure.getOrPut(sessionId) { mutableSetOf() }
|
||||||
list.add(eventId)
|
list.add(eventId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,3 +156,6 @@ Formatter\.formatFileSize===1
|
||||||
|
|
||||||
### Use TextUtils.formatFileSize with short format param to true
|
### Use TextUtils.formatFileSize with short format param to true
|
||||||
Formatter\.formatShortFileSize===1
|
Formatter\.formatShortFileSize===1
|
||||||
|
|
||||||
|
### Use kotlin stdlib to test or compare strings
|
||||||
|
android\.text\.TextUtils
|
||||||
|
|
Loading…
Reference in New Issue