diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 03de9fbf9a..1af330f5f6 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -8509,7 +8509,7 @@ repositoryURL = "https://github.com/element-hq/matrix-rust-components-swift"; requirement = { kind = exactVersion; - version = 25.02.06; + version = 25.02.07; }; }; 701C7BEF8F70F7A83E852DCC /* XCRemoteSwiftPackageReference "GZIP" */ = { diff --git a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 0567e2de5f..f3d95ed8d0 100644 --- a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -149,8 +149,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/element-hq/matrix-rust-components-swift", "state" : { - "revision" : "355364952fdd14a3e26b317180af89c79f9e03a5", - "version" : "25.2.6" + "revision" : "bc819f09ac66bbe1adc2fde2afeb7ab023d1b909", + "version" : "25.2.7" } }, { diff --git a/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings b/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings index 9c3b1c02e0..6ea01d417d 100644 --- a/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings +++ b/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings @@ -251,6 +251,7 @@ "common_verified" = "Verified"; "common_verify_device" = "Verify device"; "common_verify_identity" = "Verify identity"; +"common_verify_user" = "Verify user"; "common_video" = "Video"; "common_voice_message" = "Voice message"; "common_waiting" = "Waiting…"; @@ -947,9 +948,11 @@ "screen_session_verification_cancelled_subtitle" = "Something doesn’t seem right. Either the request timed out or the request was denied."; "screen_session_verification_compare_emojis_subtitle" = "Confirm that the emojis below match those shown on your other session."; "screen_session_verification_compare_emojis_title" = "Compare emojis"; +"screen_session_verification_compare_emojis_user_subtitle" = "Confirm that the emojis below match those shown on the other user’s device."; "screen_session_verification_compare_numbers_subtitle" = "Confirm that the numbers below match those shown on your other session."; "screen_session_verification_compare_numbers_title" = "Compare numbers"; "screen_session_verification_complete_subtitle" = "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted."; +"screen_session_verification_complete_user_subtitle" = "Now you can trust the identity of this user when sending or receiving messages."; "screen_session_verification_enter_recovery_key" = "Enter recovery key"; "screen_session_verification_failed_subtitle" = "Either the request timed out, the request was denied, or there was a verification mismatch."; "screen_session_verification_open_existing_session_subtitle" = "Prove it’s you in order to access your encrypted message history."; @@ -970,8 +973,14 @@ "screen_session_verification_they_match" = "They match"; "screen_session_verification_use_another_device_subtitle" = "Make sure you have the app open in the other device before starting verification from here."; "screen_session_verification_use_another_device_title" = "Open the app on another verified device"; +"screen_session_verification_user_initiator_subtitle" = "For extra security, verify this user by comparing a set of emojis on your devices. Do this by using a trusted way to communicate."; +"screen_session_verification_user_initiator_title" = "Verify this user?"; +"screen_session_verification_user_responder_subtitle" = "For extra security, another user wants to verify your identity. You’ll be shown a set of emojis to compare."; "screen_session_verification_waiting_another_device_subtitle" = "You should see a popup on the other device. Start the verification from there now."; "screen_session_verification_waiting_another_device_title" = "Start verification on the other device"; +"screen_session_verification_waiting_other_device_title" = "Waiting for the other device"; +"screen_session_verification_waiting_other_user_title" = "Waiting for the other user"; +"screen_session_verification_waiting_subtitle" = "Once accepted you’ll be able to continue with the verification."; "screen_session_verification_waiting_to_accept_subtitle" = "Accept the request to start the verification process in your other session to continue."; "screen_session_verification_waiting_to_accept_title" = "Waiting to accept request"; "screen_share_location_title" = "Share location"; diff --git a/ElementX/Resources/Localizations/en.lproj/Localizable.strings b/ElementX/Resources/Localizations/en.lproj/Localizable.strings index 94b9c0d73f..2a8e0b677f 100644 --- a/ElementX/Resources/Localizations/en.lproj/Localizable.strings +++ b/ElementX/Resources/Localizations/en.lproj/Localizable.strings @@ -251,6 +251,7 @@ "common_verified" = "Verified"; "common_verify_device" = "Verify device"; "common_verify_identity" = "Verify identity"; +"common_verify_user" = "Verify user"; "common_video" = "Video"; "common_voice_message" = "Voice message"; "common_waiting" = "Waiting…"; @@ -947,9 +948,11 @@ "screen_session_verification_cancelled_subtitle" = "Something doesn’t seem right. Either the request timed out or the request was denied."; "screen_session_verification_compare_emojis_subtitle" = "Confirm that the emojis below match those shown on your other session."; "screen_session_verification_compare_emojis_title" = "Compare emojis"; +"screen_session_verification_compare_emojis_user_subtitle" = "Confirm that the emojis below match those shown on the other user’s device."; "screen_session_verification_compare_numbers_subtitle" = "Confirm that the numbers below match those shown on your other session."; "screen_session_verification_compare_numbers_title" = "Compare numbers"; "screen_session_verification_complete_subtitle" = "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted."; +"screen_session_verification_complete_user_subtitle" = "Now you can trust the identity of this user when sending or receiving messages."; "screen_session_verification_enter_recovery_key" = "Enter recovery key"; "screen_session_verification_failed_subtitle" = "Either the request timed out, the request was denied, or there was a verification mismatch."; "screen_session_verification_open_existing_session_subtitle" = "Prove it’s you in order to access your encrypted message history."; @@ -970,8 +973,14 @@ "screen_session_verification_they_match" = "They match"; "screen_session_verification_use_another_device_subtitle" = "Make sure you have the app open in the other device before starting verification from here."; "screen_session_verification_use_another_device_title" = "Open the app on another verified device"; +"screen_session_verification_user_initiator_subtitle" = "For extra security, verify this user by comparing a set of emojis on your devices. Do this by using a trusted way to communicate."; +"screen_session_verification_user_initiator_title" = "Verify this user?"; +"screen_session_verification_user_responder_subtitle" = "For extra security, another user wants to verify your identity. You’ll be shown a set of emojis to compare."; "screen_session_verification_waiting_another_device_subtitle" = "You should see a popup on the other device. Start the verification from there now."; "screen_session_verification_waiting_another_device_title" = "Start verification on the other device"; +"screen_session_verification_waiting_other_device_title" = "Waiting for the other device"; +"screen_session_verification_waiting_other_user_title" = "Waiting for the other user"; +"screen_session_verification_waiting_subtitle" = "Once accepted you’ll be able to continue with the verification."; "screen_session_verification_waiting_to_accept_subtitle" = "Accept the request to start the verification process in your other session to continue."; "screen_session_verification_waiting_to_accept_title" = "Waiting to accept request"; "screen_share_location_title" = "Share location"; diff --git a/ElementX/Sources/FlowCoordinators/OnboardingFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/OnboardingFlowCoordinator.swift index 3e09b8f702..36a57c4e93 100644 --- a/ElementX/Sources/FlowCoordinators/OnboardingFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/OnboardingFlowCoordinator.swift @@ -278,7 +278,9 @@ class OnboardingFlowCoordinator: FlowCoordinatorProtocol { } let parameters = SessionVerificationScreenCoordinatorParameters(sessionVerificationControllerProxy: sessionVerificationController, - flow: .initiator) + flow: .deviceInitiator, + appSettings: appSettings, + mediaProvider: userSession.mediaProvider) let coordinator = SessionVerificationScreenCoordinator(parameters: parameters) diff --git a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift index 4b3c1acfa3..e254b779c6 100644 --- a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift @@ -12,6 +12,7 @@ import UserNotifications enum RoomFlowCoordinatorAction: Equatable { case presentCallScreen(roomProxy: JoinedRoomProxyProtocol) + case verifyUser(userID: String) case finished static func == (lhs: RoomFlowCoordinatorAction, rhs: RoomFlowCoordinatorAction) -> Bool { @@ -1247,6 +1248,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { stateMachine.tryEvent(.startChildFlow(roomID: roomID, via: [], entryPoint: .room)) case .startCall(let roomID): Task { await self.presentCallScreen(roomID: roomID) } + case .verifyUser(let userID): + actionsSubject.send(.verifyUser(userID: userID)) } } .store(in: &cancellables) @@ -1272,6 +1275,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { stateMachine.tryEvent(.startChildFlow(roomID: roomID, via: [], entryPoint: .room)) case .startCall(let roomID): Task { await self.presentCallScreen(roomID: roomID) } + case .verifyUser(let userID): + actionsSubject.send(.verifyUser(userID: userID)) case .dismiss: break // Not supported when pushed. } @@ -1530,6 +1535,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { switch action { case .presentCallScreen(let roomProxy): actionsSubject.send(.presentCallScreen(roomProxy: roomProxy)) + case .verifyUser(let userID): + actionsSubject.send(.verifyUser(userID: userID)) case .finished: stateMachine.tryEvent(.dismissChildFlow) } diff --git a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift index e76727cafb..b11197ece1 100644 --- a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift @@ -440,18 +440,26 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { MXLog.info("Received session verification request") - presentSessionVerificationScreen(details: details) + if details.senderProfile.userID == userSession.clientProxy.userID { + presentSessionVerificationScreen(flow: .deviceResponder(requestDetails: details)) + } else { + presentSessionVerificationScreen(flow: .userResponder(requestDetails: details)) + } } .store(in: &cancellables) } - private func presentSessionVerificationScreen(details: SessionVerificationRequestDetails) { + private func presentSessionVerificationScreen(flow: SessionVerificationScreenFlow) { guard let sessionVerificationController = userSession.clientProxy.sessionVerificationController else { fatalError("The sessionVerificationController should aways be valid at this point") } + let navigationStackCoordinator = NavigationStackCoordinator() + let parameters = SessionVerificationScreenCoordinatorParameters(sessionVerificationControllerProxy: sessionVerificationController, - flow: .responder(details: details)) + flow: flow, + appSettings: appSettings, + mediaProvider: userSession.mediaProvider) let coordinator = SessionVerificationScreenCoordinator(parameters: parameters) @@ -464,7 +472,9 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { } .store(in: &cancellables) - navigationSplitCoordinator.setSheetCoordinator(coordinator) + navigationStackCoordinator.setRootCoordinator(coordinator) + + navigationSplitCoordinator.setSheetCoordinator(navigationStackCoordinator) } private func presentHomeScreen() { @@ -590,6 +600,8 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { case .presentCallScreen(let roomProxy): // Here we assume that the app is running and the call state is already up to date presentCallScreen(roomProxy: roomProxy, notifyOtherParticipants: !roomProxy.infoPublisher.value.hasRoomCall) + case .verifyUser(let userID): + presentSessionVerificationScreen(flow: .userIntiator(userID: userID)) case .finished: stateMachine.processEvent(.deselectRoom) } @@ -911,6 +923,8 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { stateMachine.processEvent(.selectRoom(roomID: roomID, via: [], entryPoint: .room)) case .startCall(let roomID): Task { await self.presentCallScreen(roomID: roomID, notifyOtherParticipants: false) } + case .verifyUser(let userID): + presentSessionVerificationScreen(flow: .userIntiator(userID: userID)) case .dismiss: navigationSplitCoordinator.setSheetCoordinator(nil) } diff --git a/ElementX/Sources/Generated/Strings.swift b/ElementX/Sources/Generated/Strings.swift index 8fe017f985..0ad8dc8a00 100644 --- a/ElementX/Sources/Generated/Strings.swift +++ b/ElementX/Sources/Generated/Strings.swift @@ -562,6 +562,8 @@ internal enum L10n { internal static var commonVerifyDevice: String { return L10n.tr("Localizable", "common_verify_device") } /// Verify identity internal static var commonVerifyIdentity: String { return L10n.tr("Localizable", "common_verify_identity") } + /// Verify user + internal static var commonVerifyUser: String { return L10n.tr("Localizable", "common_verify_user") } /// Video internal static var commonVideo: String { return L10n.tr("Localizable", "common_video") } /// Voice message @@ -2306,12 +2308,16 @@ internal enum L10n { internal static var screenSessionVerificationCompareEmojisSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_compare_emojis_subtitle") } /// Compare emojis internal static var screenSessionVerificationCompareEmojisTitle: String { return L10n.tr("Localizable", "screen_session_verification_compare_emojis_title") } + /// Confirm that the emojis below match those shown on the other user’s device. + internal static var screenSessionVerificationCompareEmojisUserSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_compare_emojis_user_subtitle") } /// Confirm that the numbers below match those shown on your other session. internal static var screenSessionVerificationCompareNumbersSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_compare_numbers_subtitle") } /// Compare numbers internal static var screenSessionVerificationCompareNumbersTitle: String { return L10n.tr("Localizable", "screen_session_verification_compare_numbers_title") } /// Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted. internal static var screenSessionVerificationCompleteSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_complete_subtitle") } + /// Now you can trust the identity of this user when sending or receiving messages. + internal static var screenSessionVerificationCompleteUserSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_complete_user_subtitle") } /// Enter recovery key internal static var screenSessionVerificationEnterRecoveryKey: String { return L10n.tr("Localizable", "screen_session_verification_enter_recovery_key") } /// Either the request timed out, the request was denied, or there was a verification mismatch. @@ -2354,10 +2360,22 @@ internal enum L10n { internal static var screenSessionVerificationUseAnotherDeviceSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_use_another_device_subtitle") } /// Open the app on another verified device internal static var screenSessionVerificationUseAnotherDeviceTitle: String { return L10n.tr("Localizable", "screen_session_verification_use_another_device_title") } + /// For extra security, verify this user by comparing a set of emojis on your devices. Do this by using a trusted way to communicate. + internal static var screenSessionVerificationUserInitiatorSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_user_initiator_subtitle") } + /// Verify this user? + internal static var screenSessionVerificationUserInitiatorTitle: String { return L10n.tr("Localizable", "screen_session_verification_user_initiator_title") } + /// For extra security, another user wants to verify your identity. You’ll be shown a set of emojis to compare. + internal static var screenSessionVerificationUserResponderSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_user_responder_subtitle") } /// You should see a popup on the other device. Start the verification from there now. internal static var screenSessionVerificationWaitingAnotherDeviceSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_waiting_another_device_subtitle") } /// Start verification on the other device internal static var screenSessionVerificationWaitingAnotherDeviceTitle: String { return L10n.tr("Localizable", "screen_session_verification_waiting_another_device_title") } + /// Waiting for the other device + internal static var screenSessionVerificationWaitingOtherDeviceTitle: String { return L10n.tr("Localizable", "screen_session_verification_waiting_other_device_title") } + /// Waiting for the other user + internal static var screenSessionVerificationWaitingOtherUserTitle: String { return L10n.tr("Localizable", "screen_session_verification_waiting_other_user_title") } + /// Once accepted you’ll be able to continue with the verification. + internal static var screenSessionVerificationWaitingSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_waiting_subtitle") } /// Accept the request to start the verification process in your other session to continue. internal static var screenSessionVerificationWaitingToAcceptSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_waiting_to_accept_subtitle") } /// Waiting to accept request diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index 8ebd03458c..79c51c4616 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -14105,17 +14105,17 @@ class SessionVerificationControllerProxyMock: SessionVerificationControllerProxy return acceptVerificationRequestReturnValue } } - //MARK: - requestVerification + //MARK: - requestDeviceVerification - var requestVerificationUnderlyingCallsCount = 0 - var requestVerificationCallsCount: Int { + var requestDeviceVerificationUnderlyingCallsCount = 0 + var requestDeviceVerificationCallsCount: Int { get { if Thread.isMainThread { - return requestVerificationUnderlyingCallsCount + return requestDeviceVerificationUnderlyingCallsCount } else { var returnValue: Int? = nil DispatchQueue.main.sync { - returnValue = requestVerificationUnderlyingCallsCount + returnValue = requestDeviceVerificationUnderlyingCallsCount } return returnValue! @@ -14123,27 +14123,27 @@ class SessionVerificationControllerProxyMock: SessionVerificationControllerProxy } set { if Thread.isMainThread { - requestVerificationUnderlyingCallsCount = newValue + requestDeviceVerificationUnderlyingCallsCount = newValue } else { DispatchQueue.main.sync { - requestVerificationUnderlyingCallsCount = newValue + requestDeviceVerificationUnderlyingCallsCount = newValue } } } } - var requestVerificationCalled: Bool { - return requestVerificationCallsCount > 0 + var requestDeviceVerificationCalled: Bool { + return requestDeviceVerificationCallsCount > 0 } - var requestVerificationUnderlyingReturnValue: Result! - var requestVerificationReturnValue: Result! { + var requestDeviceVerificationUnderlyingReturnValue: Result! + var requestDeviceVerificationReturnValue: Result! { get { if Thread.isMainThread { - return requestVerificationUnderlyingReturnValue + return requestDeviceVerificationUnderlyingReturnValue } else { var returnValue: Result? = nil DispatchQueue.main.sync { - returnValue = requestVerificationUnderlyingReturnValue + returnValue = requestDeviceVerificationUnderlyingReturnValue } return returnValue! @@ -14151,22 +14151,92 @@ class SessionVerificationControllerProxyMock: SessionVerificationControllerProxy } set { if Thread.isMainThread { - requestVerificationUnderlyingReturnValue = newValue + requestDeviceVerificationUnderlyingReturnValue = newValue } else { DispatchQueue.main.sync { - requestVerificationUnderlyingReturnValue = newValue + requestDeviceVerificationUnderlyingReturnValue = newValue } } } } - var requestVerificationClosure: (() async -> Result)? + var requestDeviceVerificationClosure: (() async -> Result)? - func requestVerification() async -> Result { - requestVerificationCallsCount += 1 - if let requestVerificationClosure = requestVerificationClosure { - return await requestVerificationClosure() + func requestDeviceVerification() async -> Result { + requestDeviceVerificationCallsCount += 1 + if let requestDeviceVerificationClosure = requestDeviceVerificationClosure { + return await requestDeviceVerificationClosure() } else { - return requestVerificationReturnValue + return requestDeviceVerificationReturnValue + } + } + //MARK: - requestUserVerification + + var requestUserVerificationUnderlyingCallsCount = 0 + var requestUserVerificationCallsCount: Int { + get { + if Thread.isMainThread { + return requestUserVerificationUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = requestUserVerificationUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + requestUserVerificationUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + requestUserVerificationUnderlyingCallsCount = newValue + } + } + } + } + var requestUserVerificationCalled: Bool { + return requestUserVerificationCallsCount > 0 + } + var requestUserVerificationReceivedUserID: String? + var requestUserVerificationReceivedInvocations: [String] = [] + + var requestUserVerificationUnderlyingReturnValue: Result! + var requestUserVerificationReturnValue: Result! { + get { + if Thread.isMainThread { + return requestUserVerificationUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = requestUserVerificationUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + requestUserVerificationUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + requestUserVerificationUnderlyingReturnValue = newValue + } + } + } + } + var requestUserVerificationClosure: ((String) async -> Result)? + + func requestUserVerification(_ userID: String) async -> Result { + requestUserVerificationCallsCount += 1 + requestUserVerificationReceivedUserID = userID + DispatchQueue.main.async { + self.requestUserVerificationReceivedInvocations.append(userID) + } + if let requestUserVerificationClosure = requestUserVerificationClosure { + return await requestUserVerificationClosure(userID) + } else { + return requestUserVerificationReturnValue } } //MARK: - startSasVerification diff --git a/ElementX/Sources/Mocks/SessionVerificationControllerProxyMock.swift b/ElementX/Sources/Mocks/SessionVerificationControllerProxyMock.swift index 4c75b85d96..30e808b8e5 100644 --- a/ElementX/Sources/Mocks/SessionVerificationControllerProxyMock.swift +++ b/ElementX/Sources/Mocks/SessionVerificationControllerProxyMock.swift @@ -24,7 +24,7 @@ extension SessionVerificationControllerProxyMock { mock.acknowledgeVerificationRequestDetailsReturnValue = .success(()) - mock.requestVerificationClosure = { [unowned mock] in + mock.requestDeviceVerificationClosure = { [unowned mock] in Task.detached { try await Task.sleep(for: requestDelay) mock.actions.send(.acceptedVerificationRequest) diff --git a/ElementX/Sources/Other/Avatars.swift b/ElementX/Sources/Other/Avatars.swift index c55f3e21a9..2a2f91b436 100644 --- a/ElementX/Sources/Other/Avatars.swift +++ b/ElementX/Sources/Other/Avatars.swift @@ -77,6 +77,7 @@ enum UserAvatarSizeOnScreen { case knockingUserList case mediaPreviewDetails case sendInviteConfirmation + case sessionVerification var value: CGFloat { switch self { @@ -116,6 +117,8 @@ enum UserAvatarSizeOnScreen { return 32 case .sendInviteConfirmation: return 64 + case .sessionVerification: + return 52 } } } diff --git a/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenCoordinator.swift b/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenCoordinator.swift index f1f91c0e60..ed15cf9a8a 100644 --- a/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenCoordinator.swift +++ b/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenCoordinator.swift @@ -14,13 +14,26 @@ enum SessionVerificationScreenCoordinatorAction { } enum SessionVerificationScreenFlow { - case initiator - case responder(details: SessionVerificationRequestDetails) + case deviceInitiator + case deviceResponder(requestDetails: SessionVerificationRequestDetails) + case userIntiator(userID: String) + case userResponder(requestDetails: SessionVerificationRequestDetails) + + var isResponder: Bool { + switch self { + case .deviceInitiator, .userIntiator: + false + case .deviceResponder, .userResponder: + true + } + } } struct SessionVerificationScreenCoordinatorParameters { let sessionVerificationControllerProxy: SessionVerificationControllerProxyProtocol let flow: SessionVerificationScreenFlow + let appSettings: AppSettings + let mediaProvider: MediaProviderProtocol } final class SessionVerificationScreenCoordinator: CoordinatorProtocol { @@ -35,7 +48,9 @@ final class SessionVerificationScreenCoordinator: CoordinatorProtocol { init(parameters: SessionVerificationScreenCoordinatorParameters) { viewModel = SessionVerificationScreenViewModel(sessionVerificationControllerProxy: parameters.sessionVerificationControllerProxy, - flow: parameters.flow) + flow: parameters.flow, + appSettings: parameters.appSettings, + mediaProvider: parameters.mediaProvider) } // MARK: - Public diff --git a/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenModels.swift b/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenModels.swift index 1f47d121d0..770bde08eb 100644 --- a/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenModels.swift +++ b/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenModels.swift @@ -20,17 +20,25 @@ enum SessionVerificationScreenViewAction { case restart case accept case decline + case cancel case done } struct SessionVerificationScreenViewState: BindableState { let flow: SessionVerificationScreenFlow + let learnMoreURL: URL + var verificationState: SessionVerificationScreenStateMachine.State var headerIcon: (keyPath: KeyPath, style: BigIcon.Style) { switch verificationState { case .initial: - return (\.devices, .defaultSolid) + switch flow { + case .deviceInitiator, .deviceResponder: + return (\.devices, .defaultSolid) + case .userIntiator, .userResponder: + return (\.userProfileSolid, .defaultSolid) + } case .acceptingVerificationRequest: return (\.devices, .defaultSolid) case .requestingVerification: @@ -56,25 +64,31 @@ struct SessionVerificationScreenViewState: BindableState { } } + var titleAccessibilityIdentifier: String { + verificationState == .verified ? A11yIdentifiers.sessionVerificationScreen.verificationComplete : "" + } + var title: String? { switch verificationState { case .initial: switch flow { - case .initiator: + case .deviceInitiator: return L10n.screenSessionVerificationUseAnotherDeviceTitle - case .responder: + case .userIntiator: + return L10n.screenSessionVerificationUserInitiatorTitle + case .deviceResponder, .userResponder: return L10n.screenSessionVerificationRequestTitle } case .acceptingVerificationRequest: - return L10n.screenSessionVerificationWaitingAnotherDeviceTitle + return waitingTitle case .requestingVerification: - return L10n.screenSessionVerificationWaitingToAcceptTitle + return waitingTitle case .verificationRequestAccepted: return L10n.screenSessionVerificationCompareEmojisTitle case .startingSasVerification: - return nil + return waitingTitle case .sasVerificationStarted: - return nil + return waitingTitle case .showingChallenge: return L10n.screenSessionVerificationCompareEmojisTitle case .acceptingChallenge: @@ -84,47 +98,71 @@ struct SessionVerificationScreenViewState: BindableState { case .verified: return L10n.commonVerificationComplete case .cancelling: - return nil + return waitingTitle case .cancelled: return L10n.commonVerificationFailed } } - var titleAccessibilityIdentifier: String { - verificationState == .verified ? A11yIdentifiers.sessionVerificationScreen.verificationComplete : "" + private var waitingTitle: String { + switch flow { + case .deviceInitiator, .deviceResponder: + return L10n.screenSessionVerificationWaitingOtherDeviceTitle + case .userIntiator, .userResponder: + return L10n.screenSessionVerificationWaitingOtherUserTitle + } } var message: String { switch verificationState { case .initial: switch flow { - case .initiator: + case .deviceInitiator: return L10n.screenSessionVerificationUseAnotherDeviceSubtitle - case .responder: + case .userIntiator: + return L10n.screenSessionVerificationUserInitiatorSubtitle + case .deviceResponder: return L10n.screenSessionVerificationRequestSubtitle + case .userResponder: + return L10n.screenSessionVerificationUserResponderSubtitle } case .acceptingVerificationRequest: - return L10n.screenSessionVerificationWaitingAnotherDeviceSubtitle + return waitingMessage case .requestingVerification: - return L10n.screenSessionVerificationWaitingToAcceptSubtitle + return waitingMessage case .verificationRequestAccepted: return L10n.screenSessionVerificationRequestAcceptedSubtitle case .startingSasVerification: - return L10n.commonWaiting + return waitingMessage case .sasVerificationStarted: - return L10n.commonWaiting + return waitingMessage case .acceptingChallenge: return L10n.screenSessionVerificationCompareEmojisSubtitle case .decliningChallenge: return L10n.screenSessionVerificationCompareEmojisSubtitle case .cancelling: - return L10n.commonWaiting + return waitingMessage case .showingChallenge: - return L10n.screenSessionVerificationCompareEmojisSubtitle + switch flow { + case .deviceInitiator, .deviceResponder: + return L10n.screenSessionVerificationCompareEmojisSubtitle + case .userIntiator, .userResponder: + return L10n.screenSessionVerificationCompareEmojisUserSubtitle + } case .verified: - return L10n.screenSessionVerificationCompleteSubtitle + switch flow { + case .deviceInitiator, .deviceResponder: + return L10n.screenSessionVerificationCompleteSubtitle + case .userIntiator, .userResponder: + return L10n.screenSessionVerificationCompleteUserSubtitle + } + case .cancelled: return L10n.screenSessionVerificationFailedSubtitle } } + + private var waitingMessage: String { + L10n.screenSessionVerificationWaitingSubtitle + } } diff --git a/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenViewModel.swift b/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenViewModel.swift index 33aef15941..b23e577ab8 100644 --- a/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenViewModel.swift +++ b/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/SessionVerificationScreenViewModel.swift @@ -24,13 +24,18 @@ class SessionVerificationScreenViewModel: SessionVerificationViewModelType, Sess init(sessionVerificationControllerProxy: SessionVerificationControllerProxyProtocol, flow: SessionVerificationScreenFlow, + appSettings: AppSettings, + mediaProvider: MediaProviderProtocol, verificationState: SessionVerificationScreenStateMachine.State = .initial) { self.sessionVerificationControllerProxy = sessionVerificationControllerProxy self.flow = flow stateMachine = SessionVerificationScreenStateMachine(state: verificationState) - super.init(initialViewState: .init(flow: flow, verificationState: verificationState)) + super.init(initialViewState: .init(flow: flow, + learnMoreURL: appSettings.encryptionURL, + verificationState: verificationState), + mediaProvider: mediaProvider) setupStateMachine() @@ -63,10 +68,13 @@ class SessionVerificationScreenViewModel: SessionVerificationViewModelType, Sess } .store(in: &cancellables) - if case .responder(let details) = flow { + switch flow { + case .deviceResponder(let details), .userResponder(let details): Task { await self.sessionVerificationControllerProxy.acknowledgeVerificationRequest(details: details) } + default: + break } } @@ -86,6 +94,9 @@ class SessionVerificationScreenViewModel: SessionVerificationViewModelType, Sess stateMachine.processEvent(.acceptChallenge) case .decline: stateMachine.processEvent(.declineChallenge) + case .cancel: + stateMachine.processEvent(.cancel) + actionsSubject.send(.finished) case .done: actionsSubject.send(.finished) } @@ -124,8 +135,11 @@ class SessionVerificationScreenViewModel: SessionVerificationViewModelType, Sess case (_, _, .verified): actionsSubject.send(.finished) case (.initial, _, .cancelled): - if case .responder = flow { + switch flow { + case .deviceResponder, .userResponder: actionsSubject.send(.finished) + default: + break } default: break @@ -139,7 +153,7 @@ class SessionVerificationScreenViewModel: SessionVerificationViewModelType, Sess private func acceptVerificationRequest() { Task { - guard case .responder = flow else { + guard flow.isResponder else { fatalError("Incorrect API usage.") } @@ -154,12 +168,25 @@ class SessionVerificationScreenViewModel: SessionVerificationViewModelType, Sess private func requestVerification() { Task { - switch await sessionVerificationControllerProxy.requestVerification() { - case .success: - // Need to wait for the callback from the remote - break - case .failure: - stateMachine.processEvent(.didFail) + switch flow { + case .deviceInitiator: + switch await sessionVerificationControllerProxy.requestDeviceVerification() { + case .success: + // Need to wait for the callback from the remote + break + case .failure: + stateMachine.processEvent(.didFail) + } + case .userIntiator(let userID): + switch await sessionVerificationControllerProxy.requestUserVerification(userID) { + case .success: + // Need to wait for the callback from the remote + break + case .failure: + stateMachine.processEvent(.didFail) + } + default: + fatalError("Incorrect API usage.") } } } diff --git a/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/View/SessionVerificationRequestDetailsView.swift b/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/View/SessionVerificationRequestDetailsView.swift index 551bf78006..95b5593477 100644 --- a/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/View/SessionVerificationRequestDetailsView.swift +++ b/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/View/SessionVerificationRequestDetailsView.swift @@ -14,8 +14,44 @@ struct SessionVerificationRequestDetailsView: View { private let outerShape = RoundedRectangle(cornerRadius: 8) let details: SessionVerificationRequestDetails + let isUserVerification: Bool + let mediaProvider: MediaProviderProtocol? var body: some View { + if isUserVerification { + userRequestDetails + } else { + deviceRequestDetails + } + } + + private var userRequestDetails: some View { + HStack(spacing: 12) { + LoadableAvatarImage(url: details.senderProfile.avatarURL, + name: details.senderProfile.displayName, + contentID: details.senderProfile.userID, + avatarSize: .user(on: .sessionVerification), + mediaProvider: mediaProvider) + + VStack(alignment: .leading, spacing: 0) { + Text(details.senderProfile.displayName ?? details.senderProfile.userID) + .font(.compound.bodySM) + .foregroundColor(.compound.textSecondary) + + if details.senderProfile.displayName != nil { + Text(details.senderProfile.userID) + .font(.compound.bodyMD) + .foregroundColor(.compound.textPrimary) + } + } + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(12) + .background(.compound.bgSubtleSecondary) + .clipShape(outerShape) + } + + private var deviceRequestDetails: some View { VStack(spacing: 24) { VStack(alignment: .leading, spacing: 12) { HStack(spacing: 16) { @@ -26,7 +62,8 @@ struct SessionVerificationRequestDetailsView: View { .background(.compound.bgSubtleSecondary) .clipShape(RoundedRectangle(cornerRadius: 8)) - Text(details.displayName ?? details.senderID) + let displayName = isUserVerification ? details.senderProfile.displayName : details.deviceDisplayName + Text(displayName ?? details.senderProfile.userID) .font(.compound.bodyMDSemibold) .foregroundColor(.compound.textPrimary) .frame(maxWidth: .infinity, alignment: .leading) @@ -60,21 +97,33 @@ struct SessionVerificationRequestDetailsView: View { .stroke(.compound.borderDisabled) } + .font(.compound.bodyMDSemibold) Text(L10n.screenSessionVerificationRequestFooter) - .font(.compound.bodyMDSemibold) .foregroundColor(.compound.textPrimary) } } } struct SessionVerificationRequestDetailsView_Previews: PreviewProvider, TestablePreview { + static let details = SessionVerificationRequestDetails(senderProfile: UserProfileProxy(userID: "@bob:matrix.org", + displayName: "Billy bob", + avatarURL: .mockMXCUserAvatar), + flowID: "123", + deviceID: "CODEMISTAKE", + deviceDisplayName: "Bob's Element X iOS", + firstSeenDate: .init(timeIntervalSince1970: 0)) + static var previews: some View { - let details = SessionVerificationRequestDetails(senderID: "@bob:matrix.org", - flowID: "123", - deviceID: "CODEMISTAKE", - displayName: "Bob's Element X iOS", - firstSeenDate: .init(timeIntervalSince1970: 0)) + SessionVerificationRequestDetailsView(details: details, + isUserVerification: true, + mediaProvider: MediaProviderMock(configuration: .init())) + .padding() + .previewDisplayName("User") - SessionVerificationRequestDetailsView(details: details) + SessionVerificationRequestDetailsView(details: details, + isUserVerification: false, + mediaProvider: MediaProviderMock(configuration: .init())) + .padding() + .previewDisplayName("Device") } } diff --git a/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/View/SessionVerificationScreen.swift b/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/View/SessionVerificationScreen.swift index b2b6ddb962..1bb79d9ae9 100644 --- a/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/View/SessionVerificationScreen.swift +++ b/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/View/SessionVerificationScreen.swift @@ -25,10 +25,24 @@ struct SessionVerificationScreen: View { .backgroundStyle(.compound.bgCanvasDefault) .interactiveDismissDisabled() .navigationBarBackButtonHidden(context.viewState.verificationState == .verified) + .toolbar { toolbar } } // MARK: - Private + private var toolbar: some ToolbarContent { + ToolbarItem(placement: .navigationBarLeading) { + switch context.viewState.flow { + case .userIntiator, .userResponder: + Button(L10n.actionCancel) { + context.send(viewAction: .cancel) + } + default: + EmptyView() + } + } + } + @ViewBuilder private var screenHeader: some View { VStack(spacing: 0) { @@ -55,11 +69,23 @@ struct SessionVerificationScreen: View { switch context.viewState.verificationState { case .initial: switch context.viewState.flow { - case .responder(let details): - SessionVerificationRequestDetailsView(details: details) + case .deviceResponder(let details): + SessionVerificationRequestDetailsView(details: details, + isUserVerification: false, + mediaProvider: context.mediaProvider) + case .userResponder(let details): + SessionVerificationRequestDetailsView(details: details, + isUserVerification: true, + mediaProvider: context.mediaProvider) + case .userIntiator: + Button(L10n.actionLearnMore) { + UIApplication.shared.open(context.viewState.learnMoreURL) + } + .buttonStyle(.compound(.plain)) default: EmptyView() } + case .showingChallenge(let emojis), .acceptingChallenge(let emojis), .decliningChallenge(let emojis): emojisPanel(with: emojis) .accessibilityIdentifier(A11yIdentifiers.sessionVerificationScreen.emojiWrapper) @@ -89,13 +115,13 @@ struct SessionVerificationScreen: View { switch context.viewState.verificationState { case .initial: switch context.viewState.flow { - case .initiator: + case .deviceInitiator, .userIntiator: Button(L10n.actionStartVerification) { context.send(viewAction: .requestVerification) } .buttonStyle(.compound(.primary)) .accessibilityIdentifier(A11yIdentifiers.sessionVerificationScreen.requestVerification) - case .responder: + case .deviceResponder, .userResponder: VStack(spacing: 16) { Button(L10n.actionStart) { context.send(viewAction: .acceptVerificationRequest) @@ -112,12 +138,12 @@ struct SessionVerificationScreen: View { } case .cancelled: switch context.viewState.flow { - case .initiator: + case .deviceInitiator, .userIntiator: Button(L10n.actionRetry) { context.send(viewAction: .restart) } .buttonStyle(.compound(.primary)) - case .responder: + case .deviceResponder, .userResponder: Button(L10n.actionDone) { context.send(viewAction: .done) } @@ -146,11 +172,6 @@ struct SessionVerificationScreen: View { .accessibilityIdentifier(A11yIdentifiers.sessionVerificationScreen.declineChallenge) } - case .acceptingVerificationRequest, .acceptingChallenge, .decliningChallenge, .requestingVerification: - Button(L10n.screenIdentityWaitingOnOtherDevice) { } - .buttonStyle(.compound(.primary)) - .disabled(true) - default: EmptyView() } @@ -174,16 +195,25 @@ struct SessionVerificationScreen: View { struct SessionVerification_Previews: PreviewProvider, TestablePreview { static var previews: some View { - sessionVerificationScreen(state: .initial) - .previewDisplayName("Initial - Initiator") + sessionVerificationScreen(state: .initial, flow: .deviceInitiator) + .previewDisplayName("Initial - Device Initiator") + + sessionVerificationScreen(state: .initial, flow: .userIntiator(userID: "@bob:matrix.org")) + .previewDisplayName("Initial - User Initiator") - let details = SessionVerificationRequestDetails(senderID: "@bob:matrix.org", + let details = SessionVerificationRequestDetails(senderProfile: UserProfileProxy(userID: "@bob:matrix.org", + displayName: "Billy Bob", + avatarURL: .mockMXCUserAvatar), flowID: "123", deviceID: "CODEMISTAKE", - displayName: "Bob's Element X iOS", + deviceDisplayName: "Bob's Element X iOS", firstSeenDate: .init(timeIntervalSince1970: 0)) - sessionVerificationScreen(state: .initial, flow: .responder(details: details)) - .previewDisplayName("Initial - Responder") + + sessionVerificationScreen(state: .initial, flow: .deviceResponder(requestDetails: details)) + .previewDisplayName("Initial - Device Responder") + + sessionVerificationScreen(state: .initial, flow: .userResponder(requestDetails: details)) + .previewDisplayName("Initial - User Responder") sessionVerificationScreen(state: .acceptingVerificationRequest) .previewDisplayName("Accepting Verification Request") @@ -213,9 +243,11 @@ struct SessionVerification_Previews: PreviewProvider, TestablePreview { } static func sessionVerificationScreen(state: SessionVerificationScreenStateMachine.State, - flow: SessionVerificationScreenFlow = .initiator) -> some View { + flow: SessionVerificationScreenFlow = .deviceInitiator) -> some View { let viewModel = SessionVerificationScreenViewModel(sessionVerificationControllerProxy: SessionVerificationControllerProxyMock.configureMock(), flow: flow, + appSettings: AppSettings(), + mediaProvider: MediaProviderMock(configuration: .init()), verificationState: state) return SessionVerificationScreen(context: viewModel.context) diff --git a/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenCoordinator.swift b/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenCoordinator.swift index 9b6bbb6552..cccaef13f3 100644 --- a/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenCoordinator.swift @@ -21,6 +21,7 @@ enum RoomMemberDetailsScreenCoordinatorAction { case openUserProfile case openDirectChat(roomID: String) case startCall(roomID: String) + case verifyUser(userID: String) } final class RoomMemberDetailsScreenCoordinator: CoordinatorProtocol { @@ -53,6 +54,8 @@ final class RoomMemberDetailsScreenCoordinator: CoordinatorProtocol { actionsSubject.send(.openDirectChat(roomID: roomID)) case .startCall(let roomID): actionsSubject.send(.startCall(roomID: roomID)) + case .verifyUser(let userID): + actionsSubject.send(.verifyUser(userID: userID)) } } .store(in: &cancellables) diff --git a/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenModels.swift b/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenModels.swift index 79a893799d..0c89fb0c88 100644 --- a/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenModels.swift +++ b/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenModels.swift @@ -11,6 +11,7 @@ enum RoomMemberDetailsScreenViewModelAction { case openUserProfile case openDirectChat(roomID: String) case startCall(roomID: String) + case verifyUser(userID: String) } struct RoomMemberDetailsScreenViewState: BindableState { @@ -88,6 +89,7 @@ enum RoomMemberDetailsScreenViewAction { case openDirectChat case createDirectChat case startCall(roomID: String) + case verifyUser } enum RoomMemberDetailsScreenAlertType: Hashable { diff --git a/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenViewModel.swift b/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenViewModel.swift index 2acc99a716..b5cadba6c6 100644 --- a/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenViewModel.swift @@ -75,6 +75,8 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro Task { await createDirectChat() } case .startCall(let roomID): actionsSubject.send(.startCall(roomID: roomID)) + case .verifyUser: + actionsSubject.send(.verifyUser(userID: state.userID)) } } diff --git a/ElementX/Sources/Screens/RoomMemberDetailsScreen/View/RoomMemberDetailsScreen.swift b/ElementX/Sources/Screens/RoomMemberDetailsScreen/View/RoomMemberDetailsScreen.swift index 32033581d7..90d40b7152 100644 --- a/ElementX/Sources/Screens/RoomMemberDetailsScreen/View/RoomMemberDetailsScreen.swift +++ b/ElementX/Sources/Screens/RoomMemberDetailsScreen/View/RoomMemberDetailsScreen.swift @@ -91,11 +91,10 @@ struct RoomMemberDetailsScreen: View { var verificationSection: some View { if context.viewState.showVerificationSection { Section { - ListRow(label: .default(title: L10n.commonVerifyIdentity, - description: L10n.screenRoomMemberDetailsVerifyButtonSubtitle, - icon: \.lock), - kind: .button { }) - .disabled(true) + ListRow(label: .default(title: L10n.commonVerifyUser, icon: \.lock), + kind: .button { + context.send(viewAction: .verifyUser) + }) } } } diff --git a/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenCoordinator.swift b/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenCoordinator.swift index 3eb074ca76..a18064d9c8 100644 --- a/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenCoordinator.swift +++ b/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenCoordinator.swift @@ -20,6 +20,7 @@ struct UserProfileScreenCoordinatorParameters { enum UserProfileScreenCoordinatorAction { case openDirectChat(roomID: String) case startCall(roomID: String) + case verifyUser(userID: String) case dismiss } @@ -51,6 +52,8 @@ final class UserProfileScreenCoordinator: CoordinatorProtocol { actionsSubject.send(.openDirectChat(roomID: roomID)) case .startCall(let roomID): actionsSubject.send(.startCall(roomID: roomID)) + case .verifyUser(let userID): + actionsSubject.send(.verifyUser(userID: userID)) case .dismiss: actionsSubject.send(.dismiss) } diff --git a/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenModels.swift b/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenModels.swift index 8aa3da09dc..d0b7448ffd 100644 --- a/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenModels.swift +++ b/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenModels.swift @@ -10,6 +10,7 @@ import Foundation enum UserProfileScreenViewModelAction { case openDirectChat(roomID: String) case startCall(roomID: String) + case verifyUser(userID: String) case dismiss } @@ -47,6 +48,7 @@ enum UserProfileScreenViewAction { case openDirectChat case createDirectChat case startCall(roomID: String) + case verifyUser case dismiss } diff --git a/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenViewModel.swift b/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenViewModel.swift index 5d6b2fbe4f..c64670c1ce 100644 --- a/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenViewModel.swift +++ b/ElementX/Sources/Screens/UserProfileScreen/UserProfileScreenViewModel.swift @@ -66,6 +66,8 @@ class UserProfileScreenViewModel: UserProfileScreenViewModelType, UserProfileScr Task { await createDirectChat() } case .startCall(let roomID): actionsSubject.send(.startCall(roomID: roomID)) + case .verifyUser: + actionsSubject.send(.verifyUser(userID: state.userID)) case .dismiss: actionsSubject.send(.dismiss) } diff --git a/ElementX/Sources/Screens/UserProfileScreen/View/UserProfileScreen.swift b/ElementX/Sources/Screens/UserProfileScreen/View/UserProfileScreen.swift index 6c35f61e2e..1fac8bc63b 100644 --- a/ElementX/Sources/Screens/UserProfileScreen/View/UserProfileScreen.swift +++ b/ElementX/Sources/Screens/UserProfileScreen/View/UserProfileScreen.swift @@ -88,11 +88,10 @@ struct UserProfileScreen: View { var verificationSection: some View { if context.viewState.showVerificationSection { Section { - ListRow(label: .default(title: L10n.commonVerifyIdentity, - description: L10n.screenRoomMemberDetailsVerifyButtonSubtitle, - icon: \.lock), - kind: .button { }) - .disabled(true) + ListRow(label: .default(title: L10n.commonVerifyUser, icon: \.lock), + kind: .button { + context.send(viewAction: .verifyUser) + }) } } } diff --git a/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxy.swift b/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxy.swift index b3f1b07b91..fe704523a3 100644 --- a/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxy.swift +++ b/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxy.swift @@ -71,7 +71,7 @@ class SessionVerificationControllerProxy: SessionVerificationControllerProxyProt MXLog.info("Acknowledging verification request") do { - try await sessionVerificationController.acknowledgeVerificationRequest(senderId: details.senderID, flowId: details.flowID) + try await sessionVerificationController.acknowledgeVerificationRequest(senderId: details.senderProfile.userID, flowId: details.flowID) return .success(()) } catch { MXLog.error("Failed requesting session verification with error: \(error)") @@ -91,14 +91,26 @@ class SessionVerificationControllerProxy: SessionVerificationControllerProxyProt } } - func requestVerification() async -> Result { - MXLog.info("Requesting session verification") + func requestDeviceVerification() async -> Result { + MXLog.info("Requesting device verification") do { try await sessionVerificationController.requestDeviceVerification() return .success(()) } catch { - MXLog.error("Failed requesting session verification with error: \(error)") + MXLog.error("Failed requesting device verification with error: \(error)") + return .failure(.failedRequestingVerification) + } + } + + func requestUserVerification(_ userID: String) async -> Result { + MXLog.info("Requesting user verification") + + do { + try await sessionVerificationController.requestUserVerification(userId: userID) + return .success(()) + } catch { + MXLog.error("Failed requesting verification for user \(userID) with error: \(error)") return .failure(.failedRequestingVerification) } } @@ -156,10 +168,10 @@ class SessionVerificationControllerProxy: SessionVerificationControllerProxyProt fileprivate func didReceiveVerificationRequest(details: MatrixRustSDK.SessionVerificationRequestDetails) { MXLog.info("Received verification request \(details)") - let details = SessionVerificationRequestDetails(senderID: details.senderId, + let details = SessionVerificationRequestDetails(senderProfile: UserProfileProxy(sdkUserProfile: details.senderProfile), flowID: details.flowId, deviceID: details.deviceId, - displayName: details.deviceDisplayName, + deviceDisplayName: details.deviceDisplayName, firstSeenDate: Date(timeIntervalSince1970: TimeInterval(details.firstSeenTimestamp / 1000))) actions.send(.receivedVerificationRequest(details: details)) diff --git a/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxyProtocol.swift b/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxyProtocol.swift index f4ec546f6e..07c85ca1c9 100644 --- a/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxyProtocol.swift +++ b/ElementX/Sources/Services/SessionVerification/SessionVerificationControllerProxyProtocol.swift @@ -30,10 +30,10 @@ enum SessionVerificationControllerProxyAction { } struct SessionVerificationRequestDetails { - let senderID: String + let senderProfile: UserProfileProxy let flowID: String let deviceID: String - let displayName: String? + let deviceDisplayName: String? let firstSeenDate: Date } @@ -54,7 +54,9 @@ protocol SessionVerificationControllerProxyProtocol { func acceptVerificationRequest() async -> Result - func requestVerification() async -> Result + func requestDeviceVerification() async -> Result + + func requestUserVerification(_ userID: String) async -> Result func startSasVerification() async -> Result diff --git a/ElementX/Sources/UITests/UITestsAppCoordinator.swift b/ElementX/Sources/UITests/UITestsAppCoordinator.swift index 76adb7854f..e21fd1e2fd 100644 --- a/ElementX/Sources/UITests/UITestsAppCoordinator.swift +++ b/ElementX/Sources/UITests/UITestsAppCoordinator.swift @@ -533,7 +533,9 @@ class MockScreen: Identifiable { case .sessionVerification: var sessionVerificationControllerProxy = SessionVerificationControllerProxyMock.configureMock(requestDelay: .seconds(5)) let parameters = SessionVerificationScreenCoordinatorParameters(sessionVerificationControllerProxy: sessionVerificationControllerProxy, - flow: .initiator) + flow: .deviceInitiator, + appSettings: ServiceLocator.shared.settings, + mediaProvider: MediaProviderMock(configuration: .init())) return SessionVerificationScreenCoordinator(parameters: parameters) case .userSessionScreen, .userSessionScreenReply: let appSettings: AppSettings = ServiceLocator.shared.settings diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Accepting-Challenge.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Accepting-Challenge.png index 76a5c2482c..9046cebea8 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Accepting-Challenge.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Accepting-Challenge.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:093952c8bbb20d47d49770aba04081684d057a5b5f149055e90e78677a2a59ec -size 162220 +oid sha256:8b84ace7ee894cd804be13c83511aeef7b3f4c26cddd8d4ece52f828828a843c +size 152955 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Accepting-Verification-Request.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Accepting-Verification-Request.png index eed613f242..1c531fe958 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Accepting-Verification-Request.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Accepting-Verification-Request.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d34314c93b65050cf9a196b831aea3255d836a4f064602757924c10725e6a50d -size 98778 +oid sha256:df1a86cc1d1521f7c6acdf921a26f575f7138c8065e54e3780868cd9bb1b6c99 +size 87743 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Declining-Challenge.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Declining-Challenge.png index 76a5c2482c..9046cebea8 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Declining-Challenge.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Declining-Challenge.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:093952c8bbb20d47d49770aba04081684d057a5b5f149055e90e78677a2a59ec -size 162220 +oid sha256:8b84ace7ee894cd804be13c83511aeef7b3f4c26cddd8d4ece52f828828a843c +size 152955 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-Initiator.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-Device-Initiator.png similarity index 100% rename from PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-Initiator.png rename to PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-Device-Initiator.png diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-Device-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-Device-Responder.png new file mode 100644 index 0000000000..650ee0e8df --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-Device-Responder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a7d0e25aa5161126d696db913da661d6fd75b0397dfa7ebb6c473f3399dd1dc +size 125107 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-Responder.png deleted file mode 100644 index cc8608a2a0..0000000000 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-Responder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:544b7532106675cab7af24c26b8e4fec538f3db9d954dbb01d43c165e9404f94 -size 124983 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-User-Initiator.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-User-Initiator.png new file mode 100644 index 0000000000..92073a6875 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-User-Initiator.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0596907b03d8927f0807797acb379febe8aa7a8079cb2df3edc577d809263fd1 +size 107231 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-User-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-User-Responder.png new file mode 100644 index 0000000000..53606e0b78 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Initial-User-Responder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a6cfe5a81a1d7eba134ae70ec1ef789a4b68b8baf23346b97865255859cac37 +size 136266 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Requesting-Verification.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Requesting-Verification.png index 1a6ce56341..1c531fe958 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Requesting-Verification.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Requesting-Verification.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0ec30edbbc01c05deafe947f7c3f334fc4482aff926adf68d7a9d2e71bf3bc7d -size 97729 +oid sha256:df1a86cc1d1521f7c6acdf921a26f575f7138c8065e54e3780868cd9bb1b6c99 +size 87743 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.SAS-Verification-started.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.SAS-Verification-started.png index 5cb6a712ca..1c531fe958 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.SAS-Verification-started.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.SAS-Verification-started.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84dab505b5ded1fba821d93c460239fc3b8ba156b3f261f9391c36227c65062d -size 71434 +oid sha256:df1a86cc1d1521f7c6acdf921a26f575f7138c8065e54e3780868cd9bb1b6c99 +size 87743 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Starting-SAS-Verification.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Starting-SAS-Verification.png index 5cb6a712ca..1c531fe958 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Starting-SAS-Verification.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-en-GB.Starting-SAS-Verification.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84dab505b5ded1fba821d93c460239fc3b8ba156b3f261f9391c36227c65062d -size 71434 +oid sha256:df1a86cc1d1521f7c6acdf921a26f575f7138c8065e54e3780868cd9bb1b6c99 +size 87743 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Accepting-Challenge.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Accepting-Challenge.png index a367afd2a0..709fade521 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Accepting-Challenge.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Accepting-Challenge.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e196922c62442c910c38dc097bb2a0b7529079a0aa002bfeec3a673925f6dcc4 -size 180582 +oid sha256:d4fed542a215435fb78a295ff7c444b8314f614b9ecae0e4751219f4a2fbe7bb +size 170328 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Accepting-Verification-Request.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Accepting-Verification-Request.png index e424bf4f05..a8211cc30b 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Accepting-Verification-Request.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Accepting-Verification-Request.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ae01c6fc18e49c952ad0202540abbdd959bb01264e6c682b835a93c3254a21f -size 118334 +oid sha256:79475962cd7a752e2df9746ffa7e858a40409d9f52d151efab763838b2ba3bf2 +size 98777 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Declining-Challenge.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Declining-Challenge.png index a367afd2a0..709fade521 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Declining-Challenge.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Declining-Challenge.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e196922c62442c910c38dc097bb2a0b7529079a0aa002bfeec3a673925f6dcc4 -size 180582 +oid sha256:d4fed542a215435fb78a295ff7c444b8314f614b9ecae0e4751219f4a2fbe7bb +size 170328 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-Initiator.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-Device-Initiator.png similarity index 100% rename from PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-Initiator.png rename to PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-Device-Initiator.png diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-Device-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-Device-Responder.png new file mode 100644 index 0000000000..bd009ad439 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-Device-Responder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b68bb87a002bd4de26a23f2f1523f66f29e7cc589302b01268786d2deed96fb3 +size 144922 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-Responder.png deleted file mode 100644 index 2ff0104a65..0000000000 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-Responder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ba093b11028e7ff672fc7fdfa3d0df629fa463893e2e7191e6a022100b5fff8 -size 146508 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-User-Initiator.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-User-Initiator.png new file mode 100644 index 0000000000..3544b6c6f4 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-User-Initiator.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a83c3d60285d7de3568534a93eb3e00dbbb07a8cb2ef9303ab2ef4c620ced05f +size 128771 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-User-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-User-Responder.png new file mode 100644 index 0000000000..257263d54e --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Initial-User-Responder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3320f47894c21e21956f46f58ce5d0d32ccb7f1e0b9574a290043a5cb4f49e63 +size 151735 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Requesting-Verification.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Requesting-Verification.png index 9bcbd667f8..a8211cc30b 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Requesting-Verification.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Requesting-Verification.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d0eff524cd9d12cd7bf2a8e8984b2629a202a1d876cec64e9e80204e6a0aef13 -size 110488 +oid sha256:79475962cd7a752e2df9746ffa7e858a40409d9f52d151efab763838b2ba3bf2 +size 98777 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.SAS-Verification-started.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.SAS-Verification-started.png index 66f6d92157..a8211cc30b 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.SAS-Verification-started.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.SAS-Verification-started.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2547e9244d4b77e2f9f14a76e6953de43854b2714a747081cc96b07619fb5263 -size 71096 +oid sha256:79475962cd7a752e2df9746ffa7e858a40409d9f52d151efab763838b2ba3bf2 +size 98777 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Starting-SAS-Verification.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Starting-SAS-Verification.png index 66f6d92157..a8211cc30b 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Starting-SAS-Verification.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPad-pseudo.Starting-SAS-Verification.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2547e9244d4b77e2f9f14a76e6953de43854b2714a747081cc96b07619fb5263 -size 71096 +oid sha256:79475962cd7a752e2df9746ffa7e858a40409d9f52d151efab763838b2ba3bf2 +size 98777 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Accepting-Challenge.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Accepting-Challenge.png index 8d97b62bb2..406671a68d 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Accepting-Challenge.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Accepting-Challenge.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c103377195f66d616a0494c3a8875e57267ce2b4e40c3f4b8ec8decd4a86f6f7 -size 113100 +oid sha256:80c45c14dfd2e30fb120a9ee10372caa9c62884837c881f63467c5df708de5dd +size 105600 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Accepting-Verification-Request.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Accepting-Verification-Request.png index f25c8dca20..b7dd79097f 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Accepting-Verification-Request.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Accepting-Verification-Request.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:59787c26b565686c7df1be3abd74df657b8b1dd57045ba322991492d19a03073 -size 58033 +oid sha256:4c02ac0a4f6c05c80534e5f591c443a7198dcafdfd74e710457dbb1a77bd9b1b +size 45660 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Declining-Challenge.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Declining-Challenge.png index 8d97b62bb2..406671a68d 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Declining-Challenge.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Declining-Challenge.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c103377195f66d616a0494c3a8875e57267ce2b4e40c3f4b8ec8decd4a86f6f7 -size 113100 +oid sha256:80c45c14dfd2e30fb120a9ee10372caa9c62884837c881f63467c5df708de5dd +size 105600 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-Initiator.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-Device-Initiator.png similarity index 100% rename from PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-Initiator.png rename to PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-Device-Initiator.png diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-Device-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-Device-Responder.png new file mode 100644 index 0000000000..4784c8ce3e --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-Device-Responder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac425720600b341ca9e7d80cdba315e64ff1464fa0be859193acbe7804998580 +size 77159 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-Responder.png deleted file mode 100644 index ed2d0104c0..0000000000 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-Responder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80978072d73aeb5da1e0770e43c90d4b520e9033869a0bdef0e7d2f18726cf5b -size 76338 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-User-Initiator.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-User-Initiator.png new file mode 100644 index 0000000000..35d0435b70 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-User-Initiator.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79eee63e783291b77fcbc69a36e17b1a95ea645836f4679ef7e4c36c283407bc +size 65183 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-User-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-User-Responder.png new file mode 100644 index 0000000000..ea23c08d6f --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Initial-User-Responder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d408ee9328fc4db9823699521b2dd7462a37131cf5ca55359f07abee1441b652 +size 86328 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Requesting-Verification.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Requesting-Verification.png index 955b7bb47a..b7dd79097f 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Requesting-Verification.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Requesting-Verification.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fae4c9c5121b82e082366b1d7ae71276831a7d40df94d138329c3c134769bc5a -size 55510 +oid sha256:4c02ac0a4f6c05c80534e5f591c443a7198dcafdfd74e710457dbb1a77bd9b1b +size 45660 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.SAS-Verification-started.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.SAS-Verification-started.png index e775767ef4..b7dd79097f 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.SAS-Verification-started.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.SAS-Verification-started.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1e16a425e3fb0c4946932d50e94fa103dee23bc4366f68c66d813fb790242174 -size 31094 +oid sha256:4c02ac0a4f6c05c80534e5f591c443a7198dcafdfd74e710457dbb1a77bd9b1b +size 45660 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Starting-SAS-Verification.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Starting-SAS-Verification.png index e775767ef4..b7dd79097f 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Starting-SAS-Verification.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-en-GB.Starting-SAS-Verification.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1e16a425e3fb0c4946932d50e94fa103dee23bc4366f68c66d813fb790242174 -size 31094 +oid sha256:4c02ac0a4f6c05c80534e5f591c443a7198dcafdfd74e710457dbb1a77bd9b1b +size 45660 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Accepting-Challenge.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Accepting-Challenge.png index 5898b89e2a..f92cf22ce0 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Accepting-Challenge.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Accepting-Challenge.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:560c79a382fc2e7154e764b49eeb443d771fd28c47d3a77f04d705c45d4064a0 -size 134554 +oid sha256:507df30f49d2a2f688195e668c399e40bf2db537c3c3a17372c82ec607026be7 +size 121304 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Accepting-Verification-Request.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Accepting-Verification-Request.png index 1ddebe56e5..2331b80d74 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Accepting-Verification-Request.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Accepting-Verification-Request.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1e7835d5c27384b6fef3f9d6fc675f4d960124d1bc525857222955b61a389a4b -size 82012 +oid sha256:f98fdfdeca99bc45e2247a3d6db244765460eb0291f9071159ed3d851a351634 +size 61301 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Declining-Challenge.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Declining-Challenge.png index 5898b89e2a..f92cf22ce0 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Declining-Challenge.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Declining-Challenge.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:560c79a382fc2e7154e764b49eeb443d771fd28c47d3a77f04d705c45d4064a0 -size 134554 +oid sha256:507df30f49d2a2f688195e668c399e40bf2db537c3c3a17372c82ec607026be7 +size 121304 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-Initiator.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-Device-Initiator.png similarity index 100% rename from PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-Initiator.png rename to PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-Device-Initiator.png diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-Device-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-Device-Responder.png new file mode 100644 index 0000000000..933840bac2 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-Device-Responder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99a35cbd2a6d030b3b562d169bf65bb47df942efce378da16d9c6b7e6b7bb708 +size 102767 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-Responder.png deleted file mode 100644 index 2fa7e07cb9..0000000000 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-Responder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74f3e11279a27cae1ee631f1ecd9a1caad06413afbc96ca5449250c37b9c0b8e -size 101758 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-User-Initiator.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-User-Initiator.png new file mode 100644 index 0000000000..d5a51de861 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-User-Initiator.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b9d92608775d8f55e2a0da4178364c2d41751471331fe971c3d646a028ecc9b +size 87568 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-User-Responder.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-User-Responder.png new file mode 100644 index 0000000000..568eb917d8 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Initial-User-Responder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6959ea579872e782f1716243646750a9a7028d66ef4fcba05df609a7e8a3a342 +size 106747 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Requesting-Verification.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Requesting-Verification.png index e8231f291c..2331b80d74 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Requesting-Verification.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Requesting-Verification.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:82ce8b845e4da08a1128dbbd2b5329dded3db3b66889c19ef040e74deb0438a1 -size 78555 +oid sha256:f98fdfdeca99bc45e2247a3d6db244765460eb0291f9071159ed3d851a351634 +size 61301 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.SAS-Verification-started.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.SAS-Verification-started.png index da443905af..2331b80d74 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.SAS-Verification-started.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.SAS-Verification-started.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c4436735155f7c4fc8e89c4e1763870ce160d02bf33ed0be7de8f1a7290469d8 -size 32044 +oid sha256:f98fdfdeca99bc45e2247a3d6db244765460eb0291f9071159ed3d851a351634 +size 61301 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Starting-SAS-Verification.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Starting-SAS-Verification.png index da443905af..2331b80d74 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Starting-SAS-Verification.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerification-iPhone-16-pseudo.Starting-SAS-Verification.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c4436735155f7c4fc8e89c4e1763870ce160d02bf33ed0be7de8f1a7290469d8 -size 32044 +oid sha256:f98fdfdeca99bc45e2247a3d6db244765460eb0291f9071159ed3d851a351634 +size 61301 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-en-GB.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-en-GB.1.png deleted file mode 100644 index 0b931ab123..0000000000 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-en-GB.1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db9bed799aae9732c42fc1361e72064f0b25e90abb4d8d07ec9cdc8441c8481e -size 92806 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-en-GB.Device.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-en-GB.Device.png new file mode 100644 index 0000000000..5289287853 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-en-GB.Device.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:857ebc197e688957b8850aecf3b637b4ca9ce36d367b4f3559652dc58d65737c +size 94542 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-en-GB.User.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-en-GB.User.png new file mode 100644 index 0000000000..a3327a957b --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-en-GB.User.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b782162b02f2c1e40cf970dd62c5f33e8db64fa39b737c0f5263f4dd1d34f1d0 +size 100219 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-pseudo.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-pseudo.1.png deleted file mode 100644 index 52be29cdbb..0000000000 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-pseudo.1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d9d00be62424b27994eff708c279596bd6e3e64cdf733c9e350a4c21247db4c -size 101514 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-pseudo.Device.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-pseudo.Device.png new file mode 100644 index 0000000000..962d332360 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-pseudo.Device.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2cdc7fe38d2fb46b8db0893253f70472323c2f12e379ce2f89a4fc3ca2281f7 +size 100328 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-pseudo.User.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-pseudo.User.png new file mode 100644 index 0000000000..a3327a957b --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPad-pseudo.User.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b782162b02f2c1e40cf970dd62c5f33e8db64fa39b737c0f5263f4dd1d34f1d0 +size 100219 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-en-GB.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-en-GB.1.png deleted file mode 100644 index c96cbab3f8..0000000000 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-en-GB.1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c77f8338cafa5cb5f14fdc64e9855a78088bffc7d0017ccea69035417532693b -size 50064 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-en-GB.Device.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-en-GB.Device.png new file mode 100644 index 0000000000..3a0df24f9d --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-en-GB.Device.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f27f742f48bb56627a03b791e49934aa5f1d80f572aaa744bc8a93e78ed4ffff +size 52053 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-en-GB.User.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-en-GB.User.png new file mode 100644 index 0000000000..8f5c06bcc7 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-en-GB.User.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b8bd7869efd8ac2bb29eb2c4e90c2b43fbaa74015b562bf113b7f1f42d14af8 +size 54638 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-pseudo.1.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-pseudo.1.png deleted file mode 100644 index 701f2bdc1f..0000000000 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-pseudo.1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe6709b8a05591a74557ed266f980dfb9c8fcfd7b4d2ed94b5cd35dd692dd45e -size 59494 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-pseudo.Device.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-pseudo.Device.png new file mode 100644 index 0000000000..b7633c946c --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-pseudo.Device.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46cce7e87646fd73644f1e70506d39f115a08967add62c251b3ced2a5f544f68 +size 61760 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-pseudo.User.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-pseudo.User.png new file mode 100644 index 0000000000..8f5c06bcc7 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_sessionVerificationRequestDetailsView-iPhone-16-pseudo.User.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b8bd7869efd8ac2bb29eb2c4e90c2b43fbaa74015b562bf113b7f1f42d14af8 +size 54638 diff --git a/UnitTests/Sources/SessionVerificationViewModelTests.swift b/UnitTests/Sources/SessionVerificationViewModelTests.swift index 7cea5cb895..149c772325 100644 --- a/UnitTests/Sources/SessionVerificationViewModelTests.swift +++ b/UnitTests/Sources/SessionVerificationViewModelTests.swift @@ -18,7 +18,10 @@ class SessionVerificationViewModelTests: XCTestCase { override func setUpWithError() throws { sessionVerificationController = SessionVerificationControllerProxyMock.configureMock() - viewModel = SessionVerificationScreenViewModel(sessionVerificationControllerProxy: sessionVerificationController, flow: .initiator) + viewModel = SessionVerificationScreenViewModel(sessionVerificationControllerProxy: sessionVerificationController, + flow: .deviceInitiator, + appSettings: AppSettings(), + mediaProvider: MediaProviderMock(configuration: .init())) context = viewModel.context } @@ -28,7 +31,7 @@ class SessionVerificationViewModelTests: XCTestCase { context.send(viewAction: .requestVerification) try await Task.sleep(for: .milliseconds(100)) - XCTAssert(sessionVerificationController.requestVerificationCallsCount == 1) + XCTAssert(sessionVerificationController.requestDeviceVerificationCallsCount == 1) XCTAssertEqual(context.viewState.verificationState, .requestingVerification) } @@ -53,7 +56,7 @@ class SessionVerificationViewModelTests: XCTestCase { XCTAssertEqual(context.viewState.verificationState, .initial) - XCTAssert(sessionVerificationController.requestVerificationCallsCount == 1) + XCTAssert(sessionVerificationController.requestDeviceVerificationCallsCount == 1) XCTAssert(sessionVerificationController.cancelVerificationCallsCount == 1) } @@ -154,7 +157,7 @@ class SessionVerificationViewModelTests: XCTestCase { wait(for: [verificationDataReceivalExpectation], timeout: 10.0) XCTAssertEqual(context.viewState.verificationState, .showingChallenge(emojis: SessionVerificationControllerProxyMock.emojis)) - XCTAssert(sessionVerificationController.requestVerificationCallsCount == 1) + XCTAssert(sessionVerificationController.requestDeviceVerificationCallsCount == 1) XCTAssert(sessionVerificationController.startSasVerificationCallsCount == 1) } } diff --git a/project.yml b/project.yml index 8eb30f11ad..9c9d6db067 100644 --- a/project.yml +++ b/project.yml @@ -61,7 +61,7 @@ packages: # Element/Matrix dependencies MatrixRustSDK: url: https://github.com/element-hq/matrix-rust-components-swift - exactVersion: 25.02.06 + exactVersion: 25.02.07 # path: ../matrix-rust-sdk Compound: url: https://github.com/element-hq/compound-ios