@@ -25,25 +25,25 @@ import com.airbnb.mvrx.Success
25
25
import com.airbnb.mvrx.Uninitialized
26
26
import com.airbnb.mvrx.ViewModelContext
27
27
import dagger.assisted.Assisted
28
- import dagger.assisted.AssistedInject
29
28
import dagger.assisted.AssistedFactory
29
+ import dagger.assisted.AssistedInject
30
30
import im.vector.app.core.platform.EmptyViewEvents
31
31
import im.vector.app.core.platform.VectorViewModel
32
32
import im.vector.app.core.platform.VectorViewModelAction
33
33
import im.vector.app.features.settings.VectorPreferences
34
- import io.reactivex.Observable
34
+ import kotlinx.coroutines.flow.combine
35
+ import kotlinx.coroutines.flow.distinctUntilChanged
36
+ import kotlinx.coroutines.flow.launchIn
37
+ import kotlinx.coroutines.flow.onEach
38
+ import kotlinx.coroutines.flow.sample
35
39
import org.matrix.android.sdk.api.NoOpMatrixCallback
36
40
import org.matrix.android.sdk.api.extensions.orFalse
37
41
import org.matrix.android.sdk.api.session.Session
38
42
import org.matrix.android.sdk.api.util.MatrixItem
39
- import org.matrix.android.sdk.api.util.Optional
40
43
import org.matrix.android.sdk.api.util.toMatrixItem
41
- import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo
44
+ import org.matrix.android.sdk.flow.flow
42
45
import org.matrix.android.sdk.internal.crypto.model.rest.DeviceInfo
43
- import org.matrix.android.sdk.internal.crypto.store.PrivateKeysInfo
44
- import org.matrix.android.sdk.rx.rx
45
46
import timber.log.Timber
46
- import java.util.concurrent.TimeUnit
47
47
48
48
data class UnknownDevicesState (
49
49
val myMatrixItem : MatrixItem .UserItem ? = null ,
@@ -98,31 +98,31 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(@Assisted
98
98
}
99
99
)
100
100
101
- Observable .combineLatest<List <CryptoDeviceInfo >, List <DeviceInfo >, Optional <PrivateKeysInfo >, List <DeviceDetectionInfo >>(
102
- session.rx().liveUserCryptoDevices(session.myUserId),
103
- session.rx().liveMyDevicesInfo(),
104
- session.rx().liveCrossSigningPrivateKeys(),
105
- { cryptoList, infoList, pInfo ->
106
- // Timber.v("## Detector trigger ${cryptoList.map { "${it.deviceId} ${it.trustLevel}" }}")
107
- // Timber.v("## Detector trigger canCrossSign ${pInfo.get().selfSigned != null}")
108
- infoList
109
- .filter { info ->
110
- // filter verified session, by checking the crypto device info
111
- cryptoList.firstOrNull { info.deviceId == it.deviceId }?.isVerified?.not ().orFalse()
112
- }
113
- // filter out ignored devices
114
- .filter { ! ignoredDeviceList.contains(it.deviceId) }
115
- .sortedByDescending { it.lastSeenTs }
116
- .map { deviceInfo ->
117
- val deviceKnownSince = cryptoList.firstOrNull { it.deviceId == deviceInfo.deviceId }?.firstTimeSeenLocalTs ? : 0
118
- DeviceDetectionInfo (
119
- deviceInfo,
120
- deviceKnownSince > currentSessionTs + 60_000 , // short window to avoid false positive,
121
- pInfo.getOrNull()?.selfSigned != null // adding this to pass distinct when cross sign change
122
- )
123
- }
124
- }
101
+ combine(
102
+ session.flow().liveUserCryptoDevices(session.myUserId),
103
+ session.flow().liveMyDevicesInfo(),
104
+ session.flow().liveCrossSigningPrivateKeys()
125
105
)
106
+ { cryptoList, infoList, pInfo ->
107
+ // Timber.v("## Detector trigger ${cryptoList.map { "${it.deviceId} ${it.trustLevel}" }}")
108
+ // Timber.v("## Detector trigger canCrossSign ${pInfo.get().selfSigned != null}")
109
+ infoList
110
+ .filter { info ->
111
+ // filter verified session, by checking the crypto device info
112
+ cryptoList.firstOrNull { info.deviceId == it.deviceId }?.isVerified?.not ().orFalse()
113
+ }
114
+ // filter out ignored devices
115
+ .filter { ! ignoredDeviceList.contains(it.deviceId) }
116
+ .sortedByDescending { it.lastSeenTs }
117
+ .map { deviceInfo ->
118
+ val deviceKnownSince = cryptoList.firstOrNull { it.deviceId == deviceInfo.deviceId }?.firstTimeSeenLocalTs ? : 0
119
+ DeviceDetectionInfo (
120
+ deviceInfo,
121
+ deviceKnownSince > currentSessionTs + 60_000 , // short window to avoid false positive,
122
+ pInfo.getOrNull()?.selfSigned != null // adding this to pass distinct when cross sign change
123
+ )
124
+ }
125
+ }
126
126
.distinctUntilChanged()
127
127
.execute { async ->
128
128
// Timber.v("## Detector trigger passed distinct")
@@ -132,14 +132,14 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(@Assisted
132
132
)
133
133
}
134
134
135
- session.rx ().liveUserCryptoDevices(session.myUserId)
135
+ session.flow ().liveUserCryptoDevices(session.myUserId)
136
136
.distinctUntilChanged()
137
- .throttleLast (5_000 , TimeUnit . MILLISECONDS )
138
- .subscribe {
137
+ .sample (5_000 )
138
+ .onEach {
139
139
// If we have a new crypto device change, we might want to trigger refresh of device info
140
140
session.cryptoService().fetchDevicesList(NoOpMatrixCallback ())
141
141
}
142
- .disposeOnClear( )
142
+ .launchIn(viewModelScope )
143
143
144
144
// trigger a refresh of lastSeen / last Ip
145
145
session.cryptoService().fetchDevicesList(NoOpMatrixCallback ())
0 commit comments