diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index ae7d57306..40986383a 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -796,6 +796,7 @@ // MARK: - Device Verification "device_verification_title" = "Verify device"; "device_verification_security_advice" = "For maximum security, we recommend you do this in person or use another trusted means of communication"; +"device_verification_cancelled" = "The other party cancelled the verification."; // MARK: - Start "device_verification_start_title" = "Verify by comparing a short text string"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 2fb0a33b3..2bcd8b52a 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -426,6 +426,10 @@ internal enum VectorL10n { internal static var decline: String { return VectorL10n.tr("Vector", "decline") } + /// The other party cancelled the verification. + internal static var deviceVerificationCancelled: String { + return VectorL10n.tr("Vector", "device_verification_cancelled") + } /// For maximum security, we recommend you do this in person or use another trusted means of communication internal static var deviceVerificationSecurityAdvice: String { return VectorL10n.tr("Vector", "device_verification_security_advice") diff --git a/Riot/Modules/DeviceVerification/DeviceVerificationCoordinator.swift b/Riot/Modules/DeviceVerification/DeviceVerificationCoordinator.swift index cc31618b7..1b1d9933b 100644 --- a/Riot/Modules/DeviceVerification/DeviceVerificationCoordinator.swift +++ b/Riot/Modules/DeviceVerification/DeviceVerificationCoordinator.swift @@ -84,11 +84,11 @@ final class DeviceVerificationCoordinator: DeviceVerificationCoordinatorType { return // TODO } - //let rootCoordinator = sself.createDeviceVerificationStartCoordinator(otherUser: otherUser, otherDevice: otherDevice) + let rootCoordinator = sself.createDeviceVerificationStartCoordinator(otherUser: otherUser, otherDevice: otherDevice) // TODO: To remove. Only for dev - let rootCoordinator = DeviceVerificationVerifyCoordinator(session: sself.session) - rootCoordinator.delegate = self + //let rootCoordinator = DeviceVerificationVerifyCoordinator(session: sself.session) + //rootCoordinator.delegate = self rootCoordinator.start() diff --git a/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewController.swift b/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewController.swift index 0078b56ce..33254a10a 100644 --- a/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewController.swift +++ b/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewController.swift @@ -157,7 +157,9 @@ final class DeviceVerificationStartViewController: UIViewController { case .loading: self.renderLoading() case .loaded: - self.renderLoaded() + self.renderStarted() + case .cancelled(let reason): + self.renderCancelled(reason: reason) case .error(let error): self.render(error: error) } @@ -167,13 +169,21 @@ final class DeviceVerificationStartViewController: UIViewController { self.activityPresenter.presentActivityIndicator(on: self.view, animated: true) } - private func renderLoaded() { + private func renderStarted() { self.activityPresenter.removeCurrentActivityIndicator(animated: true) self.verifyButtonBackgroundView.isHidden = true self.waitingPartnerLabel.isHidden = false self.useLegacyVerificationLabel.isHidden = false } + + private func renderCancelled(reason: MXTransactionCancelCode) { + self.activityPresenter.removeCurrentActivityIndicator(animated: true) + + self.errorPresenter.presentError(from: self, title: "", message: VectorL10n.deviceVerificationCancelled, animated: true) { + self.viewModel.process(viewAction: .cancel) + } + } private func render(error: Error) { self.activityPresenter.removeCurrentActivityIndicator(animated: true) diff --git a/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewModel.swift b/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewModel.swift index 261902fb9..893881d21 100644 --- a/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewModel.swift +++ b/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewModel.swift @@ -114,7 +114,10 @@ final class DeviceVerificationStartViewModel: DeviceVerificationStartViewModelTy case MXSASTransactionStateShowSAS: self.coordinatorDelegate?.deviceVerificationStartViewModel(self, didCompleteWithOutgoingTransaction: transaction) case MXSASTransactionStateCancelled: - self.coordinatorDelegate?.deviceVerificationStartViewModel(self, didTransactionCancelled: transaction) + guard let reason = transaction.reasonCancelCode else { + return + } + self.update(viewState: .cancelled(reason)) default: break } diff --git a/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewState.swift b/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewState.swift index 5536d4bf9..5a8df99d6 100644 --- a/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewState.swift +++ b/Riot/Modules/DeviceVerification/Start/DeviceVerificationStartViewState.swift @@ -21,6 +21,7 @@ import Foundation /// DeviceVerificationStartViewController view state enum DeviceVerificationStartViewState { case loading - case loaded + case loaded // started + case cancelled(MXTransactionCancelCode) case error(Error) } diff --git a/Riot/Modules/DeviceVerification/Verify/DeviceVerificationVerifyViewController.swift b/Riot/Modules/DeviceVerification/Verify/DeviceVerificationVerifyViewController.swift index 1d976faca..799d25cd2 100644 --- a/Riot/Modules/DeviceVerification/Verify/DeviceVerificationVerifyViewController.swift +++ b/Riot/Modules/DeviceVerification/Verify/DeviceVerificationVerifyViewController.swift @@ -175,7 +175,11 @@ final class DeviceVerificationVerifyViewController: UIViewController { } private func renderCancelled(reason: MXTransactionCancelCode) { - // TODO + self.activityPresenter.removeCurrentActivityIndicator(animated: true) + + self.errorPresenter.presentError(from: self, title: "", message: VectorL10n.deviceVerificationCancelled, animated: true) { + self.viewModel.process(viewAction: .cancel) + } } private func renderCancelledByMe(reason: MXTransactionCancelCode) { diff --git a/Riot/Modules/DeviceVerification/Verify/DeviceVerificationVerifyViewModel.swift b/Riot/Modules/DeviceVerification/Verify/DeviceVerificationVerifyViewModel.swift index a52b5301e..cb48c584d 100644 --- a/Riot/Modules/DeviceVerification/Verify/DeviceVerificationVerifyViewModel.swift +++ b/Riot/Modules/DeviceVerification/Verify/DeviceVerificationVerifyViewModel.swift @@ -66,21 +66,26 @@ final class DeviceVerificationVerifyViewModel: DeviceVerificationVerifyViewModel func process(viewAction: DeviceVerificationVerifyViewAction) { switch viewAction { case .confirm: - self.confirm() + self.confirmTransaction() case .complete: self.coordinatorDelegate?.deviceVerificationVerifyViewModelDidComplete(self) case .cancel: + self.cancelTransaction() self.coordinatorDelegate?.deviceVerificationVerifyViewModelDidCancel(self) } } // MARK: - Private - private func confirm() { + private func confirmTransaction() { self.update(viewState: .loading) self.transaction.confirmSASMatch() } + + private func cancelTransaction() { + self.transaction.cancel(with: MXTransactionCancelCode.user()) + } private func update(viewState: DeviceVerificationVerifyViewState) { self.viewDelegate?.deviceVerificationVerifyViewModel(self, didUpdateViewState: viewState)