Browse Source

Merge pull request #1352 from deltachat/fix_search_result_crash

update search result on messages changed event
bjoern 3 years ago
parent
commit
04c4cf9705

+ 8 - 6
DcCore/DcCore/DC/Wrapper.swift

@@ -763,9 +763,7 @@ public class DcChatlist {
     }
 
     public func getSummary(index: Int) -> DcLot {
-        guard let lotPointer = dc_chatlist_get_summary(self.chatListPointer, index, nil) else {
-            fatalError("lot-pointer was nil")
-        }
+        let lotPointer = dc_chatlist_get_summary(self.chatListPointer, index, nil)
         return DcLot(lotPointer)
     }
 }
@@ -786,6 +784,10 @@ public class DcChat {
         return Int(dc_chat_get_id(chatPointer))
     }
 
+    public var isValid: Bool {
+        return self.chatPointer != nil
+    }
+
     public var name: String {
         guard let cString = dc_chat_get_name(chatPointer) else { return "" }
         let swiftString = String(cString: cString)
@@ -1155,10 +1157,10 @@ public class DcMsg {
 
     public func summary(chat: DcChat) -> DcLot {
         guard let chatPointer = chat.chatPointer else {
-            fatalError()
+            return DcLot(nil);
         }
         guard let dcLotPointer = dc_msg_get_summary(messagePointer, chatPointer) else {
-            fatalError()
+            return DcLot(nil)
         }
         return DcLot(dcLotPointer)
     }
@@ -1274,7 +1276,7 @@ public class DcLot {
     private var dcLotPointer: OpaquePointer?
 
     // takes ownership of specified pointer
-    public init(_ dcLotPointer: OpaquePointer) {
+    public init(_ dcLotPointer: OpaquePointer?) {
         self.dcLotPointer = dcLotPointer
     }
 

+ 19 - 0
deltachat-ios/Controller/ChatListController.swift

@@ -13,6 +13,7 @@ class ChatListController: UITableViewController {
     private var msgsNoticedObserver: NSObjectProtocol?
     private var incomingMsgObserver: NSObjectProtocol?
     private var connectivityChangedObserver: NSObjectProtocol?
+    private var msgChangedSearchResultObserver: NSObjectProtocol?
 
     private weak var timer: Timer?
 
@@ -80,6 +81,24 @@ class ChatListController: UITableViewController {
         }
         configureTableView()
         setupSubviews()
+        let nc = NotificationCenter.default
+        msgChangedSearchResultObserver = nc.addObserver(
+            forName: dcNotificationChanged,
+            object: nil,
+            queue: nil) { [weak self] _ in
+            guard let self = self else { return }
+            if let appDelegate = UIApplication.shared.delegate as? AppDelegate,
+               self.viewModel.searchActive,
+               appDelegate.appIsInForeground() {
+                self.viewModel.updateSearchResults(for: self.searchController)
+            }
+        }
+    }
+
+    deinit {
+        if let msgChangedResultObserver = self.msgChangedSearchResultObserver {
+            NotificationCenter.default.removeObserver(msgChangedResultObserver)
+        }
     }
 
     override func viewWillAppear(_ animated: Bool) {

+ 13 - 0
deltachat-ios/ViewModel/ChatListViewModel.swift

@@ -232,6 +232,19 @@ private extension ChatListViewModel {
         let msg: DcMsg = dcContext.getMessage(id: msgId)
         let chatId: Int = msg.chatId
         let chat: DcChat = dcContext.getChat(chatId: chatId)
+        if !chat.isValid {
+            // chat might be deleted and searchResultMessageIds deprecated, so return a dummy view model
+            // cleanup of the searchResultMessageIds will be done in message change event handling
+            return ChatCellViewModel(
+                dcContext: dcContext,
+                chatData: ChatCellData(
+                    chatId: 0,
+                    highlightMsgId: 0,
+                    summary: DcLot(nil),
+                    unreadMessages: 0
+                )
+            )
+        }
         let summary: DcLot = msg.summary(chat: chat)
         let unreadMessages = dcContext.getUnreadMessages(chatId: chatId)