Skip to content

Commit 72d393f

Browse files
fix: missing non-mls conversation when app supports MLS but backend doesn't (#2579) (#2582)
* fix: missing non mls conversation when app supports MLS but backend does not * detekt * address PR comments * fix Co-authored-by: Mohamad Jaara <[email protected]>
1 parent 7f9859e commit 72d393f

File tree

5 files changed

+224
-127
lines changed

5 files changed

+224
-127
lines changed

logic/src/commonMain/kotlin/com/wire/kalium/logic/data/client/ClientModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,4 @@ data class UpdateClientCapabilitiesParam(
105105
* the `INACTIVE_DURATION`.
106106
*/
107107
val Client.isActive: Boolean
108-
get() = lastActive?.let { (Clock.System.now() - it) < Client.INACTIVE_DURATION } ?: false
108+
get() = (lastActive ?: registrationTime)?.let { (Clock.System.now() - it) < Client.INACTIVE_DURATION } ?: false

logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,9 @@ class UserSessionScope internal constructor(
10111011
clientRepository,
10121012
userRepository,
10131013
userConfigRepository,
1014-
featureSupport
1014+
featureSupport,
1015+
clientIdProvider,
1016+
userScopedLogger
10151017
)
10161018

10171019
private val updateSupportedProtocolsAndResolveOneOnOnes: UpdateSupportedProtocolsAndResolveOneOnOnesUseCase

logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/user/UpdateSelfUserSupportedProtocolsUseCase.kt

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@
1717
*/
1818
package com.wire.kalium.logic.feature.user
1919

20+
import com.wire.kalium.logger.KaliumLogger
2021
import com.wire.kalium.logic.CoreFailure
2122
import com.wire.kalium.logic.StorageFailure
2223
import com.wire.kalium.logic.configuration.UserConfigRepository
2324
import com.wire.kalium.logic.data.client.Client
2425
import com.wire.kalium.logic.data.client.ClientRepository
2526
import com.wire.kalium.logic.data.client.isActive
27+
import com.wire.kalium.logic.data.conversation.ClientId
2628
import com.wire.kalium.logic.data.featureConfig.MLSMigrationModel
2729
import com.wire.kalium.logic.data.featureConfig.Status
30+
import com.wire.kalium.logic.data.id.CurrentClientIdProvider
2831
import com.wire.kalium.logic.data.user.SupportedProtocol
2932
import com.wire.kalium.logic.data.user.UserRepository
3033
import com.wire.kalium.logic.feature.mlsmigration.hasMigrationEnded
@@ -33,7 +36,6 @@ import com.wire.kalium.logic.functional.Either
3336
import com.wire.kalium.logic.functional.flatMap
3437
import com.wire.kalium.logic.functional.flatMapLeft
3538
import com.wire.kalium.logic.functional.map
36-
import com.wire.kalium.logic.kaliumLogger
3739
import kotlinx.datetime.Instant
3840

3941
/**
@@ -47,17 +49,19 @@ internal class UpdateSelfUserSupportedProtocolsUseCaseImpl(
4749
private val clientsRepository: ClientRepository,
4850
private val userRepository: UserRepository,
4951
private val userConfigRepository: UserConfigRepository,
50-
private val featureSupport: FeatureSupport
52+
private val featureSupport: FeatureSupport,
53+
private val currentClientIdProvider: CurrentClientIdProvider,
54+
private val logger: KaliumLogger
5155
) : UpdateSelfUserSupportedProtocolsUseCase {
5256

5357
override suspend operator fun invoke(): Either<CoreFailure, Boolean> {
5458
return if (!featureSupport.isMLSSupported) {
55-
kaliumLogger.d("Skip updating supported protocols, since MLS is not supported.")
59+
logger.d("Skip updating supported protocols, since MLS is not supported.")
5660
Either.Right(false)
5761
} else {
5862
(userRepository.getSelfUser()?.let { selfUser ->
5963
selfSupportedProtocols().flatMap { newSupportedProtocols ->
60-
kaliumLogger.i(
64+
logger.i(
6165
"Updating supported protocols = $newSupportedProtocols previously = ${selfUser.supportedProtocols}"
6266
)
6367
if (newSupportedProtocols != selfUser.supportedProtocols) {
@@ -68,11 +72,12 @@ internal class UpdateSelfUserSupportedProtocolsUseCaseImpl(
6872
}.flatMapLeft {
6973
when (it) {
7074
is StorageFailure.DataNotFound -> {
71-
kaliumLogger.w(
75+
logger.w(
7276
"Skip updating supported protocols since additional protocols are not configured"
7377
)
7478
Either.Right(false)
7579
}
80+
7681
else -> Either.Left(it)
7782
}
7883
}
@@ -81,33 +86,48 @@ internal class UpdateSelfUserSupportedProtocolsUseCaseImpl(
8186
}
8287

8388
private suspend fun selfSupportedProtocols(): Either<CoreFailure, Set<SupportedProtocol>> =
84-
clientsRepository.selfListOfClients().flatMap { selfClients ->
85-
userConfigRepository.getMigrationConfiguration()
86-
.flatMapLeft { if (it is StorageFailure.DataNotFound) Either.Right(MIGRATION_CONFIGURATION_DISABLED) else Either.Left(it) }
87-
.flatMap { migrationConfiguration ->
88-
userConfigRepository.getSupportedProtocols().map { supportedProtocols ->
89-
val selfSupportedProtocols = mutableSetOf<SupportedProtocol>()
90-
if (proteusIsSupported(supportedProtocols, migrationConfiguration)) {
91-
selfSupportedProtocols.add(SupportedProtocol.PROTEUS)
89+
currentClientIdProvider().flatMap { currentClientId ->
90+
clientsRepository.selfListOfClients().flatMap { selfClients ->
91+
userConfigRepository.getMigrationConfiguration()
92+
.flatMapLeft {
93+
if (it is StorageFailure.DataNotFound) {
94+
Either.Right(MIGRATION_CONFIGURATION_DISABLED)
95+
} else {
96+
Either.Left(it)
9297
}
98+
}
99+
.flatMap { migrationConfiguration ->
100+
userConfigRepository.getSupportedProtocols().map { supportedProtocols ->
101+
val selfSupportedProtocols = mutableSetOf<SupportedProtocol>()
102+
if (proteusIsSupported(supportedProtocols, migrationConfiguration)) {
103+
selfSupportedProtocols.add(SupportedProtocol.PROTEUS)
104+
}
93105

94-
if (mlsIsSupported(supportedProtocols, migrationConfiguration, selfClients)) {
95-
selfSupportedProtocols.add(SupportedProtocol.MLS)
106+
if (mlsIsSupported(supportedProtocols, migrationConfiguration, selfClients, currentClientId)) {
107+
selfSupportedProtocols.add(SupportedProtocol.MLS)
108+
}
109+
selfSupportedProtocols
96110
}
97-
selfSupportedProtocols
98111
}
99-
}
112+
}
100113
}
101114

102115
private fun mlsIsSupported(
103116
supportedProtocols: Set<SupportedProtocol>,
104117
migrationConfiguration: MLSMigrationModel,
105-
selfClients: List<Client>
118+
selfClients: List<Client>,
119+
selfClientId: ClientId
106120
): Boolean {
107121
val mlsIsSupported = supportedProtocols.contains(SupportedProtocol.MLS)
108122
val mlsMigrationHasEnded = migrationConfiguration.hasMigrationEnded()
109-
val allSelfClientsAreMLSCapable = selfClients.filter { it.isActive }.all { it.isMLSCapable }
110-
kaliumLogger.d(
123+
val allSelfClientsAreMLSCapable = selfClients
124+
.filter { it.isActive || it.id == selfClientId }
125+
.ifEmpty {
126+
logger.w("user has 0 active clients")
127+
emptyList()
128+
}.all { it.isMLSCapable }
129+
130+
logger.d(
111131
"mls is supported = $mlsIsSupported, " +
112132
"all active self clients are mls capable = $allSelfClientsAreMLSCapable " +
113133
"migration has ended = $mlsMigrationHasEnded"
@@ -121,7 +141,7 @@ internal class UpdateSelfUserSupportedProtocolsUseCaseImpl(
121141
): Boolean {
122142
val proteusIsSupported = supportedProtocols.contains(SupportedProtocol.PROTEUS)
123143
val mlsMigrationHasEnded = migrationConfiguration.hasMigrationEnded()
124-
kaliumLogger.d(
144+
logger.d(
125145
"proteus is supported = $proteusIsSupported, " +
126146
"migration has ended = $mlsMigrationHasEnded"
127147
)

logic/src/commonTest/kotlin/com/wire/kalium/logic/data/client/ClientTest.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,31 @@ class ClientTest {
5050
assertTrue(client.isActive)
5151
}
5252

53+
@Test
54+
fun givenLastActiveIsNull_whenRegistrationTRimeIsNotOld_thenIsActiveIsTrue() {
55+
val client = TestClient.CLIENT.copy(
56+
lastActive = null,
57+
registrationTime = Clock.System.now() - (Client.INACTIVE_DURATION - 1.days)
58+
)
59+
assertTrue(client.isActive)
60+
}
61+
62+
@Test
63+
fun givenLastActiveIsNull_whenRegistrationTRimeIsOld_thenIsActiveIsFalse() {
64+
val client = TestClient.CLIENT.copy(
65+
lastActive = null,
66+
registrationTime = Clock.System.now() - (Client.INACTIVE_DURATION + 1.days)
67+
)
68+
assertFalse(client.isActive)
69+
}
70+
71+
@Test
72+
fun givenLastActiveIsNull_whenRegistrationTRimeIsNull_thenIsActiveIsFalse() {
73+
val client = TestClient.CLIENT.copy(
74+
lastActive = null,
75+
registrationTime = null
76+
)
77+
assertFalse(client.isActive)
78+
}
79+
5380
}

0 commit comments

Comments
 (0)