diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/ReferencesAggregatedContent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/ReferencesAggregatedContent.kt index ae6e52a091..31a5694682 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/ReferencesAggregatedContent.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/ReferencesAggregatedContent.kt @@ -17,6 +17,7 @@ package im.vector.matrix.android.api.session.room.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass +import im.vector.matrix.android.internal.session.room.VerificationState /** * Contains an aggregated summary info of the references. @@ -26,6 +27,6 @@ import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) data class ReferencesAggregatedContent( // Verification status info for m.key.verification.request msgType events - @Json(name = "verif_sum") val verificationSummary: String + @Json(name = "verif_sum") val verificationState: VerificationState // Add more fields for future summary info. ) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/EventRelationsAggregationTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/EventRelationsAggregationTask.kt index 49ffe29c29..98046a4a36 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/EventRelationsAggregationTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/EventRelationsAggregationTask.kt @@ -73,6 +73,21 @@ fun VerificationState.isCanceled(): Boolean { return this == VerificationState.CANCELED_BY_ME || this == VerificationState.CANCELED_BY_OTHER } +// State transition with control +private fun VerificationState?.toState(newState: VerificationState): VerificationState { + // Cancel is always prioritary ? + // Eg id i found that mac or keys mismatch and send a cancel and the other send a done, i have to + // consider as canceled + if (newState.isCanceled()) { + return newState + } + // never move out of cancel + if (this?.isCanceled() == true) { + return this + } + return newState +} + /** * Called by EventRelationAggregationUpdater, when new events that can affect relations are inserted in base. */ @@ -550,26 +565,26 @@ internal class DefaultEventRelationsAggregationTask @Inject constructor( } else { ContentMapper.map(verifSummary.content)?.toModel() var data = ContentMapper.map(verifSummary.content)?.toModel() - ?: ReferencesAggregatedContent(VerificationState.REQUEST.name) + ?: ReferencesAggregatedContent(VerificationState.REQUEST) // TODO ignore invalid messages? e.g a START after a CANCEL? // i.e. never change state if already canceled/done - val currentState = VerificationState.values().firstOrNull { data.verificationSummary == it.name } + val currentState = data.verificationState val newState = when (event.getClearType()) { EventType.KEY_VERIFICATION_START, EventType.KEY_VERIFICATION_ACCEPT, EventType.KEY_VERIFICATION_READY, EventType.KEY_VERIFICATION_KEY, - EventType.KEY_VERIFICATION_MAC -> updateVerificationState(currentState, VerificationState.WAITING) - EventType.KEY_VERIFICATION_CANCEL -> updateVerificationState(currentState, if (event.senderId == userId) { + EventType.KEY_VERIFICATION_MAC -> currentState.toState(VerificationState.WAITING) + EventType.KEY_VERIFICATION_CANCEL -> currentState.toState(if (event.senderId == userId) { VerificationState.CANCELED_BY_ME } else { VerificationState.CANCELED_BY_OTHER }) - EventType.KEY_VERIFICATION_DONE -> updateVerificationState(currentState, VerificationState.DONE) + EventType.KEY_VERIFICATION_DONE -> currentState.toState(VerificationState.DONE) else -> VerificationState.REQUEST } - data = data.copy(verificationSummary = newState.name) + data = data.copy(verificationState = newState) verifSummary.content = ContentMapper.map(data.toContent()) } @@ -580,19 +595,4 @@ internal class DefaultEventRelationsAggregationTask @Inject constructor( verifSummary.sourceEvents.add(event.eventId) } } - - // TODO Ben refacto -> fun VerifcationState?.toState(state): State - private fun updateVerificationState(oldState: VerificationState?, newState: VerificationState): VerificationState { - // Cancel is always prioritary ? - // Eg id i found that mac or keys mismatch and send a cancel and the other send a done, i have to - // consider as canceled - if (newState.isCanceled()) { - return newState - } - // never move out of cancel - if (oldState?.isCanceled() == true) { - return oldState - } - return newState - } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt index c300b8e1c3..2a7261665a 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt @@ -104,11 +104,9 @@ class MessageInformationDataFactory @Inject constructor(private val session: Ses } .toList(), referencesInfoData = event.annotations?.referencesAggregatedSummary?.let { referencesAggregatedSummary -> - val stateStr = referencesAggregatedSummary.content.toModel()?.verificationSummary - ReferencesInfoData( - VerificationState.values().firstOrNull { stateStr == it.name } - ?: VerificationState.REQUEST - ) + val verificationState = referencesAggregatedSummary.content.toModel()?.verificationState + ?: VerificationState.REQUEST + ReferencesInfoData(verificationState) }, sentByMe = event.root.senderId == session.myUserId ) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/VerificationRequestItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/VerificationRequestItem.kt index 853e40c516..5c3cf03aa8 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/VerificationRequestItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/VerificationRequestItem.kt @@ -31,6 +31,7 @@ import com.airbnb.epoxy.EpoxyModelClass import im.vector.matrix.android.api.session.crypto.sas.VerificationService import im.vector.matrix.android.internal.session.room.VerificationState import im.vector.riotx.R +import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.resources.ColorProvider import im.vector.riotx.core.utils.DebouncedClickListener import im.vector.riotx.features.home.AvatarRenderer @@ -102,12 +103,7 @@ abstract class VerificationRequestItem : AbsBaseMessageItem { - holder.buttonBar.isVisible = false - holder.statusTextView.text = null - holder.statusTextView.isVisible = false - } - } + }.exhaustive // Always hide buttons if request is too old if (!VerificationService.isValidRequest(attributes.informationData.ageLocalTS)) {