diff --git a/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingCoordinator.swift b/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingCoordinator.swift index 461e2fd43..3c1ad6289 100644 --- a/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingCoordinator.swift +++ b/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingCoordinator.swift @@ -65,6 +65,10 @@ final class DeviceVerificationDataLoadingCoordinator: DeviceVerificationDataLoad // MARK: - DeviceVerificationDataLoadingViewModelCoordinatorDelegate extension DeviceVerificationDataLoadingCoordinator: DeviceVerificationDataLoadingViewModelCoordinatorDelegate { + func deviceVerificationDataLoadingViewModel(_ viewModel: DeviceVerificationDataLoadingViewModelType, didAcceptKeyVerificationRequest keyVerificationRequest: MXKeyVerificationRequest) { + self.delegate?.deviceVerificationDataLoadingCoordinator(self, didAcceptKeyVerificationRequest: keyVerificationRequest) + } + func deviceVerificationDataLoadingViewModel(_ viewModel: DeviceVerificationDataLoadingViewModelType, didAcceptKeyVerificationWithTransaction transaction: MXKeyVerificationTransaction) { self.delegate?.deviceVerificationDataLoadingCoordinator(self, didAcceptKeyVerificationRequestWithTransaction: transaction) } diff --git a/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingCoordinatorType.swift b/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingCoordinatorType.swift index 057059ab4..7caeea702 100644 --- a/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingCoordinatorType.swift +++ b/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingCoordinatorType.swift @@ -21,6 +21,7 @@ import Foundation protocol DeviceVerificationDataLoadingCoordinatorDelegate: class { func deviceVerificationDataLoadingCoordinator(_ coordinator: DeviceVerificationDataLoadingCoordinatorType, didLoadUser user: MXUser, device: MXDeviceInfo) func deviceVerificationDataLoadingCoordinator(_ coordinator: DeviceVerificationDataLoadingCoordinatorType, didAcceptKeyVerificationRequestWithTransaction transaction: MXKeyVerificationTransaction) + func deviceVerificationDataLoadingCoordinator(_ coordinator: DeviceVerificationDataLoadingCoordinatorType, didAcceptKeyVerificationRequest keyVerificationRequest: MXKeyVerificationRequest) func deviceVerificationDataLoadingCoordinatorDidCancel(_ coordinator: DeviceVerificationDataLoadingCoordinatorType) } diff --git a/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingViewModel.swift b/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingViewModel.swift index 693164375..79a8ecf48 100644 --- a/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingViewModel.swift +++ b/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingViewModel.swift @@ -33,6 +33,7 @@ final class DeviceVerificationDataLoadingViewModel: DeviceVerificationDataLoadin private let session: MXSession private let otherUserId: String? private let otherDeviceId: String? + private let keyVerificationService = KeyVerificationService() private let keyVerificationRequest: MXKeyVerificationRequest? @@ -88,31 +89,12 @@ final class DeviceVerificationDataLoadingViewModel: DeviceVerificationDataLoadin self.update(viewState: .loading) - // TODO: Advertise that we support QR code too - keyVerificationRequest.accept(withMethods: [MXKeyVerificationMethodSAS], success: { [weak self] in + keyVerificationRequest.accept(withMethods: self.keyVerificationService.supportedKeyVerificationMethods(), success: { [weak self] in guard let self = self else { return } - // TODO: Display QR code and the emoji button here (that depends of keyVerificationRequest.methods) - // Instead of starting the transaction right now - self.session.crypto.keyVerificationManager.beginKeyVerification(from: keyVerificationRequest, method: MXKeyVerificationMethodSAS, success: { [weak self] (deviceVerificationTransaction) in - guard let self = self else { - return - } - - if let outgoingSASTransaction = deviceVerificationTransaction as? MXOutgoingSASTransaction { - self.registerTransactionDidStateChangeNotification(transaction: outgoingSASTransaction) - } else { - self.update(viewState: .error(DeviceVerificationDataLoadingViewModelError.unknown)) - } - - }, failure: { [weak self] (error) in - guard let self = self else { - return - } - self.update(viewState: .error(error)) - }) + self.coordinatorDelegate?.deviceVerificationDataLoadingViewModel(self, didAcceptKeyVerificationRequest: keyVerificationRequest) }, failure: { [weak self] (error) in guard let self = self else { @@ -165,38 +147,4 @@ final class DeviceVerificationDataLoadingViewModel: DeviceVerificationDataLoadin private func update(viewState: DeviceVerificationDataLoadingViewState) { self.viewDelegate?.deviceVerificationDataLoadingViewModel(self, didUpdateViewState: viewState) } - - // MARK: MXKeyVerificationTransactionDidChange - - private func registerTransactionDidStateChangeNotification(transaction: MXOutgoingSASTransaction) { - NotificationCenter.default.addObserver(self, selector: #selector(transactionDidStateChange(notification:)), name: NSNotification.Name.MXKeyVerificationTransactionDidChange, object: transaction) - } - - private func unregisterTransactionDidStateChangeNotification() { - NotificationCenter.default.removeObserver(self, name: .MXKeyVerificationTransactionDidChange, object: nil) - } - - @objc private func transactionDidStateChange(notification: Notification) { - guard let transaction = notification.object as? MXOutgoingSASTransaction else { - return - } - - switch transaction.state { - case MXSASTransactionStateShowSAS: - self.unregisterTransactionDidStateChangeNotification() - self.update(viewState: .loaded) - self.coordinatorDelegate?.deviceVerificationDataLoadingViewModel(self, didAcceptKeyVerificationWithTransaction: transaction) - case MXSASTransactionStateCancelled: - self.unregisterTransactionDidStateChangeNotification() - self.update(viewState: .error(DeviceVerificationDataLoadingViewModelError.transactionCancelled)) - case MXSASTransactionStateCancelledByMe: - guard let reason = transaction.reasonCancelCode else { - return - } - self.unregisterTransactionDidStateChangeNotification() - self.update(viewState: .error(DeviceVerificationDataLoadingViewModelError.transactionCancelledByMe(reason: reason))) - default: - break - } - } } diff --git a/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingViewModelType.swift b/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingViewModelType.swift index c553b4317..89ee68523 100644 --- a/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingViewModelType.swift +++ b/Riot/Modules/DeviceVerification/Loading/DeviceVerificationDataLoadingViewModelType.swift @@ -25,6 +25,7 @@ protocol DeviceVerificationDataLoadingViewModelViewDelegate: class { protocol DeviceVerificationDataLoadingViewModelCoordinatorDelegate: class { func deviceVerificationDataLoadingViewModel(_ viewModel: DeviceVerificationDataLoadingViewModelType, didLoadUser user: MXUser, device: MXDeviceInfo) func deviceVerificationDataLoadingViewModel(_ viewModel: DeviceVerificationDataLoadingViewModelType, didAcceptKeyVerificationWithTransaction transaction: MXKeyVerificationTransaction) + func deviceVerificationDataLoadingViewModel(_ viewModel: DeviceVerificationDataLoadingViewModelType, didAcceptKeyVerificationRequest keyVerificationRequest: MXKeyVerificationRequest) func deviceVerificationDataLoadingViewModelDidCancel(_ viewModel: DeviceVerificationDataLoadingViewModelType) }