From 989257f80219e3f473cc2a11d68aacf5df57d14b Mon Sep 17 00:00:00 2001 From: Benoit Martins Date: Fri, 9 Jun 2023 16:16:08 +0200 Subject: [PATCH] Fix refresh messages received when application switches to background/foreground Fix reloadItem when receive presence notification --- .../ChatConversationTableViewSwift.swift | 59 +++++++++++-------- .../Views/ChatConversationViewSwift.swift | 26 +++++++- 2 files changed, 59 insertions(+), 26 deletions(-) diff --git a/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift b/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift index 2fc32353d..ef2425aaf 100644 --- a/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift +++ b/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift @@ -125,13 +125,19 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour let indexPathsVisible = self.collectionView.indexPathsForVisibleItems if indexPathsVisible.count > 0 { for i in 0...indexPathsVisible.count-1 { - let contact = ChatConversationTableViewModel.sharedModel.getMessage(index: indexPathsVisible[i].row)?.chatMessage?.fromAddress - if (contact != nil){ - let uri = "sip:" + contact!.username + "@" + contact!.domain + let cell = self.collectionView.cellForItem(at: indexPathsVisible[i]) + if cell != nil { + let multilineCell = cell as! MultilineMessageCell + if multilineCell.imageUser.isHidden == false { + let contact = ChatConversationTableViewModel.sharedModel.getMessage(index: indexPathsVisible[i].row)?.chatMessage?.fromAddress + if (contact != nil){ + let uri = "sip:" + contact!.username + "@" + contact!.domain - if(uri == friend as! String){ - let indexPath = indexPathsVisible[i] - collectionView.reloadItems(at: [indexPath]) + if(uri == friend as! String){ + let indexPath = indexPathsVisible[i] + collectionView.reloadItems(at: [indexPath]) + } + } } } } @@ -154,6 +160,12 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour scrollBadge!.text = "0" } + func refreshDataAfterForeground(){ + DispatchQueue.main.async { + self.collectionView.reloadData() + } + } + func refreshData(isOutgoing: Bool){ if (ChatConversationTableViewModel.sharedModel.getNBMessages() > 1){ let isDisplayingBottomOfTable = collectionView.contentOffset.y <= 20 @@ -168,26 +180,25 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour collectionView.reloadData() self.scrollToBottom(animated: true) } else if !isOutgoing { - let selectedCellIndex = collectionView.indexPathsForVisibleItems.sorted().first! - let selectedCell = collectionView.cellForItem(at: selectedCellIndex) - let visibleRect = collectionView.convert(collectionView.bounds, to: selectedCell) - - UIView.performWithoutAnimation { - collectionView.reloadData() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2){ - let newSelectedCell = self.collectionView.cellForItem(at: IndexPath(row: selectedCellIndex.row + 1, section: 0)) - let updatedVisibleRect = self.collectionView.convert(self.collectionView.bounds, to: newSelectedCell) + if !collectionView.indexPathsForVisibleItems.isEmpty { + let selectedCellIndex = collectionView.indexPathsForVisibleItems.sorted().first! + let selectedCell = collectionView.cellForItem(at: selectedCellIndex) + let visibleRect = collectionView.convert(collectionView.bounds, to: selectedCell) + + UIView.performWithoutAnimation { + collectionView.reloadData() + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2){ + let newSelectedCell = self.collectionView.cellForItem(at: IndexPath(row: selectedCellIndex.row + 1, section: 0)) + let updatedVisibleRect = self.collectionView.convert(self.collectionView.bounds, to: newSelectedCell) - var contentOffset = self.collectionView.contentOffset - contentOffset.y = contentOffset.y + (visibleRect.origin.y - updatedVisibleRect.origin.y) - self.collectionView.contentOffset = contentOffset - } + var contentOffset = self.collectionView.contentOffset + contentOffset.y = contentOffset.y + (visibleRect.origin.y - updatedVisibleRect.origin.y) + self.collectionView.contentOffset = contentOffset + } + } + scrollBadge!.isHidden = false + scrollBadge!.text = "\(ChatConversationViewModel.sharedModel.chatRoom?.unreadMessagesCount ?? 0)" } - - - scrollBadge!.isHidden = false - scrollBadge!.text = "\(ChatConversationViewModel.sharedModel.chatRoom?.unreadMessagesCount ?? 0)" - } else { collectionView.reloadData() self.scrollToBottom(animated: false) diff --git a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift b/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift index 873b87ab5..6ee4a7896 100644 --- a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift +++ b/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift @@ -222,6 +222,30 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll self.action2Delete.isEnabled = false } } + + let notificationCenter = NotificationCenter.default + notificationCenter.addObserver(self, selector: #selector(appMovedToForeground), name: UIApplication.willEnterForegroundNotification, object: nil) } + + @objc func appMovedToForeground() { + if(PhoneMainView.instance().currentView == ChatConversationViewSwift.compositeViewDescription()){ + let lc: Core = Core.getSwiftObject(cObject: LinphoneManager.getLc()) + if(lc.globalState.rawValue == LinphoneGlobalOn.rawValue){ + do { + let peerAddress = try Factory.Instance.createAddress(addr: (ChatConversationViewModel.sharedModel.chatRoom?.peerAddress?.asStringUriOnly())!) + let localAddress = try Factory.Instance.createAddress(addr: (ChatConversationViewModel.sharedModel.chatRoom?.localAddress?.asStringUriOnly())!) + if (peerAddress.isValid && localAddress.isValid) { + ChatConversationViewModel.sharedModel.chatRoom = lc.searchChatRoom(params: nil, localAddr: localAddress, remoteAddr: peerAddress, participants: nil) + if (ChatConversationViewModel.sharedModel.chatRoom != nil) { + ChatConversationViewModel.sharedModel.createChatConversation() + PhoneMainView.instance().currentRoom = ChatConversationViewModel.sharedModel.chatRoom?.getCobject + tableControllerSwift.refreshDataAfterForeground() + } + } + }catch{ + + } + } + } } override func viewWillAppear(_ animated: Bool) { @@ -253,8 +277,6 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll messageView.ephemeralIndicator.isHidden = !ChatConversationViewModel.sharedModel.chatRoom!.ephemeralEnabled } - - handlePendingTransferIfAny() configureMessageField() ChatConversationViewModel.sharedModel.shareFile()