From 570c3fbe3bf1266342a638b675ad2e50d5933f8b Mon Sep 17 00:00:00 2001 From: Ryan Zhao Date: Mon, 29 Nov 2021 16:32:02 +1100 Subject: [PATCH] add ringtone and other UI improvement --- Session.xcodeproj/project.pbxproj | 12 ++++-- .../SessionCallManager+CXProvider.swift | 1 + .../Call Management/SessionCallManager.swift | 2 +- Session/Calls/CallVC.swift | 1 + .../Views & Modals/IncomingCallBanner.swift | 6 ++- Session/Meta/AppDelegate.swift | 16 +++++--- Session/Meta/AudioFiles/ringing.mp3 | Bin 0 -> 55057 bytes .../General/CallRingTonePlayer.swift | 37 ++++++++++++++++++ SessionUtilitiesKit/General/Vibration.swift | 19 --------- 9 files changed, 63 insertions(+), 31 deletions(-) create mode 100644 Session/Meta/AudioFiles/ringing.mp3 create mode 100644 SessionUtilitiesKit/General/CallRingTonePlayer.swift delete mode 100644 SessionUtilitiesKit/General/Vibration.swift diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 569aadfef..c423f2c19 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -139,6 +139,7 @@ 7B0EFDEE274F598600FFAAE7 /* TimestampUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B0EFDED274F598600FFAAE7 /* TimestampUtils.swift */; }; 7B0EFDF0275084AA00FFAAE7 /* CallMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B0EFDEF275084AA00FFAAE7 /* CallMessageCell.swift */; }; 7B0EFDF2275449AA00FFAAE7 /* TSInfoMessage+Calls.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B0EFDF1275449AA00FFAAE7 /* TSInfoMessage+Calls.swift */; }; + 7B0EFDF4275490EA00FFAAE7 /* ringing.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 7B0EFDF3275490EA00FFAAE7 /* ringing.mp3 */; }; 7B1581E2271E743B00848B49 /* OWSSounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1581E1271E743B00848B49 /* OWSSounds.swift */; }; 7B1581E4271FC59D00848B49 /* CallModal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1581E3271FC59C00848B49 /* CallModal.swift */; }; 7B1581E6271FD2A100848B49 /* VideoPreviewVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1581E5271FD2A100848B49 /* VideoPreviewVC.swift */; }; @@ -149,7 +150,7 @@ 7B7CB18B270591630079FF93 /* ShareLogsModal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B7CB18A270591630079FF93 /* ShareLogsModal.swift */; }; 7B7CB18E270D066F0079FF93 /* IncomingCallBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B7CB18D270D066F0079FF93 /* IncomingCallBanner.swift */; }; 7B7CB190270FB2150079FF93 /* MiniCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B7CB18F270FB2150079FF93 /* MiniCallView.swift */; }; - 7B7CB192271508AD0079FF93 /* Vibration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B7CB191271508AD0079FF93 /* Vibration.swift */; }; + 7B7CB192271508AD0079FF93 /* CallRingTonePlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B7CB191271508AD0079FF93 /* CallRingTonePlayer.swift */; }; 7BA68909272A27BE00EFC32F /* SessionCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA68908272A27BE00EFC32F /* SessionCall.swift */; }; 7BA6890D27325CCC00EFC32F /* SessionCallManager+CXCallController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA6890C27325CCC00EFC32F /* SessionCallManager+CXCallController.swift */; }; 7BA6890F27325CE300EFC32F /* SessionCallManager+CXProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA6890E27325CE300EFC32F /* SessionCallManager+CXProvider.swift */; }; @@ -1131,6 +1132,7 @@ 7B0EFDED274F598600FFAAE7 /* TimestampUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimestampUtils.swift; sourceTree = ""; }; 7B0EFDEF275084AA00FFAAE7 /* CallMessageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallMessageCell.swift; sourceTree = ""; }; 7B0EFDF1275449AA00FFAAE7 /* TSInfoMessage+Calls.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSInfoMessage+Calls.swift"; sourceTree = ""; }; + 7B0EFDF3275490EA00FFAAE7 /* ringing.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = ringing.mp3; sourceTree = ""; }; 7B1581E1271E743B00848B49 /* OWSSounds.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWSSounds.swift; sourceTree = ""; }; 7B1581E3271FC59C00848B49 /* CallModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallModal.swift; sourceTree = ""; }; 7B1581E5271FD2A100848B49 /* VideoPreviewVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPreviewVC.swift; sourceTree = ""; }; @@ -1142,7 +1144,7 @@ 7B7CB18A270591630079FF93 /* ShareLogsModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareLogsModal.swift; sourceTree = ""; }; 7B7CB18D270D066F0079FF93 /* IncomingCallBanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncomingCallBanner.swift; sourceTree = ""; }; 7B7CB18F270FB2150079FF93 /* MiniCallView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiniCallView.swift; sourceTree = ""; }; - 7B7CB191271508AD0079FF93 /* Vibration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Vibration.swift; sourceTree = ""; }; + 7B7CB191271508AD0079FF93 /* CallRingTonePlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallRingTonePlayer.swift; sourceTree = ""; }; 7BA68908272A27BE00EFC32F /* SessionCall.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCall.swift; sourceTree = ""; }; 7BA6890C27325CCC00EFC32F /* SessionCallManager+CXCallController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SessionCallManager+CXCallController.swift"; sourceTree = ""; }; 7BA6890E27325CE300EFC32F /* SessionCallManager+CXProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SessionCallManager+CXProvider.swift"; sourceTree = ""; }; @@ -1953,6 +1955,7 @@ 34074F54203D0722004596AE /* Sounds */ = { isa = PBXGroup; children = ( + 7B0EFDF3275490EA00FFAAE7 /* ringing.mp3 */, 45A2F004204473A3002E978A /* NewMessage.aifc */, 34661FB720C1C0D60056EDD6 /* message_sent.aiff */, 34CF0783203E6B77005C4D61 /* busy_tone_ansi.caf */, @@ -2373,7 +2376,7 @@ C38EF23D255B6D66007E1867 /* UIView+OWS.h */, C38EF23E255B6D66007E1867 /* UIView+OWS.m */, C38EF2EF255B6DBB007E1867 /* Weak.swift */, - 7B7CB191271508AD0079FF93 /* Vibration.swift */, + 7B7CB191271508AD0079FF93 /* CallRingTonePlayer.swift */, 7B0EFDED274F598600FFAAE7 /* TimestampUtils.swift */, ); path = General; @@ -4218,6 +4221,7 @@ 45A2F005204473A3002E978A /* NewMessage.aifc in Resources */, 45B74A882044AAB600CD42F8 /* aurora.aifc in Resources */, 45B74A742044AAB600CD42F8 /* aurora-quiet.aifc in Resources */, + 7B0EFDF4275490EA00FFAAE7 /* ringing.mp3 in Resources */, 45B74A852044AAB600CD42F8 /* bamboo.aifc in Resources */, C3A01E06261D24C400290BEB /* storage-seed-1.der in Resources */, 45B74A782044AAB600CD42F8 /* bamboo-quiet.aifc in Resources */, @@ -4663,7 +4667,7 @@ C3BBE0A82554D4DE0050F1E3 /* JSON.swift in Sources */, C352A36D2557858E00338F3E /* NSTimer+Proxying.m in Sources */, C32C5A2D256DB849003C73A2 /* LKGroupUtilities.m in Sources */, - 7B7CB192271508AD0079FF93 /* Vibration.swift in Sources */, + 7B7CB192271508AD0079FF93 /* CallRingTonePlayer.swift in Sources */, C3C2ABD22553C6C900C340D1 /* Data+SecureRandom.swift in Sources */, B8856E09256F1676001CE70E /* UIDevice+featureSupport.swift in Sources */, B8856DEF256F161F001CE70E /* NSString+SSK.m in Sources */, diff --git a/Session/Calls/Call Management/SessionCallManager+CXProvider.swift b/Session/Calls/Call Management/SessionCallManager+CXProvider.swift index 44dd8025f..7b3fe2d3a 100644 --- a/Session/Calls/Call Management/SessionCallManager+CXProvider.swift +++ b/Session/Calls/Call Management/SessionCallManager+CXProvider.swift @@ -72,6 +72,7 @@ extension SessionCallManager: CXProviderDelegate { AssertIsOnMainThread() guard let call = self.currentCall else { return } call.webRTCSession.audioSessionDidActivate(audioSession) + if call.isOutgoing && !call.hasConnected { CallRingTonePlayer.shared.startPlayingRingTone() } } public func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) { diff --git a/Session/Calls/Call Management/SessionCallManager.swift b/Session/Calls/Call Management/SessionCallManager.swift index a229f92cb..ef68ee87f 100644 --- a/Session/Calls/Call Management/SessionCallManager.swift +++ b/Session/Calls/Call Management/SessionCallManager.swift @@ -69,7 +69,7 @@ public final class SessionCallManager: NSObject { self.provider.reportOutgoingCall(with: call.callID, connectedAt: call.connectedDate) } } - callTimeOutTimer = Timer.scheduledTimer(withTimeInterval: 60, repeats: false) { _ in + callTimeOutTimer = Timer.scheduledTimer(withTimeInterval: 30, repeats: false) { _ in guard let currentCall = self.currentCall else { return } currentCall.didTimeout = true self.endCall(currentCall) { error in diff --git a/Session/Calls/CallVC.swift b/Session/Calls/CallVC.swift index bd01d0560..af43db4f6 100644 --- a/Session/Calls/CallVC.swift +++ b/Session/Calls/CallVC.swift @@ -195,6 +195,7 @@ final class CallVC : UIViewController, VideoPreviewDelegate { } self.call.hasConnectedDidChange = { DispatchQueue.main.async { + CallRingTonePlayer.shared.stopPlayingRingTone() self.callInfoLabel.text = "Connected" self.minimizeButton.isHidden = false UIView.animate(withDuration: 0.5, delay: 1, options: [], animations: { diff --git a/Session/Calls/Views & Modals/IncomingCallBanner.swift b/Session/Calls/Views & Modals/IncomingCallBanner.swift index e5e80d40f..9ba23cf3f 100644 --- a/Session/Calls/Views & Modals/IncomingCallBanner.swift +++ b/Session/Calls/Views & Modals/IncomingCallBanner.swift @@ -173,11 +173,13 @@ final class IncomingCallBanner: UIView, UIGestureRecognizerDelegate { UIView.animate(withDuration: 0.5, delay: 0, options: [], animations: { self.alpha = 1.0 }, completion: nil) - Vibration.shared.startVibration() + CallRingTonePlayer.shared.startVibration() + CallRingTonePlayer.shared.startPlayingRingTone() } public func dismiss() { - Vibration.shared.stopVibrationIfPossible() + CallRingTonePlayer.shared.stopVibrationIfPossible() + CallRingTonePlayer.shared.stopPlayingRingTone() UIView.animate(withDuration: 0.5, delay: 0, options: [], animations: { self.alpha = 0.0 }, completion: { _ in diff --git a/Session/Meta/AppDelegate.swift b/Session/Meta/AppDelegate.swift index f90ec017c..03f15508c 100644 --- a/Session/Meta/AppDelegate.swift +++ b/Session/Meta/AppDelegate.swift @@ -48,12 +48,21 @@ extension AppDelegate { } } + private func insertCallInfoMessage(for message: CallMessage, using transaction: YapDatabaseReadWriteTransaction) -> TSInfoMessage { + let thread = TSContactThread.getOrCreateThread(withContactSessionID: message.sender!, transaction: transaction) + let infoMessage = TSInfoMessage.from(message, associatedWith: thread) + infoMessage.save(with: transaction) + return infoMessage + } + @objc func setUpCallHandling() { // Pre offer messages MessageReceiver.handleNewCallOfferMessageIfNeeded = { (message, transaction) in guard CurrentAppContext().isMainApp else { return } guard SSKPreferences.areCallsEnabled else { - // TODO: Show tips and insert a missing call message + let infoMessage = self.insertCallInfoMessage(for: message, using: transaction) + infoMessage.updateCallInfoMessage(.missed, using: transaction) + // TODO: add tips return } let callManager = AppEnvironment.shared.callManager @@ -63,10 +72,7 @@ extension AppDelegate { callManager.handleIncomingCallOfferInBusyState(offerMessage: message, using: transaction) return } - // Create incoming call message - let thread = TSContactThread.getOrCreateThread(withContactSessionID: message.sender!, transaction: transaction) - let infoMessage = TSInfoMessage.from(message, associatedWith: thread) - infoMessage.save(with: transaction) + let infoMessage = self.insertCallInfoMessage(for: message, using: transaction) // Handle UI if let caller = message.sender, let uuid = message.uuid { let call = SessionCall(for: caller, uuid: uuid, mode: .answer) diff --git a/Session/Meta/AudioFiles/ringing.mp3 b/Session/Meta/AudioFiles/ringing.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..547f7133ca264c54265de39cb2b9d982377ac894 GIT binary patch literal 55057 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