diff --git a/auth/src/main/java/org/futo/circles/auth/feature/active_sessions/verify/VerifySessionViewModel.kt b/auth/src/main/java/org/futo/circles/auth/feature/active_sessions/verify/VerifySessionViewModel.kt index ff3a6a62b0f12803ff836a998ddef6cebfd15b9d..69f741c91acbea0856dd637b6062174f60b40f51 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/active_sessions/verify/VerifySessionViewModel.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/active_sessions/verify/VerifySessionViewModel.kt @@ -5,10 +5,11 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.cancellable +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import org.futo.circles.auth.model.QrCanceled import org.futo.circles.auth.model.QrLoading import org.futo.circles.auth.model.QrReady import org.futo.circles.auth.model.QrState @@ -16,6 +17,7 @@ import org.futo.circles.auth.model.QrSuccess import org.futo.circles.core.extensions.getOrThrow import org.futo.circles.core.extensions.launchBg import org.futo.circles.core.provider.MatrixSessionProvider +import org.matrix.android.sdk.api.session.crypto.verification.EVerificationState import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificationRequest import org.matrix.android.sdk.api.session.crypto.verification.QRCodeVerificationState import org.matrix.android.sdk.api.session.crypto.verification.QrCodeVerificationTransaction @@ -42,31 +44,37 @@ class VerifySessionViewModel @Inject constructor( private var qrTransactionId: String = "" init { + observeVerificationState() + initVerification() + } + + private fun observeVerificationState() { session.cryptoService().verificationService().requestEventFlow() .cancellable() .onEach { when (it) { is VerificationEvent.RequestAdded -> confirmIncomingRequest(it.request) + is VerificationEvent.RequestUpdated -> { - qrTransactionId = it.transactionId - it.request.qrCodeText?.let { qrStateLiveData.postValue(QrReady(it)) } + if (it.request.state == EVerificationState.Done) { + qrStateLiveData.postValue(QrSuccess) + } else { + qrTransactionId = it.transactionId + it.request.qrCodeText?.let { qrStateLiveData.postValue(QrReady(it)) } + } } + is VerificationEvent.TransactionAdded -> transactionUpdated(it.transaction) is VerificationEvent.TransactionUpdated -> transactionUpdated(it.transaction) } - }.launchIn(viewModelScope) - - initVerification() + }.flowOn(Dispatchers.IO).launchIn(viewModelScope) } private fun transactionUpdated(tx: VerificationTransaction) { val transaction = (tx as? QrCodeVerificationTransaction) ?: return - when (transaction.state()) { - QRCodeVerificationState.Done -> qrStateLiveData.postValue(QrSuccess) - QRCodeVerificationState.Cancelled -> qrStateLiveData.postValue(QrCanceled) - else -> launchBg { transaction.otherUserScannedMyQrCode() } - } + if (transaction.state() == QRCodeVerificationState.WaitingForScanConfirmation) + launchBg { transaction.otherUserScannedMyQrCode() } } fun onQrScanned(data: String) {