From 8dde688e12d673bf8f8df8e6b673c37e9dae9acf Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Thu, 2 Nov 2023 19:44:34 +0200
Subject: [PATCH] Change qr logic

---
 .../verify/VerifySessionDialogFragment.kt     |  6 ++--
 .../verify/VerifySessionViewModel.kt          | 33 ++++++++-----------
 .../org/futo/circles/auth/model/QrState.kt    |  6 ++--
 auth/src/main/res/values/strings.xml          |  2 +-
 4 files changed, 20 insertions(+), 27 deletions(-)

diff --git a/auth/src/main/java/org/futo/circles/auth/feature/active_sessions/verify/VerifySessionDialogFragment.kt b/auth/src/main/java/org/futo/circles/auth/feature/active_sessions/verify/VerifySessionDialogFragment.kt
index 50e0b5ff9..57502b486 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/active_sessions/verify/VerifySessionDialogFragment.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/active_sessions/verify/VerifySessionDialogFragment.kt
@@ -65,7 +65,7 @@ class VerifySessionDialogFragment :
                     view?.postDelayed({ onBackPressed() }, CLOSE_DELAY)
                 }
 
-                is QrLoading -> handelQrLoading(qrState.deviceId)
+                is QrLoading -> handelQrLoading()
                 is QrReady -> handelQrReady(qrState.qrText)
                 is QrSuccess -> {
                     showSuccess(getString(R.string.session_verified))
@@ -85,12 +85,12 @@ class VerifySessionDialogFragment :
         }
     }
 
-    private fun handelQrLoading(deviceId: String) {
+    private fun handelQrLoading() {
         with(binding) {
             vLoading.visible()
             ivQr.visibility = View.INVISIBLE
             btnVerify.isEnabled = false
-            tvMessage.text = getString(R.string.waiting_for_verification_format, deviceId)
+            tvMessage.text = getString(R.string.waiting_for_other_device_verification)
         }
     }
 
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 cdf4768c2..ff3a6a62b 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
@@ -38,9 +38,8 @@ class VerifySessionViewModel @Inject constructor(
         VerificationMethod.QR_CODE_SCAN
     )
 
-    val qrStateLiveData: MutableLiveData<QrState> = MutableLiveData(QrLoading(deviceId))
-
-    private var qrTransaction: QrCodeVerificationTransaction? = null
+    val qrStateLiveData: MutableLiveData<QrState> = MutableLiveData(QrLoading)
+    private var qrTransactionId: String = ""
 
     init {
         session.cryptoService().verificationService().requestEventFlow()
@@ -48,8 +47,10 @@ class VerifySessionViewModel @Inject constructor(
             .onEach {
                 when (it) {
                     is VerificationEvent.RequestAdded -> confirmIncomingRequest(it.request)
-                    is VerificationEvent.RequestUpdated -> confirmIncomingRequest(it.request)
-
+                    is VerificationEvent.RequestUpdated -> {
+                        qrTransactionId = it.transactionId
+                        it.request.qrCodeText?.let { qrStateLiveData.postValue(QrReady(it)) }
+                    }
                     is VerificationEvent.TransactionAdded -> transactionUpdated(it.transaction)
                     is VerificationEvent.TransactionUpdated -> transactionUpdated(it.transaction)
                 }
@@ -62,35 +63,29 @@ class VerifySessionViewModel @Inject constructor(
     private fun transactionUpdated(tx: VerificationTransaction) {
         val transaction = (tx as? QrCodeVerificationTransaction) ?: return
         when (transaction.state()) {
-            QRCodeVerificationState.Reciprocated -> launchBg { qrTransaction?.otherUserScannedMyQrCode() }
             QRCodeVerificationState.Done -> qrStateLiveData.postValue(QrSuccess)
             QRCodeVerificationState.Cancelled -> qrStateLiveData.postValue(QrCanceled)
-            else -> {
-                qrTransaction = transaction
-                qrTransaction?.qrCodeText?.let { qrStateLiveData.postValue(QrReady(it)) }
-            }
+            else -> launchBg { transaction.otherUserScannedMyQrCode() }
         }
     }
 
-    override fun onCleared() {
-        qrTransaction = null
-        super.onCleared()
-    }
-
     fun onQrScanned(data: String) {
         launchBg {
             session.cryptoService().verificationService().reciprocateQRVerification(
-                qrTransaction?.otherUserId ?: "",
-                qrTransaction?.transactionId ?: "",
-                data
+                session.myUserId, qrTransactionId, data
             )
         }
     }
 
     private fun initVerification() {
         launchBg {
-            if (session.cryptoService().crossSigningService().isCrossSigningVerified())
+            if (session.cryptoService().crossSigningService().isCrossSigningVerified()) {
                 requestKeyVerification()
+            } else {
+                val request = session.cryptoService().verificationService()
+                    .getExistingVerificationRequests(session.myUserId).lastOrNull { it.isIncoming }
+                request?.let { confirmIncomingRequest(it) }
+            }
         }
     }
 
diff --git a/auth/src/main/java/org/futo/circles/auth/model/QrState.kt b/auth/src/main/java/org/futo/circles/auth/model/QrState.kt
index 10914fa7b..882e78756 100644
--- a/auth/src/main/java/org/futo/circles/auth/model/QrState.kt
+++ b/auth/src/main/java/org/futo/circles/auth/model/QrState.kt
@@ -2,11 +2,9 @@ package org.futo.circles.auth.model
 
 sealed class QrState
 
-data class QrLoading(val deviceId: String) : QrState()
+data object QrLoading : QrState()
 
-data class QrReady(
-    val qrText: String
-) : QrState()
+data class QrReady(val qrText: String) : QrState()
 
 data object QrSuccess : QrState()
 
diff --git a/auth/src/main/res/values/strings.xml b/auth/src/main/res/values/strings.xml
index 26b6a9577..70e3c137c 100644
--- a/auth/src/main/res/values/strings.xml
+++ b/auth/src/main/res/values/strings.xml
@@ -111,7 +111,7 @@
     <string name="invalid_auth">Invalid auth</string>
     <string name="scan_with_one_of_devices_message">Scan QR code with one of your devices to finish verification</string>
     <string name="cross_signed">cross signed</string>
-    <string name="waiting_for_verification_format">Waiting for %s to start verification</string>
+    <string name="waiting_for_other_device_verification">Waiting for other device to start verification</string>
     <string name="session_verified">Session verified</string>
     <string name="verification_canceled">Verification canceled</string>
     <string name="active_login_sessions">Active login sessions</string>
-- 
GitLab