From a2f602731977c1930f2c960b9e1ab39ab6fb6dcf Mon Sep 17 00:00:00 2001 From: Marissa Le Coz <129999395+marissa-signal@users.noreply.github.com> Date: Wed, 9 Oct 2024 20:25:12 -0400 Subject: [PATCH] Make call UI react to receiving unknown users' profile keys --- .../Calls/UserInterface/CallDrawerSheet.swift | 2 +- .../GroupCallViewController.swift | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/Signal/Calls/UserInterface/CallDrawerSheet.swift b/Signal/Calls/UserInterface/CallDrawerSheet.swift index 896d02a186..db2b906a8d 100644 --- a/Signal/Calls/UserInterface/CallDrawerSheet.swift +++ b/Signal/Calls/UserInterface/CallDrawerSheet.swift @@ -381,7 +381,7 @@ class CallDrawerSheet: InteractiveSheetViewController { } } - private func updateMembers() { + func updateMembers() { let unsortedMembers: [JoinedMember] = databaseStorage.read { callSheetDataSource.unsortedMembers(tx: $0.asV2Read) } diff --git a/Signal/Calls/UserInterface/GroupCallViewController.swift b/Signal/Calls/UserInterface/GroupCallViewController.swift index f6ee537955..f1a1e4c7b2 100644 --- a/Signal/Calls/UserInterface/GroupCallViewController.swift +++ b/Signal/Calls/UserInterface/GroupCallViewController.swift @@ -559,6 +559,13 @@ class GroupCallViewController: UIViewController { ) } } + + NotificationCenter.default.addObserver( + self, + selector: #selector(otherUsersProfileChanged(notification:)), + name: UserProfileNotifications.otherUsersProfileDidChange, + object: nil + ) } override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { @@ -1405,6 +1412,37 @@ class GroupCallViewController: UIViewController { callService.callUIAdapter.answerCall(call) } + + // MARK: Profile updates + + @objc + private func otherUsersProfileChanged(notification: Notification) { + AssertIsOnMainThread() + + guard let changedAddress = notification.userInfo?[UserProfileNotifications.profileAddressKey] as? SignalServiceAddress, + changedAddress.isValid else { + owsFailDebug("changedAddress was unexpectedly nil") + return + } + + if let peekInfo = self.ringRtcCall.peekInfo { + let joinedAndPendingMembers = peekInfo.joinedMembers + peekInfo.pendingUsers + + if joinedAndPendingMembers.contains(where: { uuid in + changedAddress == SignalServiceAddress(Aci(fromUUID: uuid)) + }) { + self.bottomSheet.updateMembers() + + switch self.ringRtcCall.kind { + case .signalGroup: + break + case .callLink: + // Refresh profiles in call link admin approval UI. + self.callLinkApprovalViewModel.loadRequestsWithSneakyTransaction(for: peekInfo.pendingUsers) + } + } + } + } } // MARK: CallViewControllerWindowReference