瀏覽代碼

Merge pull request #1364 from deltachat/update_chat_profile_on_messages_changed

Update chat profile on dc core events
cyBerta 3 年之前
父節點
當前提交
399b65a9ea

+ 3 - 1
DcCore/DcCore/DC/events.swift

@@ -146,7 +146,9 @@ public class DcEventHandler {
                 nc.post(
                     name: dcEphemeralTimerModified,
                     object: nil,
-                    userInfo: nil
+                    userInfo: [
+                        "chat_id": Int(data1),
+                    ]
                 )
             }
 

+ 50 - 0
deltachat-ios/Controller/ContactDetailViewController.swift

@@ -95,6 +95,9 @@ class ContactDetailViewController: UITableViewController {
         return cell
     }()
 
+    private var incomingMsgsObserver: NSObjectProtocol?
+    private var contactChangedObserver: NSObjectProtocol?
+
     init(dcContext: DcContext, contactId: Int) {
         self.viewModel = ContactDetailViewModel(dcContext: dcContext, contactId: contactId)
         super.init(style: .grouped)
@@ -120,11 +123,17 @@ class ContactDetailViewController: UITableViewController {
 
     override func viewWillAppear(_ animated: Bool) {
         super.viewWillAppear(animated)
+        setupObservers()
         updateHeader() // maybe contact name has been edited
         updateCellValues()
         tableView.reloadData()
     }
 
+    override func viewWillDisappear(_ animated: Bool) {
+        super.viewWillDisappear(animated)
+        removeObservers()
+    }
+
     // MARK: - setup and configuration
     private func configureTableView() {
         tableView.register(ActionCell.self, forCellReuseIdentifier: ActionCell.reuseIdentifier)
@@ -222,6 +231,47 @@ class ContactDetailViewController: UITableViewController {
         return viewModel.titleFor(section: section)
     }
 
+    // MARK: - observers
+    private func setupObservers() {
+        let nc = NotificationCenter.default
+        contactChangedObserver = nc.addObserver(
+            forName: dcNotificationContactChanged,
+            object: nil,
+            queue: OperationQueue.main) { [weak self] notification in
+            guard let self = self else { return }
+            if let ui = notification.userInfo,
+               self.viewModel.contactId == ui["contact_id"] as? Int {
+                self.updateHeader()
+            }
+        }
+        incomingMsgsObserver = nc.addObserver(
+            forName: dcNotificationIncoming,
+            object: nil,
+            queue: OperationQueue.main) { [weak self] notification in
+            guard let self = self else { return }
+            if let ui = notification.userInfo,
+               let chatId = ui["chat_id"] as? Int {
+                if self.viewModel.getSharedChatIds().contains(chatId) {
+                    self.viewModel.updateSharedChats()
+                    if self.viewModel.chatId == chatId {
+                        self.updateCellValues()
+                    }
+                    self.tableView.reloadData()
+                }
+            }
+        }
+    }
+
+    private func removeObservers() {
+        let nc = NotificationCenter.default
+        if let contactChangedObserver = self.contactChangedObserver {
+            nc.removeObserver(contactChangedObserver)
+        }
+        if let incomingMsgsObserver = self.incomingMsgsObserver {
+            nc.removeObserver(incomingMsgsObserver)
+        }
+    }
+
     // MARK: - updates
     private func updateHeader() {
         if viewModel.isSavedMessages {

+ 65 - 2
deltachat-ios/Controller/GroupChatDetailViewController.swift

@@ -72,6 +72,10 @@ class GroupChatDetailViewController: UIViewController {
 
     // stores contactIds
     private var groupMemberIds: [Int] = []
+    
+    private var incomingMsgsObserver: NSObjectProtocol?
+    private var ephemeralTimerObserver: NSObjectProtocol?
+    private var chatModifiedObserver: NSObjectProtocol?
 
     // MARK: - subviews
 
@@ -208,16 +212,72 @@ class GroupChatDetailViewController: UIViewController {
         updateGroupMembers()
         tableView.reloadData() // to display updates
         editBarButtonItem.isEnabled = currentUser != nil
+        setupObservers()
         updateHeader()
-        updateCellValues()
+        updateMediaCellValues()
+        updateEphemeralTimerCellValue()
     }
 
+    
+    override func viewWillDisappear(_ animated: Bool) {
+        removeObservers()
+    }
+    
     override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
         if previousTraitCollection?.preferredContentSizeCategory !=
             traitCollection.preferredContentSizeCategory {
             groupHeader.frame = CGRect(0, 0, tableView.frame.width, ContactCell.cellHeight)
         }
     }
+    
+    // MARK: - observers
+    private func setupObservers() {
+        let nc = NotificationCenter.default
+        incomingMsgsObserver = nc.addObserver(
+            forName: dcNotificationIncoming,
+            object: nil,
+            queue: OperationQueue.main) { [weak self] notification in
+            guard let self = self else { return }
+            if let ui = notification.userInfo,
+               self.chatId == ui["chat_id"] as? Int {
+                self.updateMediaCellValues()
+            }
+        }
+        ephemeralTimerObserver = nc.addObserver(
+            forName: dcEphemeralTimerModified,
+            object: nil,
+            queue: OperationQueue.main) { [weak self] notification in
+            guard let self = self else { return }
+            if let ui = notification.userInfo,
+               self.chatId == ui["chat_id"] as? Int {
+                self.updateEphemeralTimerCellValue()
+            }
+        }
+        chatModifiedObserver = nc.addObserver(
+            forName: dcNotificationChatModified,
+            object: nil,
+            queue: OperationQueue.main) { [weak self] notification in
+            guard let self = self else { return }
+            if let ui = notification.userInfo,
+               self.chatId == ui["chat_id"] as? Int {
+                self.updateHeader()
+                self.updateGroupMembers()
+            }
+        }
+    }
+    
+    private func removeObservers() {
+        let nc = NotificationCenter.default
+        if let msgChangedObserver = self.incomingMsgsObserver {
+            nc.removeObserver(msgChangedObserver)
+        }
+        if let ephemeralTimerObserver = self.ephemeralTimerObserver {
+            nc.removeObserver(ephemeralTimerObserver)
+        }
+        if let chatModifiedObserver = self.chatModifiedObserver {
+            nc.removeObserver(chatModifiedObserver)
+        }
+    }
 
     // MARK: - update
     private func updateGroupMembers() {
@@ -239,8 +299,11 @@ class GroupChatDetailViewController: UIViewController {
         groupHeader.setVerified(isVerified: chat.isProtected)
     }
 
-    private func updateCellValues() {
+    private func updateEphemeralTimerCellValue() {
         ephemeralMessagesCell.detailTextLabel?.text = String.localized(chatIsEphemeral ? "on" : "off")
+    }
+    
+    private func updateMediaCellValues() {
         galleryCell.detailTextLabel?.text = String.numberOrNone(galleryItemMessageIds.count)
         documentsCell.detailTextLabel?.text = String.numberOrNone(documentItemMessageIds.count)
     }

+ 14 - 1
deltachat-ios/ViewModel/ContactDetailViewModel.swift

@@ -38,7 +38,7 @@ class ContactDetailViewModel {
     let chatId: Int
     var isSavedMessages: Bool
     var isDeviceTalk: Bool
-    private let sharedChats: DcChatlist
+    private var sharedChats: DcChatlist
     private var sections: [ProfileSections] = []
     private var chatActions: [ChatAction] = []
     private var chatOptions: [ChatOption] = []
@@ -155,6 +155,19 @@ class ContactDetailViewModel {
         return sharedChats.getChatId(index: index)
     }
 
+    func getSharedChatIds() -> [Int] {
+        let max = sharedChats.length
+        var chatIds: [Int] = []
+        for n in 0..<max {
+            chatIds.append(sharedChats.getChatId(index: n))
+        }
+        return chatIds
+    }
+
+    func updateSharedChats() {
+        self.sharedChats = context.getChatlist(flags: 0, queryString: nil, queryId: contactId)
+    }
+
     func update(sharedChatCell cell: ContactCell, row index: Int) {
         let chatId = sharedChats.getChatId(index: index)
         let summary = sharedChats.getSummary(index: index)