@@ -18,7 +18,6 @@ package im.vector.app.features.settings.devices.v2
18
18
19
19
import android.content.SharedPreferences
20
20
import com.airbnb.mvrx.MavericksViewModelFactory
21
- import com.airbnb.mvrx.Success
22
21
import dagger.assisted.Assisted
23
22
import dagger.assisted.AssistedFactory
24
23
import dagger.assisted.AssistedInject
@@ -32,10 +31,10 @@ import im.vector.app.features.settings.devices.v2.signout.SignoutSessionsReAuthN
32
31
import im.vector.app.features.settings.devices.v2.signout.SignoutSessionsUseCase
33
32
import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSessionCanBeVerifiedUseCase
34
33
import im.vector.app.features.settings.devices.v2.verification.GetCurrentSessionCrossSigningInfoUseCase
34
+ import kotlinx.coroutines.flow.combine
35
35
import kotlinx.coroutines.flow.launchIn
36
36
import kotlinx.coroutines.flow.onEach
37
37
import kotlinx.coroutines.launch
38
- import org.matrix.android.sdk.api.extensions.orFalse
39
38
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
40
39
import timber.log.Timber
41
40
@@ -103,27 +102,27 @@ class DevicesViewModel @AssistedInject constructor(
103
102
}
104
103
105
104
private fun observeDevices () {
106
- getDeviceFullInfoListUseCase.execute(
105
+ val allSessionsFlow = getDeviceFullInfoListUseCase.execute(
107
106
filterType = DeviceManagerFilterType .ALL_SESSIONS ,
108
- excludeCurrentDevice = false
107
+ excludeCurrentDevice = false ,
109
108
)
110
- .execute { async ->
111
- if (async is Success ) {
112
- val deviceFullInfoList = async.invoke()
113
- val unverifiedSessionsCount = deviceFullInfoList.count { ! it.cryptoDeviceInfo?.trustLevel?.isCrossSigningVerified().orFalse() }
114
- val inactiveSessionsCount = deviceFullInfoList.count { it.isInactive }
115
-
116
- copy(
117
- devices = async,
118
- unverifiedSessionsCount = unverifiedSessionsCount,
119
- inactiveSessionsCount = inactiveSessionsCount,
120
- )
121
- } else {
122
- copy(
123
- devices = async
124
- )
125
- }
126
- }
109
+ val unverifiedSessionsFlow = getDeviceFullInfoListUseCase .execute(
110
+ filterType = DeviceManagerFilterType . UNVERIFIED ,
111
+ excludeCurrentDevice = true ,
112
+ )
113
+ val inactiveSessionsFlow = getDeviceFullInfoListUseCase.execute(
114
+ filterType = DeviceManagerFilterType . INACTIVE ,
115
+ excludeCurrentDevice = true ,
116
+ )
117
+
118
+ combine(allSessionsFlow, unverifiedSessionsFlow, inactiveSessionsFlow) { allSessions, unverifiedSessions, inactiveSessions ->
119
+ DeviceFullInfoList (
120
+ allSessions = allSessions,
121
+ unverifiedSessionsCount = unverifiedSessions.size,
122
+ inactiveSessionsCount = inactiveSessions.size,
123
+ )
124
+ }
125
+ .execute { async -> copy(devices = async) }
127
126
}
128
127
129
128
private fun refreshDevicesOnCryptoDevicesChange () {
@@ -185,6 +184,7 @@ class DevicesViewModel @AssistedInject constructor(
185
184
private fun getDeviceIdsOfOtherSessions (state : DevicesViewState ): List <String > {
186
185
val currentDeviceId = state.currentSessionCrossSigningInfo.deviceId
187
186
return state.devices()
187
+ ?.allSessions
188
188
?.mapNotNull { fullInfo -> fullInfo.deviceInfo.deviceId.takeUnless { it == currentDeviceId } }
189
189
.orEmpty()
190
190
}
0 commit comments