Explorar el Código

update group details if ephemeral timer, messages or chat change

cyberta hace 3 años
padre
commit
928764d4d3
Se han modificado 1 ficheros con 63 adiciones y 2 borrados
  1. 63 2
      deltachat-ios/Controller/GroupChatDetailViewController.swift

+ 63 - 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
 
@@ -209,15 +213,69 @@ class GroupChatDetailViewController: UIViewController {
         tableView.reloadData() // to display updates
         editBarButtonItem.isEnabled = currentUser != nil
         updateHeader()
-        updateCellValues()
+        updateMediaCellValues()
+        updateEphemeralTimerCellValue()
+        setupObservers()
     }
 
+    
+    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
+        // one observer is sufficient since changes of the ephemeral timer and all chat
+        // and member related changes result in a DC_MSG_CHANGED event
+        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] _ in
+            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 +297,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)
     }