From 6bcdcd70d15bed30ff00e8291c281f54f3ec9008 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Mon, 13 Oct 2025 15:49:25 +0200 Subject: [PATCH 1/8] refactor: remove unused MLS epoch references and clean up related code --- .../android/ui/debug/conversation/DebugConversationScreen.kt | 2 +- .../conversations/details/options/GroupConversationOptions.kt | 2 +- .../test/kotlin/com/wire/android/framework/TestConversation.kt | 1 - .../ui/home/conversations/search/SearchUserViewModelTest.kt | 1 - kalium | 2 +- 5 files changed, 3 insertions(+), 5 deletions(-) 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..e343da188e1 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 @@ -228,7 +228,7 @@ private fun MlsDetailsView(mlsProtocolInfo: Conversation.ProtocolInfo.MLS) { ) SettingsItem( title = "Epoch", - text = mlsProtocolInfo.epoch.toString(), + text = "1", ) } 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 1e5e58c539b..2e654db2129 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 @@ -426,7 +426,7 @@ private val StateAdmin = StateMember.copy( private val ProtocolInfoMLS = Conversation.ProtocolInfo.MLS( groupId = GroupID("groupId"), groupState = Conversation.ProtocolInfo.MLSCapable.GroupState.ESTABLISHED, - epoch = ULong.MIN_VALUE, +// 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 09d4dc261bb..bde9fef6172 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 @@ -442,7 +442,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 59f008442a6..a4a39ae804d 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit 59f008442a67f9026fd66e410da35835819874d8 +Subproject commit a4a39ae804de19bb7bec04793bb51a83e518ea5c From 1b55d8407813a1d3f75d982563996ac0f8ae0dd4 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Mon, 13 Oct 2025 17:38:01 +0200 Subject: [PATCH 2/8] refactor: extract the epoch from the group context --- kalium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kalium b/kalium index a4a39ae804d..b858e4e311d 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit a4a39ae804de19bb7bec04793bb51a83e518ea5c +Subproject commit b858e4e311d6b2498df26f3621c6fd31ba112263 From 335cde2ab56151e9b939c092efd58ba7d0831ff3 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Tue, 14 Oct 2025 12:19:53 +0200 Subject: [PATCH 3/8] refactor: remove epoch references from local database and related tests --- kalium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kalium b/kalium index b858e4e311d..c4cbd2c0440 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit b858e4e311d6b2498df26f3621c6fd31ba112263 +Subproject commit c4cbd2c0440a79deddf39a15eb61b1fecb23d1be From f7b4fd702fd2d1a54ea8665b94256235561cad40 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Tue, 14 Oct 2025 12:25:32 +0200 Subject: [PATCH 4/8] refactor: pass epoch to MlsDetailsView and update related components --- .../ui/debug/conversation/DebugConversationScreen.kt | 6 +++--- .../ui/debug/conversation/DebugConversationViewModel.kt | 3 +++ .../details/options/GroupConversationOptions.kt | 1 - 3 files changed, 6 insertions(+), 4 deletions(-) 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 e343da188e1..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 = "1", + 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..8a6420d9a9c 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 @@ -67,6 +67,8 @@ class DebugConversationViewModel @Inject constructor( ) } } + + // TODO: call the usecase for the epoch } } @@ -99,4 +101,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 2e654db2129..2d376eacbad 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 @@ -426,7 +426,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 ) From 6f97fb44659efbef4a5cfb6e77ee67abb1008e91 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Tue, 14 Oct 2025 14:11:45 +0200 Subject: [PATCH 5/8] detekt --- kalium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kalium b/kalium index c4cbd2c0440..9b61b1180b6 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit c4cbd2c0440a79deddf39a15eb61b1fecb23d1be +Subproject commit 9b61b1180b63022049b3e5311f0bf1162a79dc9d From 8dafc6765d8cbce6e553cc19f5353c0b9d906b45 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Tue, 14 Oct 2025 15:56:18 +0200 Subject: [PATCH 6/8] pr comments --- kalium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kalium b/kalium index 9b61b1180b6..4ed56e848ac 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit 9b61b1180b63022049b3e5311f0bf1162a79dc9d +Subproject commit 4ed56e848ace186f26dc91e134b76a4a2919d200 From db7761417c60ab48a3f58d4fcb684e629a3f91a5 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Wed, 15 Oct 2025 10:44:15 +0200 Subject: [PATCH 7/8] refactor: remove epoch references from Conversation models and mapper --- kalium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kalium b/kalium index 4ed56e848ac..183de084b4a 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit 4ed56e848ace186f26dc91e134b76a4a2919d200 +Subproject commit 183de084b4a56f2bdb5c86a6a665d1ddf1e8f97e From 0bd45ec4c25be42f580a4e53ce7f036c2ed349ea Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Wed, 15 Oct 2025 17:27:55 +0200 Subject: [PATCH 8/8] refactor: implement GetConversationEpochUseCase and its tests --- .../com/wire/android/di/CoreLogicModule.kt | 8 ++++++++ .../conversation/DebugConversationViewModel.kt | 17 +++++++++++++++-- kalium | 2 +- 3 files changed, 24 insertions(+), 3 deletions(-) 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/DebugConversationViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/debug/conversation/DebugConversationViewModel.kt index 8a6420d9a9c..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,9 +68,20 @@ class DebugConversationViewModel @Inject constructor( mlsProtocolInfo = result.conversationDetails.conversation.protocol as? Conversation.ProtocolInfo.MLS, ) } - } - // TODO: call the usecase for the epoch + // 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}") + } + } + } + } } } diff --git a/kalium b/kalium index 183de084b4a..82e4d24a769 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit 183de084b4a56f2bdb5c86a6a665d1ddf1e8f97e +Subproject commit 82e4d24a76905631ee4ba6a106ee9f5291f8dc66