diff --git a/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt b/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt index cb8153c0fee..7642a0df39f 100644 --- a/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt @@ -35,6 +35,7 @@ import com.wire.kalium.logic.feature.auth.LogoutUseCase import com.wire.kalium.logic.feature.auth.sso.ValidateSSOCodeUseCase import com.wire.kalium.logic.feature.connection.BlockUserUseCase import com.wire.kalium.logic.feature.connection.UnblockUserUseCase +import com.wire.kalium.logic.feature.conversation.GetConversationEpochUseCase import com.wire.kalium.logic.feature.conversation.ObserveOtherUserSecurityClassificationLabelUseCase import com.wire.kalium.logic.feature.conversation.ObserveSecurityClassificationLabelUseCase import com.wire.kalium.logic.feature.e2ei.usecase.FetchConversationMLSVerificationStatusUseCase @@ -489,4 +490,11 @@ class UseCaseModule { @KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId ) = coreLogic.getSessionScope(currentAccount).getTeamUrlUseCase + + @ViewModelScoped + @Provides + fun provideGetConversationEpochUseCase( + @KaliumCoreLogic coreLogic: CoreLogic, + @CurrentAccount currentAccount: UserId + ): GetConversationEpochUseCase = coreLogic.getSessionScope(currentAccount).getConversationEpochUseCase } diff --git a/app/src/main/kotlin/com/wire/android/ui/debug/conversation/DebugConversationScreen.kt b/app/src/main/kotlin/com/wire/android/ui/debug/conversation/DebugConversationScreen.kt index 95b03982252..b13a0a22b87 100644 --- a/app/src/main/kotlin/com/wire/android/ui/debug/conversation/DebugConversationScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/debug/conversation/DebugConversationScreen.kt @@ -93,7 +93,7 @@ fun DebugConversationScreen( state.mlsProtocolInfo?.let { SectionHeader("MLS") - MlsDetailsView(it) + MlsDetailsView(it, state.epoch) } SectionHeader("Actions") @@ -205,7 +205,7 @@ private fun ConversationDetailsView(state: DebugConversationViewState) { } @Composable -private fun MlsDetailsView(mlsProtocolInfo: Conversation.ProtocolInfo.MLS) { +private fun MlsDetailsView(mlsProtocolInfo: Conversation.ProtocolInfo.MLS, epoch: ULong?) { val clipboard = LocalClipboardManager.current @@ -228,7 +228,7 @@ private fun MlsDetailsView(mlsProtocolInfo: Conversation.ProtocolInfo.MLS) { ) SettingsItem( title = "Epoch", - text = mlsProtocolInfo.epoch.toString(), + text = epoch.toString(), ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/debug/conversation/DebugConversationViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/debug/conversation/DebugConversationViewModel.kt index e751008c54e..bf85e827840 100644 --- a/app/src/main/kotlin/com/wire/android/ui/debug/conversation/DebugConversationViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/debug/conversation/DebugConversationViewModel.kt @@ -27,6 +27,7 @@ import com.wire.kalium.common.functional.onSuccess import com.wire.kalium.logic.data.conversation.Conversation import com.wire.kalium.logic.data.conversation.FetchConversationUseCase import com.wire.kalium.logic.data.conversation.ResetMLSConversationUseCase +import com.wire.kalium.logic.feature.conversation.GetConversationEpochUseCase import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -40,6 +41,7 @@ class DebugConversationViewModel @Inject constructor( private val conversationDetails: ObserveConversationDetailsUseCase, private val resetMLSConversation: ResetMLSConversationUseCase, private val fetchConversation: FetchConversationUseCase, + private val getConversationEpoch: GetConversationEpochUseCase, savedStateHandle: SavedStateHandle, ) : ActionsViewModel() { @@ -66,6 +68,19 @@ class DebugConversationViewModel @Inject constructor( mlsProtocolInfo = result.conversationDetails.conversation.protocol as? Conversation.ProtocolInfo.MLS, ) } + + // Call conversation epoch with the group id on every emit + (result.conversationDetails.conversation.protocol as? Conversation.ProtocolInfo.MLS)?.groupId?.let { groupId -> + when (val epochResult = getConversationEpoch(groupId)) { + is GetConversationEpochUseCase.Result.Success -> { + _state.update { it.copy(epoch = epochResult.epoch) } + } + + is GetConversationEpochUseCase.Result.Failure -> { + appLogger.e("Failed to get conversation epoch: ${epochResult.coreFailure}") + } + } + } } } } @@ -99,4 +114,5 @@ data class DebugConversationViewState( val conversationName: String? = null, val teamId: String? = null, val mlsProtocolInfo: Conversation.ProtocolInfo.MLS? = null, + val epoch: ULong? = null, ) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptions.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptions.kt index 2a992989757..c82abc193b7 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptions.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptions.kt @@ -436,7 +436,6 @@ private val StateAdmin = StateMember.copy( private val ProtocolInfoMLS = Conversation.ProtocolInfo.MLS( groupId = GroupID("groupId"), groupState = Conversation.ProtocolInfo.MLSCapable.GroupState.ESTABLISHED, - epoch = ULong.MIN_VALUE, keyingMaterialLastUpdate = Instant.fromEpochMilliseconds(1648654560000), cipherSuite = CipherSuite.MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519 ) diff --git a/app/src/test/kotlin/com/wire/android/framework/TestConversation.kt b/app/src/test/kotlin/com/wire/android/framework/TestConversation.kt index 831920c7979..37f4958a8cc 100644 --- a/app/src/test/kotlin/com/wire/android/framework/TestConversation.kt +++ b/app/src/test/kotlin/com/wire/android/framework/TestConversation.kt @@ -162,7 +162,6 @@ object TestConversation { val MLS_PROTOCOL_INFO = ProtocolInfo.MLS( GROUP_ID, ProtocolInfo.MLSCapable.GroupState.PENDING_JOIN, - 0UL, Instant.parse("2021-03-30T15:36:00.000Z"), cipherSuite = CipherSuite.MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519 ) diff --git a/app/src/test/kotlin/com/wire/android/ui/home/conversations/search/SearchUserViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/conversations/search/SearchUserViewModelTest.kt index 442fb6efe69..1fa2de78324 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/conversations/search/SearchUserViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/conversations/search/SearchUserViewModelTest.kt @@ -449,7 +449,6 @@ class SearchUserViewModelTest { val mlsProtocol = Conversation.ProtocolInfo.MLS( GroupID("s"), Conversation.ProtocolInfo.MLSCapable.GroupState.PENDING_CREATION, - 0UL, Instant.parse("2021-03-30T15:36:00.000Z"), cipherSuite = CipherSuite.MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519 ) diff --git a/kalium b/kalium index 5e4076c2a57..d18495676bb 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit 5e4076c2a578bb183c10b8395d4fc65e2404a9ec +Subproject commit d18495676bb2593cb8dd63d9f157886554583a41