From 0bc9aa977c6d87213301d09678a151bdc6811746 Mon Sep 17 00:00:00 2001 From: "benoit.martins" Date: Tue, 4 Feb 2025 17:47:02 +0100 Subject: [PATCH] Fix displayed chat room reset --- Linphone/Core/CoreContext.swift | 1 - Linphone/UI/Main/ContentView.swift | 1 - .../Fragments/ChatBubbleView.swift | 6 +- .../Fragments/ConversationFragment.swift | 10 ++- .../Fragments/ConversationsListFragment.swift | 26 ++---- .../ViewModel/ConversationViewModel.swift | 88 ++++++++++++++----- .../ConversationsListViewModel.swift | 14 ++- 7 files changed, 89 insertions(+), 57 deletions(-) diff --git a/Linphone/Core/CoreContext.swift b/Linphone/Core/CoreContext.swift index 5731daf4c..021cb3bf3 100644 --- a/Linphone/Core/CoreContext.swift +++ b/Linphone/Core/CoreContext.swift @@ -42,7 +42,6 @@ final class CoreContext: ObservableObject { @Published var loggingInProgress: Bool = false @Published var coreIsStarted: Bool = false @Published var accounts: [AccountModel] = [] - @Published var enteredForeground = false @Published var shortcuts: [ShortcutModel] = [] private var mCore: Core! private var mIterateSuscription: AnyCancellable? diff --git a/Linphone/UI/Main/ContentView.swift b/Linphone/UI/Main/ContentView.swift index f89800258..534b6f9b9 100644 --- a/Linphone/UI/Main/ContentView.swift +++ b/Linphone/UI/Main/ContentView.swift @@ -1378,7 +1378,6 @@ struct ContentView: View { orientation = newOrientation } .onChange(of: scenePhase) { newPhase in - CoreContext.shared.enteredForeground = newPhase == .active orientation = UIDevice.current.orientation if newPhase == .active { conversationsListViewModel.computeChatRoomsList(filter: "") diff --git a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift index e4fbb984f..717aefad6 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift @@ -374,10 +374,8 @@ struct ChatBubbleView: View { } } .onTapGesture { - if !CoreContext.shared.enteredForeground { - conversationViewModel.selectedMessageToDisplayDetails = eventLogMessage - conversationViewModel.prepareBottomSheetForDeliveryStatus() - } + conversationViewModel.selectedMessageToDisplayDetails = eventLogMessage + conversationViewModel.prepareBottomSheetForDeliveryStatus() } .disabled(conversationViewModel.selectedMessage != nil) .padding(.top, -4) diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift index d63a78dff..792da3ed0 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift @@ -24,6 +24,7 @@ import UniformTypeIdentifiers // swiftlint:disable type_body_length struct ConversationFragment: View { + @Environment(\.scenePhase) var scenePhase @State private var orientation = UIDevice.current.orientation private var idiom: UIUserInterfaceIdiom { UIDevice.current.userInterfaceIdiom } @@ -162,6 +163,11 @@ struct ConversationFragment: View { .background(Color.gray100.ignoresSafeArea(.keyboard)) } } + .onChange(of: scenePhase) { newPhase in + if newPhase == .active { + conversationViewModel.resetDisplayedChatRoom() + } + } } .navigationViewStyle(.stack) } @@ -662,7 +668,7 @@ struct ConversationFragment: View { .focused($isMessageTextFocused) .padding(.vertical, 5) .onChange(of: conversationViewModel.messageText) { text in - if !text.isEmpty && !CoreContext.shared.enteredForeground { + if !text.isEmpty { conversationViewModel.compose() } } @@ -675,7 +681,7 @@ struct ConversationFragment: View { .default_text_style(styleSize: 15) .focused($isMessageTextFocused) .onChange(of: conversationViewModel.messageText) { text in - if !text.isEmpty && !CoreContext.shared.enteredForeground { + if !text.isEmpty { conversationViewModel.compose() } } diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift index ba4c4c72b..1ba0e7095 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift @@ -71,6 +71,14 @@ struct ConversationsListFragment: View { } .navigationTitle("") .navigationBarHidden(true) + .onChange(of: scenePhase) { newPhase in + if newPhase == .active { + if navigationManager.peerAddr != nil { + conversationViewModel.getChatRoomWithStringAddress(conversationsList: conversationsListViewModel.conversationsList, stringAddr: navigationManager.peerAddr!) + navigationManager.peerAddr = nil + } + } + } } } @@ -85,8 +93,6 @@ struct ConversationRow: View { @Binding var text: String var body: some View { - let pub = NotificationCenter.default - .publisher(for: NSNotification.Name("ChatRoomsComputed")) HStack { Avatar(contactAvatarModel: conversation.avatarModel, avatarSize: 50) @@ -189,22 +195,6 @@ struct ConversationRow: View { .listRowInsets(EdgeInsets(top: 6, leading: 20, bottom: 6, trailing: 20)) .listRowSeparator(.hidden) .background(.white) - .onReceive(pub) { _ in - if CoreContext.shared.enteredForeground && conversationViewModel.displayedConversation != nil - && (navigationManager.peerAddr == nil || navigationManager.peerAddr == conversationViewModel.displayedConversation!.remoteSipUri) { - if conversationViewModel.displayedConversation != nil { - conversationViewModel.resetDisplayedChatRoom(conversationsList: conversationsListViewModel.conversationsList) - } - } - - CoreContext.shared.enteredForeground = false - - if navigationManager.peerAddr != nil - && conversation.remoteSipUri.contains(navigationManager.peerAddr!) { - conversationViewModel.getChatRoomWithStringAddress(conversationsList: conversationsListViewModel.conversationsList, stringAddr: navigationManager.peerAddr!) - navigationManager.peerAddr = nil - } - } .onTapGesture { conversationViewModel.changeDisplayedChatRoom(conversationModel: conversation) } diff --git a/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift b/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift index bc8d7f756..92f5d9f9b 100644 --- a/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift +++ b/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift @@ -165,6 +165,46 @@ class ConversationViewModel: ObservableObject { } } + func addConversationDelegate(chatRoom: 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]) + }, onParticipantAdded: { (_: ChatRoom, eventLogs: EventLog) in + self.getNewMessages(eventLogs: [eventLogs]) + self.getParticipantConversationModel() + }, onParticipantRemoved: { (_: ChatRoom, eventLogs: EventLog) in + self.getNewMessages(eventLogs: [eventLogs]) + self.getParticipantConversationModel() + }, onParticipantAdminStatusChanged: { (_: ChatRoom, eventLogs: EventLog) in + self.getNewMessages(eventLogs: [eventLogs]) + self.getParticipantConversationModel() + }, onSubjectChanged: { (_: ChatRoom, eventLogs: EventLog) in + self.getNewMessages(eventLogs: [eventLogs]) + }, onConferenceJoined: {(_: ChatRoom, eventLog: EventLog) in + self.getNewMessages(eventLogs: [eventLog]) + if self.displayedConversation != nil { + DispatchQueue.main.async { + self.displayedConversation!.isReadOnly = false + } + } + }, onConferenceLeft: {(_: ChatRoom, eventLog: EventLog) in + self.getNewMessages(eventLogs: [eventLog]) + if self.displayedConversation != nil { + DispatchQueue.main.async { + self.displayedConversation!.isReadOnly = true + } + } + }, onEphemeralEvent: {(_: ChatRoom, eventLogs: EventLog) in + self.getNewMessages(eventLogs: [eventLogs]) + }, onEphemeralMessageDeleted: {(_: ChatRoom, eventLog: EventLog) in + self.removeMessage(eventLog) + }) + self.chatRoomDelegateHolder = ChatRoomDelegateHolder(chatroom: chatRoom, delegate: chatRoomDelegate) + } + func addChatMessageDelegate(message: ChatMessage) { if self.displayedConversation != nil { var statusTmp: Message.Status? = .sending @@ -1740,35 +1780,37 @@ class ConversationViewModel: ObservableObject { withAnimation { self.displayedConversation = conversationModel } - self.addConversationDelegate() + + CoreContext.shared.doOnCoreQueue { core in + let nilParams: ConferenceParams? = nil + if let newChatRoom = core.searchChatRoom(params: nilParams, localAddr: nil, remoteAddr: conversationModel.chatRoom.peerAddress, participants: nil) { + self.addConversationDelegate(chatRoom: newChatRoom) + } + } + self.getMessages() } - func resetDisplayedChatRoom(conversationsList: [ConversationModel]) { - guard !conversationsList.isEmpty else { - Log.info("\(ConversationViewModel.TAG) The conversation list is empty.") - return - } - + func resetDisplayedChatRoom() { if !self.conversationMessagesSection.isEmpty && !self.conversationMessagesSection[0].rows.isEmpty { if let displayedConversation = self.displayedConversation { - conversationsList.forEach { conversation in - if conversation.id == displayedConversation.id { - self.displayedConversation = conversation - self.computeComposingLabel() - - if let updatedDisplayedConversation = self.displayedConversation { - CoreContext.shared.doOnCoreQueue { _ in - let historyEventsSizeTmp = updatedDisplayedConversation.chatRoom.historyEventsSize - if self.displayedConversationHistorySize < historyEventsSizeTmp { - let eventLogList = updatedDisplayedConversation.chatRoom.getHistoryRangeEvents(begin: 0, end: historyEventsSizeTmp - self.displayedConversationHistorySize) - - if !eventLogList.isEmpty { - self.getNewMessages(eventLogs: eventLogList) - } - } + CoreContext.shared.doOnCoreQueue { core in + let nilParams: ConferenceParams? = nil + if let newChatRoom = core.searchChatRoom(params: nilParams, localAddr: nil, remoteAddr: displayedConversation.chatRoom.peerAddress, participants: nil) { + if LinphoneUtils.getChatRoomId(room: newChatRoom) == displayedConversation.id { + self.addConversationDelegate(chatRoom: newChatRoom) + let conversation = ConversationModel(chatRoom: newChatRoom) + DispatchQueue.main.async { + self.displayedConversation = conversation + } + self.computeComposingLabel() + let historyEventsSizeTmp = newChatRoom.historyEventsSize + if self.displayedConversationHistorySize < historyEventsSizeTmp { + let eventLogList = newChatRoom.getHistoryRangeEvents(begin: 0, end: historyEventsSizeTmp - self.displayedConversationHistorySize) - self.addConversationDelegate() + if !eventLogList.isEmpty { + self.getNewMessages(eventLogs: eventLogList) + } } } } diff --git a/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift b/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift index 88566a7bd..64d5f4ca1 100644 --- a/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift +++ b/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift @@ -61,11 +61,6 @@ class ConversationsListViewModel: ObservableObject { } } - DispatchQueue.main.async { - //self.conversationsList = self.conversationsListTmp - NotificationCenter.default.post(name: NSNotification.Name("ChatRoomsComputed"), object: nil) - } - self.updateUnreadMessagesCount() } } @@ -132,7 +127,8 @@ class ConversationsListViewModel: ObservableObject { coreContext.doOnCoreQueue { core in self.coreConversationDelegate = CoreDelegateStub(onMessagesReceived: { (_: Core, chatRoom: ChatRoom, _: [ChatMessage]) in let model = ConversationModel(chatRoom: chatRoom) - let index = self.conversationsList.firstIndex(where: { $0.chatRoom === chatRoom }) + let idTmp = LinphoneUtils.getChatRoomId(room: chatRoom) + let index = self.conversationsList.firstIndex(where: { $0.id == idTmp }) DispatchQueue.main.async { if index != nil { self.conversationsList.remove(at: index!) @@ -142,7 +138,8 @@ class ConversationsListViewModel: ObservableObject { self.updateUnreadMessagesCount() }, onMessageSent: { (_: Core, chatRoom: ChatRoom, _: ChatMessage) in let model = ConversationModel(chatRoom: chatRoom) - let index = self.conversationsList.firstIndex(where: { $0.chatRoom === chatRoom }) + let idTmp = LinphoneUtils.getChatRoomId(room: chatRoom) + let index = self.conversationsList.firstIndex(where: { $0.id == idTmp }) DispatchQueue.main.async { if index != nil { self.conversationsList.remove(at: index!) @@ -152,7 +149,8 @@ class ConversationsListViewModel: ObservableObject { self.updateUnreadMessagesCount() }, onChatRoomRead: { (_: Core, chatRoom: ChatRoom) in let model = ConversationModel(chatRoom: chatRoom) - let index = self.conversationsList.firstIndex(where: { $0.chatRoom === chatRoom }) + let idTmp = LinphoneUtils.getChatRoomId(room: chatRoom) + let index = self.conversationsList.firstIndex(where: { $0.id == idTmp }) DispatchQueue.main.async { if index != nil { self.conversationsList.remove(at: index!)