forked from GitHub-Mirror/riotX-android
E2E replies
+ Edit History / support e2e and use original event
This commit is contained in:
@ -244,7 +244,7 @@ class MessageMenuViewModel @AssistedInject constructor(@Assisted initialState: M
|
||||
//Only event of type Event.EVENT_TYPE_MESSAGE are supported for the moment
|
||||
if (event.root.getClearType() != EventType.MESSAGE) return false
|
||||
//TODO if user is admin or moderator
|
||||
val messageContent = event.root.content.toModel<MessageContent>()
|
||||
val messageContent = event.root.getClearContent().toModel<MessageContent>()
|
||||
return event.root.senderId == myUserId && (
|
||||
messageContent?.type == MessageType.MSGTYPE_TEXT
|
||||
|| messageContent?.type == MessageType.MSGTYPE_EMOTE
|
||||
|
@ -75,9 +75,7 @@ class ViewEditHistoryEpoxyController(private val context: Context,
|
||||
}
|
||||
} else {
|
||||
var lastDate: Calendar? = null
|
||||
sourceEvents.sortedByDescending {
|
||||
it.originServerTs ?: 0
|
||||
}.forEachIndexed { index, timelineEvent ->
|
||||
sourceEvents.forEachIndexed { index, timelineEvent ->
|
||||
|
||||
val evDate = Calendar.getInstance().apply {
|
||||
timeInMillis = timelineEvent.originServerTs
|
||||
|
@ -20,12 +20,15 @@ import com.squareup.inject.assisted.Assisted
|
||||
import com.squareup.inject.assisted.AssistedInject
|
||||
import im.vector.matrix.android.api.MatrixCallback
|
||||
import im.vector.matrix.android.api.session.Session
|
||||
import im.vector.matrix.android.api.session.crypto.MXCryptoError
|
||||
import im.vector.matrix.android.api.session.events.model.Event
|
||||
import im.vector.matrix.android.api.session.events.model.toModel
|
||||
import im.vector.matrix.android.api.session.room.model.message.MessageContent
|
||||
import im.vector.matrix.android.api.session.room.model.message.isReply
|
||||
import im.vector.matrix.android.internal.crypto.algorithms.olm.OlmDecryptionResult
|
||||
import im.vector.riotx.core.platform.VectorViewModel
|
||||
import im.vector.riotx.features.home.room.detail.timeline.helper.TimelineDateFormatter
|
||||
import java.util.*
|
||||
|
||||
|
||||
data class ViewEditHistoryViewState(
|
||||
@ -79,16 +82,36 @@ class ViewEditHistoryViewModel @AssistedInject constructor(@Assisted
|
||||
}
|
||||
|
||||
override fun onSuccess(data: List<Event>) {
|
||||
//TODO until supported by API Add original event manually
|
||||
val withOriginal = data.toMutableList()
|
||||
var originalIsReply = false
|
||||
room.getTimeLineEvent(eventId)?.let {
|
||||
withOriginal.add(it.root)
|
||||
originalIsReply = it.root.getClearContent().toModel<MessageContent>().isReply()
|
||||
|
||||
val events = data.map {
|
||||
val timelineID = it.roomId + UUID.randomUUID().toString()
|
||||
it.apply {
|
||||
//We need to check encryption
|
||||
if (isEncrypted() && mxDecryptionResult == null) {
|
||||
//for now decrypt sync
|
||||
try {
|
||||
val result = session.decryptEvent(this, timelineID)
|
||||
mxDecryptionResult = OlmDecryptionResult(
|
||||
payload = result.clearEvent,
|
||||
senderKey = result.senderCurve25519Key,
|
||||
keysClaimed = result.claimedEd25519Key?.let { k -> mapOf("ed25519" to k) },
|
||||
forwardingCurve25519KeyChain = result.forwardingCurve25519KeyChain
|
||||
)
|
||||
} catch (e: MXCryptoError) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (it.eventId == eventId) {
|
||||
originalIsReply = getClearContent().toModel<MessageContent>().isReply()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
setState {
|
||||
copy(
|
||||
editList = Success(withOriginal),
|
||||
editList = Success(events),
|
||||
isOriginalAReply = originalIsReply
|
||||
)
|
||||
}
|
||||
|
@ -27,12 +27,14 @@ import dagger.Lazy
|
||||
import im.vector.matrix.android.api.permalinks.MatrixLinkify
|
||||
import im.vector.matrix.android.api.permalinks.MatrixPermalinkSpan
|
||||
import im.vector.matrix.android.api.session.events.model.RelationType
|
||||
import im.vector.matrix.android.api.session.events.model.toModel
|
||||
import im.vector.matrix.android.api.session.room.model.EditAggregatedSummary
|
||||
import im.vector.matrix.android.api.session.room.model.message.*
|
||||
import im.vector.matrix.android.api.session.room.send.SendState
|
||||
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
|
||||
import im.vector.matrix.android.api.session.room.timeline.getLastMessageContent
|
||||
import im.vector.matrix.android.internal.crypto.attachments.toElementToDecrypt
|
||||
import im.vector.matrix.android.internal.crypto.model.event.EncryptedEventContent
|
||||
import im.vector.riotx.EmojiCompatFontProvider
|
||||
import im.vector.riotx.R
|
||||
import im.vector.riotx.core.epoxy.VectorEpoxyModel
|
||||
@ -83,7 +85,9 @@ class MessageItemFactory @Inject constructor(
|
||||
?: //Malformed content, we should echo something on screen
|
||||
return DefaultItem_().text(stringProvider.getString(R.string.malformed_message))
|
||||
|
||||
if (messageContent.relatesTo?.type == RelationType.REPLACE) {
|
||||
if (messageContent.relatesTo?.type == RelationType.REPLACE
|
||||
|| event.isEncrypted() && event.root.content.toModel<EncryptedEventContent>()?.relatesTo?.type == RelationType.REPLACE
|
||||
) {
|
||||
// ignore replace event, the targeted id is already edited
|
||||
return BlankItem_()
|
||||
}
|
||||
@ -229,7 +233,8 @@ class MessageItemFactory @Inject constructor(
|
||||
val (maxWidth, maxHeight) = timelineMediaSizeProvider.getMaxSize()
|
||||
val thumbnailData = ImageContentRenderer.Data(
|
||||
filename = messageContent.body,
|
||||
url = messageContent.videoInfo?.thumbnailFile?.url ?: messageContent.videoInfo?.thumbnailUrl,
|
||||
url = messageContent.videoInfo?.thumbnailFile?.url
|
||||
?: messageContent.videoInfo?.thumbnailUrl,
|
||||
elementToDecrypt = messageContent.videoInfo?.thumbnailFile?.toElementToDecrypt(),
|
||||
height = messageContent.videoInfo?.height,
|
||||
maxHeight = maxHeight,
|
||||
|
Reference in New Issue
Block a user