From be09800b5a2dc63872b6f248d66da7a928634cf1 Mon Sep 17 00:00:00 2001 From: QuentinArguillere Date: Thu, 3 Oct 2024 12:19:16 +0200 Subject: [PATCH] Move (almost) all chatroom delegate management into changeDisplayedChatRoom --- Linphone/UI/Call/CallView.swift | 34 +------- Linphone/UI/Main/ContentView.swift | 12 +-- .../ConversationForwardMessageFragment.swift | 13 +--- .../Fragments/ConversationFragment.swift | 8 +- .../Fragments/ConversationsListFragment.swift | 20 +---- .../Fragments/StartConversationFragment.swift | 12 +-- .../ViewModel/ConversationViewModel.swift | 77 ++++++++++--------- 7 files changed, 58 insertions(+), 118 deletions(-) diff --git a/Linphone/UI/Call/CallView.swift b/Linphone/UI/Call/CallView.swift index 395919d31..d0e46d4b6 100644 --- a/Linphone/UI/Call/CallView.swift +++ b/Linphone/UI/Call/CallView.swift @@ -205,7 +205,7 @@ struct CallView: View { .zIndex(4) .transition(.move(edge: .bottom)) .onDisappear { - conversationViewModel.removeConversationDelegate() + conversationViewModel.displayedConversation = nil isShowConversationFragment = false } } @@ -2198,21 +2198,7 @@ struct CallView: View { .frame(width: 32, height: 32, alignment: .center) .onDisappear { if callViewModel.isOneOneCall && callViewModel.displayedConversation != nil { - if conversationViewModel.displayedConversation != nil { - conversationViewModel.removeConversationDelegate() - conversationViewModel.resetMessage() - conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!) - - conversationViewModel.getMessages() - withAnimation { - isShowConversationFragment = true - } - } else { - conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!) - withAnimation { - isShowConversationFragment = true - } - } + conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!) } } } @@ -2581,21 +2567,7 @@ struct CallView: View { .frame(width: 32, height: 32, alignment: .center) .onDisappear { if callViewModel.isOneOneCall && callViewModel.displayedConversation != nil { - if conversationViewModel.displayedConversation != nil { - conversationViewModel.removeConversationDelegate() - conversationViewModel.resetMessage() - conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!) - - conversationViewModel.getMessages() - withAnimation { - isShowConversationFragment = true - } - } else { - conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!) - withAnimation { - isShowConversationFragment = true - } - } + conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!) } } } diff --git a/Linphone/UI/Main/ContentView.swift b/Linphone/UI/Main/ContentView.swift index 81347cdea..4e147f5fc 100644 --- a/Linphone/UI/Main/ContentView.swift +++ b/Linphone/UI/Main/ContentView.swift @@ -129,7 +129,7 @@ struct ContentView: View { Button(action: { self.index = 0 historyViewModel.displayedCall = nil - conversationViewModel.removeConversationDelegate() + conversationViewModel.displayedConversation = nil meetingViewModel.displayedMeeting = nil }, label: { VStack { @@ -174,7 +174,7 @@ struct ContentView: View { Button(action: { self.index = 1 contactViewModel.indexDisplayedFriend = nil - conversationViewModel.removeConversationDelegate() + conversationViewModel.displayedConversation = nil meetingViewModel.displayedMeeting = nil if historyListViewModel.missedCallsCount > 0 { historyListViewModel.resetMissedCallsCount() @@ -250,7 +250,7 @@ struct ContentView: View { self.index = 3 contactViewModel.indexDisplayedFriend = nil historyViewModel.displayedCall = nil - conversationViewModel.removeConversationDelegate() + conversationViewModel.displayedConversation = nil }, label: { VStack { Image("video-conference") @@ -658,7 +658,7 @@ struct ContentView: View { Button(action: { self.index = 0 historyViewModel.displayedCall = nil - conversationViewModel.removeConversationDelegate() + conversationViewModel.displayedConversation = nil meetingViewModel.displayedMeeting = nil }, label: { VStack { @@ -705,7 +705,7 @@ struct ContentView: View { Button(action: { self.index = 1 contactViewModel.indexDisplayedFriend = nil - conversationViewModel.removeConversationDelegate() + conversationViewModel.displayedConversation = nil meetingViewModel.displayedMeeting = nil if historyListViewModel.missedCallsCount > 0 { historyListViewModel.resetMissedCallsCount() @@ -784,7 +784,7 @@ struct ContentView: View { self.index = 3 contactViewModel.indexDisplayedFriend = nil historyViewModel.displayedCall = nil - conversationViewModel.removeConversationDelegate() + conversationViewModel.displayedConversation = nil }, label: { VStack { Image("video-conference") diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift index d1830ea5f..5f3028247 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift @@ -211,20 +211,11 @@ struct ConversationForwardMessageFragment: View { if conversationForwardMessageViewModel.displayedConversation != nil { if conversationViewModel.displayedConversation != nil { - conversationViewModel.removeConversationDelegate() DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - conversationViewModel.selectedMessage = nil - conversationViewModel.resetMessage() - withAnimation { - self.conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationForwardMessageViewModel.displayedConversation!) - } - conversationViewModel.getMessages() - } - } else { - conversationViewModel.selectedMessage = nil - withAnimation { self.conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationForwardMessageViewModel.displayedConversation!) } + } else { + self.conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationForwardMessageViewModel.displayedConversation!) } } } diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift index 45fc441e4..6e3c299a1 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift @@ -68,9 +68,6 @@ struct ConversationFragment: View { .onRotate { newOrientation in orientation = newOrientation } - .onAppear { - conversationViewModel.addConversationDelegate() - } .onDisappear { conversationViewModel.removeConversationDelegate() } @@ -111,9 +108,6 @@ struct ConversationFragment: View { .onRotate { newOrientation in orientation = newOrientation } - .onAppear { - conversationViewModel.addConversationDelegate() - } .onDisappear { conversationViewModel.removeConversationDelegate() } @@ -178,7 +172,7 @@ struct ConversationFragment: View { if isShowConversationFragment { isShowConversationFragment = false } - conversationViewModel.removeConversationDelegate() + conversationViewModel.displayedConversation = nil } } } diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift index af2ab8f36..f8c48da1d 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift @@ -152,29 +152,15 @@ struct ConversationsListFragment: View { enteredForeground = false - if navigationManager.peerAddr != nil && conversationsListViewModel.conversationsList[index].remoteSipUri.contains(navigationManager.peerAddr!) { + if navigationManager.peerAddr != nil + && conversationsListViewModel.conversationsList[index].remoteSipUri.contains(navigationManager.peerAddr!) { conversationViewModel.getChatRoomWithStringAddress(conversationsList: conversationsListViewModel.conversationsList, stringAddr: navigationManager.peerAddr!) navigationManager.peerAddr = nil } } .onTapGesture { if index < conversationsListViewModel.conversationsList.count { - if conversationViewModel.displayedConversation != nil { - conversationViewModel.removeConversationDelegate() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - conversationViewModel.selectedMessage = nil - conversationViewModel.resetMessage() - withAnimation { - conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationsListViewModel.conversationsList[index]) - } - conversationViewModel.getMessages() - } - } else { - conversationViewModel.selectedMessage = nil - withAnimation { - conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationsListViewModel.conversationsList[index]) - } - } + conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationsListViewModel.conversationsList[index]) } } .onLongPressGesture(minimumDuration: 0.2) { diff --git a/Linphone/UI/Main/Conversations/Fragments/StartConversationFragment.swift b/Linphone/UI/Main/Conversations/Fragments/StartConversationFragment.swift index b39a496ac..c7d37a931 100644 --- a/Linphone/UI/Main/Conversations/Fragments/StartConversationFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/StartConversationFragment.swift @@ -238,17 +238,7 @@ struct StartConversationFragment: View { isShowStartConversationFragment = false if startConversationViewModel.displayedConversation != nil { - if self.conversationViewModel.displayedConversation != nil { - self.conversationViewModel.removeConversationDelegate() - self.conversationViewModel.resetMessage() - self.conversationViewModel.changeDisplayedChatRoom(conversationModel: startConversationViewModel.displayedConversation!) - - self.conversationViewModel.getMessages() - } else { - withAnimation { - self.conversationViewModel.changeDisplayedChatRoom(conversationModel: startConversationViewModel.displayedConversation!) - } - } + self.conversationViewModel.changeDisplayedChatRoom(conversationModel: startConversationViewModel.displayedConversation!) startConversationViewModel.displayedConversation = nil } diff --git a/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift b/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift index a37a3d0ca..d02859592 100644 --- a/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift +++ b/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift @@ -37,22 +37,34 @@ class ConversationViewModel: ObservableObject { @Published var messageText: String = "" @Published var composingLabel: String = "" - private var chatRoomDelegate: ChatRoomDelegate? + // Used to keep track of a ChatRoom callback without having to worry about life cycle + // Init will add the delegate, deinit will remove it + class ChatRoomDelegateHolder { + var chatRoom: ChatRoom + var chatRoomDelegate: ChatRoomDelegate + init (chatroom: ChatRoom, delegate: ChatRoomDelegate) { + chatroom.addDelegate(delegate: delegate) + self.chatRoom = chatroom + self.chatRoomDelegate = delegate + } + deinit { + self.chatRoom.removeDelegate(delegate: chatRoomDelegate) + } + } + private var chatRoomDelegateHolder: ChatRoomDelegateHolder? // Used to keep track of a ChatMessage callback without having to worry about life cycle // Init will add the delegate, deinit will remove it class ChatMessageDelegateHolder { var chatMessage: ChatMessage var chatMessageDelegate: ChatMessageDelegate - init (message: ChatMessage, delegate: ChatMessageDelegate) { message.addDelegate(delegate: delegate) - chatMessage = message - chatMessageDelegate = delegate + self.chatMessage = message + self.chatMessageDelegate = delegate } - deinit { - chatMessage.removeDelegate(delegate: chatMessageDelegate) + self.chatMessage.removeDelegate(delegate: chatMessageDelegate) } } @@ -95,15 +107,15 @@ class ConversationViewModel: ObservableObject { func addConversationDelegate() { coreContext.doOnCoreQueue { _ in - if self.displayedConversation != nil { - self.chatRoomDelegate = ChatRoomDelegateStub( onIsComposingReceived: { (_: ChatRoom, _: Address, _: Bool) in + if let chatroom = self.displayedConversation?.chatRoom { + let chatRoomDelegate = ChatRoomDelegateStub( onIsComposingReceived: { (_: ChatRoom, _: Address, _: Bool) in self.computeComposingLabel() }, onChatMessagesReceived: { (_: ChatRoom, eventLogs: [EventLog]) in self.getNewMessages(eventLogs: eventLogs) }, onChatMessageSending: { (_: ChatRoom, eventLog: EventLog) in self.getNewMessages(eventLogs: [eventLog]) }) - self.displayedConversation?.chatRoom.addDelegate(delegate: self.chatRoomDelegate!) + self.chatRoomDelegateHolder = ChatRoomDelegateHolder(chatroom: chatroom, delegate: chatRoomDelegate) } } } @@ -198,14 +210,10 @@ class ConversationViewModel: ObservableObject { } func removeConversationDelegate() { - if let crDelegate = self.chatRoomDelegate { - if self.displayedConversation != nil { - self.displayedConversation!.chatRoom.removeDelegate(delegate: crDelegate) - } + coreContext.doOnCoreQueue { _ in + self.chatRoomDelegateHolder = nil + self.chatMessageDelegateHolders.removeAll() } - self.chatRoomDelegate = nil - self.chatMessageDelegateHolders.removeAll() - self.displayedConversation = nil } func getHistorySize() { @@ -283,7 +291,7 @@ class ConversationViewModel: ObservableObject { } } - func getMessages() { + func getMessages() { self.getHistorySize() self.getUnreadMessagesCount() self.getParticipantConversationModel() @@ -1376,7 +1384,14 @@ class ConversationViewModel: ObservableObject { } func changeDisplayedChatRoom(conversationModel: ConversationModel) { - self.displayedConversation = conversationModel + self.selectedMessage = nil + self.resetMessage() + self.removeConversationDelegate() + withAnimation { + self.displayedConversation = conversationModel + } + self.addConversationDelegate() + self.getMessages() } func resetDisplayedChatRoom(conversationsList: [ConversationModel]) { @@ -1792,28 +1807,20 @@ class ConversationViewModel: ObservableObject { do { let stringAddrCleaned = stringAddr.components(separatedBy: ";gr=") let address = try Factory.Instance.createAddress(addr: stringAddrCleaned[0]) - if let dispChatRoom = conversationsList.first(where: {$0.chatRoom.peerAddress != nil && $0.chatRoom.peerAddress!.equal(address2: address)}) { - if self.displayedConversation != nil { - if dispChatRoom.id != self.displayedConversation!.id { - DispatchQueue.main.async { - self.removeConversationDelegate() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - self.selectedMessage = nil - self.resetMessage() - self.changeDisplayedChatRoom(conversationModel: dispChatRoom) - self.getMessages() - } - } - } - } else { - DispatchQueue.main.async { - self.selectedMessage = nil + if let dispChatRoom = conversationsList.first(where: {$0.chatRoom.peerAddress != nil && $0.chatRoom.peerAddress!.equal(address2: address)}) { + if self.displayedConversation != nil { + if dispChatRoom.id != self.displayedConversation!.id { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.changeDisplayedChatRoom(conversationModel: dispChatRoom) } } + } else { + DispatchQueue.main.async { + self.changeDisplayedChatRoom(conversationModel: dispChatRoom) + } } + } } catch { - } } }