From 4db618c7d00452f06dc3e3acbdedaf0f5aeaa11c Mon Sep 17 00:00:00 2001 From: talksik Date: Tue, 28 Dec 2021 23:19:17 -0800 Subject: [PATCH] fixing bug with updating of user status --- nirvana-ios.xcodeproj/project.pbxproj | 20 +++++++++ .../Views/InnerCircle/CircleGridView.swift | 14 +++++- .../Views/InnerCircle/InnerCircleView.swift | 3 +- .../VoiceCall/AgoraViewController.swift | 41 +++++++++++++++++ .../Views/InnerCircle/VoiceCall/AgroRep.swift | 34 ++++++++++++++ .../InnerCircle/VoiceCall/CallView.swift | 45 +++++++++++++++++++ nirvana-ios/Views/Router/RouterView.swift | 36 ++++----------- nirvana-ios/nirvana_iosApp.swift | 20 +++++++++ 8 files changed, 182 insertions(+), 31 deletions(-) create mode 100644 nirvana-ios/Views/InnerCircle/VoiceCall/AgoraViewController.swift create mode 100644 nirvana-ios/Views/InnerCircle/VoiceCall/AgroRep.swift create mode 100644 nirvana-ios/Views/InnerCircle/VoiceCall/CallView.swift diff --git a/nirvana-ios.xcodeproj/project.pbxproj b/nirvana-ios.xcodeproj/project.pbxproj index e900a18..2e27122 100644 --- a/nirvana-ios.xcodeproj/project.pbxproj +++ b/nirvana-ios.xcodeproj/project.pbxproj @@ -9,6 +9,9 @@ /* Begin PBXBuildFile section */ 8904DEC8277055E90071E6CA /* OnboardingOneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8904DEC7277055E90071E6CA /* OnboardingOneView.swift */; }; 890C245D277BF628009B4A30 /* AgoraRtcKit in Frameworks */ = {isa = PBXBuildFile; productRef = 890C245C277BF628009B4A30 /* AgoraRtcKit */; }; + 890C2460277BF896009B4A30 /* AgoraViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 890C245F277BF896009B4A30 /* AgoraViewController.swift */; }; + 890C2462277BF935009B4A30 /* CallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 890C2461277BF935009B4A30 /* CallView.swift */; }; + 890C2464277BFA97009B4A30 /* AgroRep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 890C2463277BFA97009B4A30 /* AgroRep.swift */; }; 891060E4277359B900F14509 /* CloudStorageService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891060E3277359B900F14509 /* CloudStorageService.swift */; }; 891060E82774460500F14509 /* FirebaseInAppMessaging-Beta in Frameworks */ = {isa = PBXBuildFile; productRef = 891060E72774460500F14509 /* FirebaseInAppMessaging-Beta */; }; 891060EA2774460500F14509 /* FirebaseInAppMessagingSwift-Beta in Frameworks */ = {isa = PBXBuildFile; productRef = 891060E92774460500F14509 /* FirebaseInAppMessagingSwift-Beta */; }; @@ -86,6 +89,9 @@ /* Begin PBXFileReference section */ 8904DEC7277055E90071E6CA /* OnboardingOneView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingOneView.swift; sourceTree = ""; }; + 890C245F277BF896009B4A30 /* AgoraViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgoraViewController.swift; sourceTree = ""; }; + 890C2461277BF935009B4A30 /* CallView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallView.swift; sourceTree = ""; }; + 890C2463277BFA97009B4A30 /* AgroRep.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgroRep.swift; sourceTree = ""; }; 891060E3277359B900F14509 /* CloudStorageService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudStorageService.swift; sourceTree = ""; }; 891060E527743FEB00F14509 /* nirvana-ios.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "nirvana-ios.entitlements"; sourceTree = ""; }; 89110713277166D6005797FA /* UserFriends.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFriends.swift; sourceTree = ""; }; @@ -176,6 +182,16 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 890C245E277BF888009B4A30 /* VoiceCall */ = { + isa = PBXGroup; + children = ( + 890C245F277BF896009B4A30 /* AgoraViewController.swift */, + 890C2461277BF935009B4A30 /* CallView.swift */, + 890C2463277BFA97009B4A30 /* AgroRep.swift */, + ); + path = VoiceCall; + sourceTree = ""; + }; 891060E62774460500F14509 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -374,6 +390,7 @@ 89BCABDF276B3588009E9B10 /* InnerCircle */ = { isa = PBXGroup; children = ( + 890C245E277BF888009B4A30 /* VoiceCall */, 89BCABE4276B3D58009E9B10 /* InnerCircleView.swift */, 89BCABE6276B3D64009E9B10 /* InnerCircleViewModel.swift */, 896CE6FD27707E6B00DB474E /* CircleNavigationView.swift */, @@ -560,6 +577,7 @@ 891060E4277359B900F14509 /* CloudStorageService.swift in Sources */, 896CE7002770847400DB474E /* CircleFooterView.swift in Sources */, 894E80BE276ED7A700624B72 /* avatars.swift in Sources */, + 890C2462277BF935009B4A30 /* CallView.swift in Sources */, 896CE7052770AE5D00DB474E /* InboxView.swift in Sources */, 891A160327656FC700B26659 /* HomeView.swift in Sources */, 896CE70927712CED00DB474E /* StringExtension.swift in Sources */, @@ -578,6 +596,7 @@ 89BDCDEF2769B50C00577829 /* ContactsView.swift in Sources */, 891A1611276590B000B26659 /* ChatsCarouselView.swift in Sources */, 89BDCDE527695DB900577829 /* NirvanaImage.swift in Sources */, + 890C2460277BF896009B4A30 /* AgoraViewController.swift in Sources */, 891A16132765A44300B26659 /* ChatsCarouselViewModel.swift in Sources */, 89F05B9B276A87920002E9C7 /* ContactsViewModel.swift in Sources */, 896CE6FE27707E6B00DB474E /* CircleNavigationView.swift in Sources */, @@ -603,6 +622,7 @@ 89F18AF5276ECF2A00115B1E /* AddBasicInfoView.swift in Sources */, 89BCABF0276D53C4009E9B10 /* PhoneVerificationViewModel.swift in Sources */, 89BDCDE72769616600577829 /* UIImage+Extension.swift in Sources */, + 890C2464277BFA97009B4A30 /* AgroRep.swift in Sources */, 89F1386D2767EB19006680ED /* SignInView.swift in Sources */, 89BDCDF12769E64200577829 /* Message.swift in Sources */, 891A160E27657CEA00B26659 /* User.swift in Sources */, diff --git a/nirvana-ios/Views/InnerCircle/CircleGridView.swift b/nirvana-ios/Views/InnerCircle/CircleGridView.swift index 12de40b..18c1c9c 100644 --- a/nirvana-ios/Views/InnerCircle/CircleGridView.swift +++ b/nirvana-ios/Views/InnerCircle/CircleGridView.swift @@ -17,6 +17,8 @@ struct CircleGridView: View { @State var queuePlayer = AVQueuePlayer() @State var timeObserverToken: Any? + @State private var showCall: Bool = false + @GestureState var dragState = DragState.inactive let universalSize = UIScreen.main.bounds @@ -209,7 +211,7 @@ struct CircleGridView: View { message: Text(self.alertSubtext), primaryButton: .destructive(Text("Reject"), action: { // create user friend but a rejected one - if self.authSessionStore.friendsArr.count < 10 { + if self.authSessionStore.friendsArr.count < 10 || self.authSessionStore.user?.phoneNumber == "+19499230445" { self.innerCircleVM.activateOrDeactiveInboxUser(activate: false, userId: self.authSessionStore.user!.id!, friendId: inboxUserId) { res in print(res) } @@ -266,6 +268,9 @@ struct CircleGridView: View { } } } // scrollview reader + .fullScreenCover(isPresented: $showCall, content: { + CallView() + }) } @@ -379,6 +384,13 @@ extension CircleGridView { private func handleTap(gridItemIndex: Int, friendId: String) { // TODO: if there is a message, then listen to it // then after that, check if friend is online, and if so, then connect with him/her if they are free/not in another call + // TESTING CALL + let testingCall = false + if testingCall { + self.showCall.toggle() + return + } + print("tap gesture activated") // clearing the player to make room for this friend's convo or to deselect this user diff --git a/nirvana-ios/Views/InnerCircle/InnerCircleView.swift b/nirvana-ios/Views/InnerCircle/InnerCircleView.swift index a8b9767..fb3d98d 100644 --- a/nirvana-ios/Views/InnerCircle/InnerCircleView.swift +++ b/nirvana-ios/Views/InnerCircle/InnerCircleView.swift @@ -11,8 +11,7 @@ import NavigationStack struct InnerCircleView: View { @StateObject var innerCircleVM: InnerCircleViewModel = InnerCircleViewModel() @EnvironmentObject var authSessionStore: AuthSessionStore - @EnvironmentObject var navigationStack: NavigationStack - + @EnvironmentObject var navigationStack: NavigationStack @State var selectedFriendIndex: String? = nil diff --git a/nirvana-ios/Views/InnerCircle/VoiceCall/AgoraViewController.swift b/nirvana-ios/Views/InnerCircle/VoiceCall/AgoraViewController.swift new file mode 100644 index 0000000..ecfaadb --- /dev/null +++ b/nirvana-ios/Views/InnerCircle/VoiceCall/AgoraViewController.swift @@ -0,0 +1,41 @@ +// +// AgoraViewController.swift +// nirvana-ios +// +// Created by Arjun Patel on 12/28/21. +// + +import Foundation +import AgoraRtcKit + +class AgoraViewController: UIViewController { + var agoraKit: AgoraRtcEngineKit? + var agoraDelegate: AgoraRtcEngineDelegate? + + override func viewDidLoad() { + super.viewDidLoad() + initializeAgoraEngine() + joinChannel() + } + + func initializeAgoraEngine() { + agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: "c8dfd65deb5c4741bd564085627139d0", delegate: agoraDelegate) + } + + func joinChannel() { + agoraKit?.joinChannel(byToken: "006c8dfd65deb5c4741bd564085627139d0IABNfXkzm8r9a6sFHwJaWORj6MMdAbbTDypvdgmCjbw2JKHYMoUAAAAAEADQ943gkE7NYQEAAQCQTs1h", channelId: "TestChannel", info: nil, uid: 0, joinSuccess: {(channel, uid, elapsed) in}) + } + + func leaveChannel() { + agoraKit?.leaveChannel(nil) + } + + func destroyInstance() { + AgoraRtcEngineKit.destroy() + } + + override func viewWillDisappear(_ animated: Bool) { + leaveChannel() + destroyInstance() + } +} diff --git a/nirvana-ios/Views/InnerCircle/VoiceCall/AgroRep.swift b/nirvana-ios/Views/InnerCircle/VoiceCall/AgroRep.swift new file mode 100644 index 0000000..b377c6f --- /dev/null +++ b/nirvana-ios/Views/InnerCircle/VoiceCall/AgroRep.swift @@ -0,0 +1,34 @@ +// +// AgroRep.swift +// nirvana-ios +// +// Created by Arjun Patel on 12/28/21. +// + +import Foundation +import SwiftUI +import AgoraRtcKit + +struct AgoraRep: UIViewControllerRepresentable { + + func makeUIViewController(context: Context) -> some UIViewController { + let agoraViewController = AgoraViewController() + agoraViewController.agoraDelegate = context.coordinator + return agoraViewController + } + + func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { + + } + + class Coordinator: NSObject, AgoraRtcEngineDelegate { + var parent: AgoraRep + init(_ agoraRep: AgoraRep) { + parent = agoraRep + } + } + + func makeCoordinator() -> Coordinator { + return Coordinator(self) + } +} diff --git a/nirvana-ios/Views/InnerCircle/VoiceCall/CallView.swift b/nirvana-ios/Views/InnerCircle/VoiceCall/CallView.swift new file mode 100644 index 0000000..7b9e863 --- /dev/null +++ b/nirvana-ios/Views/InnerCircle/VoiceCall/CallView.swift @@ -0,0 +1,45 @@ +// +// CallView.swift +// nirvana-ios +// +// Created by Arjun Patel on 12/28/21. +// + +import SwiftUI + +struct CallView: View { + @Environment(\.presentationMode) var presentationMode + + var body: some View { + VStack { + Text("Welcome to the call!") + .bold() + Spacer() + HStack { + Image(systemName: "mic.circle.fill") + .font(.system(size:64.0)) + .foregroundColor(.blue) + .padding() + Spacer() + Image(systemName: "phone.circle.fill") + .font(.system(size:64.0)) + .foregroundColor(.red) + .padding() + .onTapGesture { + presentationMode.wrappedValue.dismiss() + } + } + + AgoraRep() + .frame(width: 0, height: 0, alignment: .center) + + .padding() + } + } +} + +struct CallView_Previews: PreviewProvider { + static var previews: some View { + CallView() + } +} diff --git a/nirvana-ios/Views/Router/RouterView.swift b/nirvana-ios/Views/Router/RouterView.swift index 6c25859..fd56c69 100644 --- a/nirvana-ios/Views/Router/RouterView.swift +++ b/nirvana-ios/Views/Router/RouterView.swift @@ -19,36 +19,16 @@ enum NavigationPages { struct RouterView: View { @EnvironmentObject var authSessionStore: AuthSessionStore @EnvironmentObject var navigationStack: NavigationStack - @Environment(\.scenePhase) var scenePhase var body: some View { - ZStack { - switch self.authSessionStore.sessionState { - case SessionState.notCheckedYet: - SplashView() - case SessionState.isAuthenticated: - InnerCircleView() - case SessionState.isLoggedOut: - WelcomeView() - } - } - .onChange(of: scenePhase) { newPhase in - if newPhase == .inactive { - print("user is offline") - // set firestore user document isOnline to false - self.authSessionStore.updateUserStatus(userStatus: .offline) - } else if newPhase == .active { - print("user is online again") - // set firestore user document isOnline to true - self.authSessionStore.updateUserStatus(userStatus: .online) - } else if newPhase == .background { - // TODO: find a way to do this in the background so that people can call me and start talking even if it's in the background - // but this may just not be possible, only with an actual call so to speak - print("app is in backgroun") - self.authSessionStore.updateUserStatus(userStatus: .background) - } - } - + switch self.authSessionStore.sessionState { + case SessionState.notCheckedYet: + SplashView() + case SessionState.isAuthenticated: + InnerCircleView() + case SessionState.isLoggedOut: + WelcomeView() + } } } diff --git a/nirvana-ios/nirvana_iosApp.swift b/nirvana-ios/nirvana_iosApp.swift index 2b63f8f..9bc202b 100644 --- a/nirvana-ios/nirvana_iosApp.swift +++ b/nirvana-ios/nirvana_iosApp.swift @@ -13,6 +13,7 @@ import FirebaseMessaging @main struct nirvana_iosApp: App { @StateObject var authSessionStore: AuthSessionStore = AuthSessionStore() + @Environment(\.scenePhase) var scenePhase @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { @@ -24,6 +25,25 @@ struct nirvana_iosApp: App { Auth.auth().canHandle(url) // <- just for information purposes } } + .onChange(of: scenePhase) { newPhase in + switch newPhase { + case .inactive: + print("user is offline") + // set firestore user document isOnline to false + self.authSessionStore.updateUserStatus(userStatus: .offline) + case .active: + print("user is online again") + // set firestore user document isOnline to true + self.authSessionStore.updateUserStatus(userStatus: .online) + case .background: + // TODO: find a way to do this in the background so that people can call me and start talking even if it's in the background + // but this may just not be possible, only with an actual call so to speak + print("app is in backgroun") + self.authSessionStore.updateUserStatus(userStatus: .background) + default: + print("default state of app") + } + } } }