From 0038be8ced2a33ce5196c7db08e03f25c776083e Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 09:58:56 +0800 Subject: [PATCH 01/14] update recordMessage for message deleted by creator --- Yep/Services/YepServiceSync.swift | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Yep/Services/YepServiceSync.swift b/Yep/Services/YepServiceSync.swift index f4ea34e0..a4725d5a 100644 --- a/Yep/Services/YepServiceSync.swift +++ b/Yep/Services/YepServiceSync.swift @@ -827,10 +827,22 @@ func syncMessagesReadStatus() { func recordMessageWithMessageID(messageID: String, detailInfo messageInfo: JSONDictionary, inRealm realm: Realm) { - println("messageInfo: \(messageInfo)") + //println("messageInfo: \(messageInfo)") + + let deleted = (messageInfo["deleted"] as? Bool) ?? false if let message = messageWithMessageID(messageID, inRealm: realm) { + guard !deleted else { + + message.sendState = MessageSendState.Read.rawValue + message.readed = true + message.textContent = NSLocalizedString("This message deleted by creator.", comment: "") + message.mediaType = MessageMediaType.Text.rawValue + + return + } + if let user = message.fromFriend where user.userID == YepUserDefaults.userID.value { message.sendState = MessageSendState.Read.rawValue } From a7fe8959ca9a30fd7d7c07acd23ac604796329cb Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 10:17:17 +0800 Subject: [PATCH 02/14] hidden replace deleted in Message; add deletedByCreator --- Yep/AppDelegate.swift | 2 +- Yep/Realm/Models.swift | 15 ++++++++------- .../Conversation/ConversationViewController.swift | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Yep/AppDelegate.swift b/Yep/AppDelegate.swift index 5c06575d..b9625130 100644 --- a/Yep/AppDelegate.swift +++ b/Yep/AppDelegate.swift @@ -43,7 +43,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { let directory: NSURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(YepConfig.appGroupID)! let realmPath = directory.URLByAppendingPathComponent("db.realm").path! - return Realm.Configuration(path: realmPath, schemaVersion: 17, migrationBlock: { migration, oldSchemaVersion in + return Realm.Configuration(path: realmPath, schemaVersion: 18, migrationBlock: { migration, oldSchemaVersion in }) } diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 87f1180e..720637ed 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -550,7 +550,8 @@ class Message: Object { dynamic var sendState: Int = MessageSendState.NotSend.rawValue dynamic var readed: Bool = false dynamic var mediaPlayed: Bool = false // 音频播放过,图片查看过等 - dynamic var deleted: Bool = false // 标记已被删除,删除对方消息,使之不再显示 + dynamic var hidden: Bool = false // 隐藏对方消息,使之不再显示 + dynamic var deletedByCreator: Bool = false dynamic var fromFriend: User? dynamic var conversation: Conversation? @@ -1307,7 +1308,7 @@ func unReadMessagesOfConversation(conversation: Conversation, inRealm realm: Rea */ func messagesOfConversation(conversation: Conversation, inRealm realm: Realm) -> Results { - let predicate = NSPredicate(format: "conversation = %@ AND deleted = false", argumentArray: [conversation]) + let predicate = NSPredicate(format: "conversation = %@ AND hidden = false", argumentArray: [conversation]) let messages = realm.objects(Message).filter(predicate).sorted("createdUnixTime", ascending: true) return messages } @@ -1562,11 +1563,11 @@ func updateUserWithUserID(userID: String, useUserInfo userInfo: JSONDictionary, // MARK: Delete -private func clearMessagesOfConversation(conversation: Conversation, inRealm realm: Realm, keepDeletedMessages: Bool) { +private func clearMessagesOfConversation(conversation: Conversation, inRealm realm: Realm, keepHiddenMessages: Bool) { let messages: [Message] - if keepDeletedMessages { - messages = conversation.messages.filter({ $0.deleted == false }) + if keepHiddenMessages { + messages = conversation.messages.filter({ $0.hidden == false }) } else { messages = conversation.messages } @@ -1582,7 +1583,7 @@ private func clearMessagesOfConversation(conversation: Conversation, inRealm rea func deleteConversation(conversation: Conversation, inRealm realm: Realm, needLeaveGroup: Bool = true, afterLeaveGroup: (() -> Void)? = nil) { - clearMessagesOfConversation(conversation, inRealm: realm, keepDeletedMessages: false) + clearMessagesOfConversation(conversation, inRealm: realm, keepHiddenMessages: false) // delete conversation, finally @@ -1623,7 +1624,7 @@ func tryDeleteOrClearHistoryOfConversation(conversation: Conversation, inViewCon let clearMessages: () -> Void = { realm.beginWrite() - clearMessagesOfConversation(conversation, inRealm: realm, keepDeletedMessages: true) + clearMessagesOfConversation(conversation, inRealm: realm, keepHiddenMessages: true) let _ = try? realm.commitWrite() } diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index a1818a72..a1c397a1 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -3347,7 +3347,7 @@ extension ConversationViewController: UICollectionViewDataSource, UICollectionVi }) } else { - message.deleted = true + message.hidden = true } } @@ -3375,7 +3375,7 @@ extension ConversationViewController: UICollectionViewDataSource, UICollectionVi }) } else { - message.deleted = true + message.hidden = true } } From 2ab097cae3e4dad1308abb40051d0569783dd76e Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 10:21:15 +0800 Subject: [PATCH 03/14] new logic for handleMessageDeletedFromServer --- Yep/Realm/Models.swift | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 720637ed..77f1de84 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -1321,12 +1321,21 @@ func handleMessageDeletedFromServer(messageID messageID: String) { guard let realm = try? Realm(), - message = messageWithMessageID(messageID, inRealm: realm), - conversation = message.conversation + message = messageWithMessageID(messageID, inRealm: realm) + //conversation = message.conversation else { return } + let _ = try? realm.write { + message.deleteAttachmentInRealm(realm) + message.sendState = MessageSendState.Read.rawValue + message.readed = true + message.textContent = NSLocalizedString("This message deleted by creator.", comment: "") + message.mediaType = MessageMediaType.Text.rawValue + } + + /* let messages = messagesOfConversation(conversation, inRealm: realm) var sectionDateMessage: Message? @@ -1348,6 +1357,7 @@ func handleMessageDeletedFromServer(messageID messageID: String) { message.deleteAttachmentInRealm(realm) realm.delete(message) } + */ dispatch_async(dispatch_get_main_queue()) { NSNotificationCenter.defaultCenter().postNotificationName(YepConfig.Notification.deletedMessages, object: nil) From 93217ee244c4f58a4d9447b16f3b7b6a13086e31 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 10:26:08 +0800 Subject: [PATCH 04/14] refactor message.updateForDeletedFromServerInRealm --- Yep/Realm/Models.swift | 15 ++++++++++----- Yep/Services/YepServiceSync.swift | 7 +------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 77f1de84..13572b00 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -612,6 +612,15 @@ class Message: Object { break // TODO: if have other message media need to delete } } + + func updateForDeletedFromServerInRealm(realm: Realm) { + + deleteAttachmentInRealm(realm) + sendState = MessageSendState.Read.rawValue + readed = true + textContent = NSLocalizedString("This message deleted by creator.", comment: "") + mediaType = MessageMediaType.Text.rawValue + } } class Draft: Object { @@ -1328,11 +1337,7 @@ func handleMessageDeletedFromServer(messageID messageID: String) { } let _ = try? realm.write { - message.deleteAttachmentInRealm(realm) - message.sendState = MessageSendState.Read.rawValue - message.readed = true - message.textContent = NSLocalizedString("This message deleted by creator.", comment: "") - message.mediaType = MessageMediaType.Text.rawValue + message.updateForDeletedFromServerInRealm(realm) } /* diff --git a/Yep/Services/YepServiceSync.swift b/Yep/Services/YepServiceSync.swift index a4725d5a..d287234d 100644 --- a/Yep/Services/YepServiceSync.swift +++ b/Yep/Services/YepServiceSync.swift @@ -834,12 +834,7 @@ func recordMessageWithMessageID(messageID: String, detailInfo messageInfo: JSOND if let message = messageWithMessageID(messageID, inRealm: realm) { guard !deleted else { - - message.sendState = MessageSendState.Read.rawValue - message.readed = true - message.textContent = NSLocalizedString("This message deleted by creator.", comment: "") - message.mediaType = MessageMediaType.Text.rawValue - + message.updateForDeletedFromServerInRealm(realm) return } From 3800d74c4e0e0aa89b7d3083b6c574f8aaecfe12 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 10:30:44 +0800 Subject: [PATCH 05/14] update updateForDeletedFromServerInRealm --- Yep/Realm/Models.swift | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 13572b00..ecd370e4 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -615,7 +615,12 @@ class Message: Object { func updateForDeletedFromServerInRealm(realm: Realm) { + deletedByCreator = true + + // 删除附件 deleteAttachmentInRealm(realm) + + // 再将其变为文字消息 sendState = MessageSendState.Read.rawValue readed = true textContent = NSLocalizedString("This message deleted by creator.", comment: "") @@ -1340,6 +1345,8 @@ func handleMessageDeletedFromServer(messageID messageID: String) { message.updateForDeletedFromServerInRealm(realm) } + let messageIDs: [String] = [message.messageID] + /* let messages = messagesOfConversation(conversation, inRealm: realm) @@ -1365,7 +1372,7 @@ func handleMessageDeletedFromServer(messageID messageID: String) { */ dispatch_async(dispatch_get_main_queue()) { - NSNotificationCenter.defaultCenter().postNotificationName(YepConfig.Notification.deletedMessages, object: nil) + NSNotificationCenter.defaultCenter().postNotificationName(YepConfig.Notification.deletedMessages, object: ["messageIDs": messageIDs]) } } From 627c1f4ad387fabbe99fbd7bc593895a0e2b7a86 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 10:45:50 +0800 Subject: [PATCH 06/14] new logic for handleDeletedMessages in Conversation (update height of deleted message) --- .../Conversation/ConversationViewController.swift | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index a1c397a1..08bf6a5a 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -1871,6 +1871,9 @@ class ConversationViewController: BaseViewController { return height } + private func clearHeightOfMessageWithKey(key: String) { + messageHeights[key] = nil + } private var textContentLabelWidths = [String: CGFloat]() private func textContentLabelWidthOfMessage(message: Message) -> CGFloat { @@ -2497,7 +2500,17 @@ class ConversationViewController: BaseViewController { @objc private func handleDeletedMessagesNotification(notification: NSNotification) { - reloadConversationCollectionView() + defer { + reloadConversationCollectionView() + } + + guard let info = notification.object as? [String: AnyObject], messageIDs = info["messageIDs"] as? [String] else { + return + } + + messageIDs.forEach { + clearHeightOfMessageWithKey($0) + } } // App 进入前台时,根据通知插入处于后台状态时收到的消息 From 0993e53b2b6ee2736a9c120065a692483c8bb3b3 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 11:14:57 +0800 Subject: [PATCH 07/14] textColor for message.deletedByCreator --- Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift b/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift index 6bb38703..0aad2db4 100644 --- a/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift +++ b/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift @@ -65,6 +65,13 @@ class ChatLeftTextCell: ChatBaseCell { self.user = message.fromFriend textContentTextView.text = message.textContent + + if message.deletedByCreator { + textContentTextView.textColor = UIColor.lightGrayColor() + } else { + textContentTextView.textColor = UIColor.blackColor() + } + //textContentTextView.attributedText = NSAttributedString(string: message.textContent, attributes: textAttributes) //textContentTextView.textAlignment = textContentLabelWidth < YepConfig.minMessageTextLabelWidth ? .Center : .Left From e7522c55ccc52d0a21a143c9e0a717e1fc671541 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 11:26:18 +0800 Subject: [PATCH 08/14] new way to show message.deletedByCreator --- Yep/Realm/Models.swift | 2 +- .../Conversation/ConversationViewController.swift | 10 +++++++++- Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift | 8 +++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index ecd370e4..b368685c 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -623,7 +623,7 @@ class Message: Object { // 再将其变为文字消息 sendState = MessageSendState.Read.rawValue readed = true - textContent = NSLocalizedString("This message deleted by creator.", comment: "") + textContent = "" mediaType = MessageMediaType.Text.rawValue } } diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index 08bf6a5a..2ee34c79 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -1800,7 +1800,15 @@ class ConversationViewController: BaseViewController { switch message.mediaType { case MessageMediaType.Text.rawValue: - let rect = message.textContent.boundingRectWithSize(CGSize(width: messageTextLabelMaxWidth, height: CGFloat(FLT_MAX)), options: [.UsesLineFragmentOrigin, .UsesFontLeading], attributes: YepConfig.ChatCell.textAttributes, context: nil) + + let textContent: String + if message.deletedByCreator { + textContent = NSLocalizedString("Deleted by creator.", comment: "") + } else { + textContent = message.textContent + } + + let rect = textContent.boundingRectWithSize(CGSize(width: messageTextLabelMaxWidth, height: CGFloat(FLT_MAX)), options: [.UsesLineFragmentOrigin, .UsesFontLeading], attributes: YepConfig.ChatCell.textAttributes, context: nil) height = max(ceil(rect.height) + (11 * 2), YepConfig.chatCellAvatarSize()) diff --git a/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift b/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift index 0aad2db4..658bef83 100644 --- a/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift +++ b/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift @@ -64,7 +64,13 @@ class ChatLeftTextCell: ChatBaseCell { self.user = message.fromFriend - textContentTextView.text = message.textContent + let textContent: String + if message.deletedByCreator { + textContent = NSLocalizedString("Deleted by creator.", comment: "") + } else { + textContent = message.textContent + } + textContentTextView.text = textContent if message.deletedByCreator { textContentTextView.textColor = UIColor.lightGrayColor() From 65c3497d0b01dfa7a705d0541bd077238c48a353 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 11:29:14 +0800 Subject: [PATCH 09/14] refactor message.textContentToShow --- Yep/Realm/Models.swift | 8 ++++++++ .../Conversation/ConversationViewController.swift | 9 +-------- Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift | 8 +------- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index b368685c..3af56321 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -511,6 +511,14 @@ class Message: Object { dynamic var mediaType: Int = MessageMediaType.Text.rawValue dynamic var textContent: String = "" + var textContentToShow: String { + if deletedByCreator { + return NSLocalizedString("Deleted by creator.", comment: "") + } else { + return textContent + } + } + dynamic var coordinate: Coordinate? dynamic var attachmentURLString: String = "" diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index 2ee34c79..569704a0 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -1801,14 +1801,7 @@ class ConversationViewController: BaseViewController { case MessageMediaType.Text.rawValue: - let textContent: String - if message.deletedByCreator { - textContent = NSLocalizedString("Deleted by creator.", comment: "") - } else { - textContent = message.textContent - } - - let rect = textContent.boundingRectWithSize(CGSize(width: messageTextLabelMaxWidth, height: CGFloat(FLT_MAX)), options: [.UsesLineFragmentOrigin, .UsesFontLeading], attributes: YepConfig.ChatCell.textAttributes, context: nil) + let rect = message.textContentToShow.boundingRectWithSize(CGSize(width: messageTextLabelMaxWidth, height: CGFloat(FLT_MAX)), options: [.UsesLineFragmentOrigin, .UsesFontLeading], attributes: YepConfig.ChatCell.textAttributes, context: nil) height = max(ceil(rect.height) + (11 * 2), YepConfig.chatCellAvatarSize()) diff --git a/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift b/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift index 658bef83..c0cc8a63 100644 --- a/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift +++ b/Yep/Views/Cells/ChatLeftText/ChatLeftTextCell.swift @@ -64,13 +64,7 @@ class ChatLeftTextCell: ChatBaseCell { self.user = message.fromFriend - let textContent: String - if message.deletedByCreator { - textContent = NSLocalizedString("Deleted by creator.", comment: "") - } else { - textContent = message.textContent - } - textContentTextView.text = textContent + textContentTextView.text = message.textContentToShow if message.deletedByCreator { textContentTextView.textColor = UIColor.lightGrayColor() From 830b71661929738596c6590e39af15fcfa4426a7 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 13:07:20 +0800 Subject: [PATCH 10/14] do not sync message sent from me & deleted --- Yep/Services/YepServiceSync.swift | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Yep/Services/YepServiceSync.swift b/Yep/Services/YepServiceSync.swift index d287234d..cf3196ec 100644 --- a/Yep/Services/YepServiceSync.swift +++ b/Yep/Services/YepServiceSync.swift @@ -917,11 +917,26 @@ func recordMessageWithMessageID(messageID: String, detailInfo messageInfo: JSOND } func syncMessageWithMessageInfo(messageInfo: JSONDictionary, messageAge: MessageAge, inRealm realm: Realm, andDoFurtherAction furtherAction: ((messageIDs: [String]) -> Void)? ) { - + if let messageID = messageInfo["id"] as? String { var message = messageWithMessageID(messageID, inRealm: realm) + // 如果消息被删除,且的发送者是自己,不同步且删除本地已有的 + let deleted = (messageInfo["deleted"] as? Bool) ?? false + if deleted { + if let senderInfo = messageInfo["sender"] as? JSONDictionary, senderID = senderInfo["id"] as? String { + if senderID == YepUserDefaults.userID.value { + if let message = message { + message.deleteAttachmentInRealm(realm) + realm.delete(message) + } + + return + } + } + } + if message == nil { let newMessage = Message() newMessage.messageID = messageID From b7bac528245c88ac5a57a22331c4f78466faf630 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 13:16:58 +0800 Subject: [PATCH 11/14] message.deleteInRealm --- Yep/Realm/Models.swift | 9 +++++---- Yep/Services/SocialWorkService.swift | 2 +- Yep/Services/YepServiceSync.swift | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 3af56321..b109045a 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -621,6 +621,11 @@ class Message: Object { } } + func deleteInRealm(realm: Realm) { + deleteAttachmentInRealm(realm) + realm.delete(self) + } + func updateForDeletedFromServerInRealm(realm: Realm) { deletedByCreator = true @@ -1335,10 +1340,6 @@ func messagesOfConversation(conversation: Conversation, inRealm realm: Realm) -> return messages } -func deleteMessage(message: Message, inRealm realm: Realm) { - realm.delete(message) -} - func handleMessageDeletedFromServer(messageID messageID: String) { guard let diff --git a/Yep/Services/SocialWorkService.swift b/Yep/Services/SocialWorkService.swift index cabaffd2..5523e3f9 100644 --- a/Yep/Services/SocialWorkService.swift +++ b/Yep/Services/SocialWorkService.swift @@ -449,7 +449,7 @@ func syncSocialWorksToMessagesForYepTeam() { return messageIDs } else { - deleteMessage(message, inRealm: realm) + message.deleteInRealm(realm) } } diff --git a/Yep/Services/YepServiceSync.swift b/Yep/Services/YepServiceSync.swift index cf3196ec..1c565050 100644 --- a/Yep/Services/YepServiceSync.swift +++ b/Yep/Services/YepServiceSync.swift @@ -1133,7 +1133,7 @@ func syncMessageWithMessageInfo(messageInfo: JSONDictionary, messageAge: Message } } else { - deleteMessage(message, inRealm: realm) + message.deleteInRealm(realm) } } } From 738b56276c7a803eb9ba0c1b5eeb9c7e3a7f8029 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 13:44:31 +0800 Subject: [PATCH 12/14] latestValidMessage for Conversation; new logic for find latest message withConversationType --- Yep/Realm/Models.swift | 24 ++++++++++++++----- .../ConversationsViewController.swift | 4 ++-- .../Cells/Conversation/ConversationCell.swift | 8 +++---- .../FeedConversationCell.swift | 6 ++--- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index b109045a..460bc54f 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -736,6 +736,14 @@ class Conversation: Object { } dynamic var unreadMessagesCount: Int = 0 + + var latestValidMessage: Message? { + guard let realm = realm, type = ConversationType(rawValue: type) else { + return nil + } + + return latestValidMessageInRealm(realm, withConversationType: type) + } } // MARK: Feed @@ -1035,7 +1043,7 @@ func countOfUnreadMessagesInConversation(conversation: Conversation) -> Int { }).count } -func latestMessageInRealm(realm: Realm, withConversationType conversationType: ConversationType) -> Message? { +func latestValidMessageInRealm(realm: Realm, withConversationType conversationType: ConversationType) -> Message? { // let predicate = NSPredicate(format: "fromFriend != nil AND conversation != nil AND conversation.type = %d", conversationType.rawValue) // return realm.objects(Message).filter(predicate).sorted("updatedUnixTime", ascending: false).first @@ -1043,26 +1051,30 @@ func latestMessageInRealm(realm: Realm, withConversationType conversationType: C switch conversationType { case .OneToOne: - let predicate = NSPredicate(format: "fromFriend != nil AND conversation != nil AND conversation.type = %d", conversationType.rawValue) + let predicate = NSPredicate(format: "hidden = false AND deletedByCreator = false AND fromFriend != nil AND conversation != nil AND conversation.type = %d", conversationType.rawValue) return realm.objects(Message).filter(predicate).sorted("updatedUnixTime", ascending: false).first case .Group: let predicate = NSPredicate(format: "withGroup != nil AND withGroup.includeMe = true") - return realm.objects(Conversation).filter(predicate).sorted("updatedUnixTime", ascending: false).first?.messages.sort({ $0.createdUnixTime > $1.createdUnixTime }).first + let messages: [Message]? = realm.objects(Conversation).filter(predicate).sorted("updatedUnixTime", ascending: false).first?.messages.sort({ $0.createdUnixTime > $1.createdUnixTime }) + + return messages?.filter({ ($0.hidden == false) && ($0.deletedByCreator == false) }).first } } -func latestUnreadMessageInRealm(realm: Realm, withConversationType conversationType: ConversationType) -> Message? { +func latestUnreadValidMessageInRealm(realm: Realm, withConversationType conversationType: ConversationType) -> Message? { switch conversationType { case .OneToOne: - let predicate = NSPredicate(format: "readed = false AND fromFriend != nil AND conversation != nil AND conversation.type = %d", conversationType.rawValue) + let predicate = NSPredicate(format: "readed = false AND hidden = false AND deletedByCreator = false AND fromFriend != nil AND conversation != nil AND conversation.type = %d", conversationType.rawValue) return realm.objects(Message).filter(predicate).sorted("updatedUnixTime", ascending: false).first case .Group: let predicate = NSPredicate(format: "withGroup != nil AND withGroup.includeMe = true") - return realm.objects(Conversation).filter(predicate).sorted("updatedUnixTime", ascending: false).first?.messages.filter({ $0.readed == false && $0.fromFriend?.userID != YepUserDefaults.userID.value }).sort({ $0.createdUnixTime > $1.createdUnixTime }).first + let messages: [Message]? = realm.objects(Conversation).filter(predicate).sorted("updatedUnixTime", ascending: false).first?.messages.filter({ $0.readed == false && $0.fromFriend?.userID != YepUserDefaults.userID.value }).sort({ $0.createdUnixTime > $1.createdUnixTime }) + + return messages?.filter({ ($0.hidden == false) && ($0.deletedByCreator == false) }).first } } diff --git a/Yep/ViewControllers/Conversations/ConversationsViewController.swift b/Yep/ViewControllers/Conversations/ConversationsViewController.swift index 816da20a..dbf15c22 100644 --- a/Yep/ViewControllers/Conversations/ConversationsViewController.swift +++ b/Yep/ViewControllers/Conversations/ConversationsViewController.swift @@ -369,9 +369,9 @@ extension ConversationsViewController: UITableViewDataSource, UITableViewDelegat cell.haveGroupUnreadMessages = countOfUnreadMessagesInRealm(realm, withConversationType: ConversationType.Group) > 0 // 先找最新且未读的消息 - let latestUnreadMessage = latestUnreadMessageInRealm(realm, withConversationType: ConversationType.Group) + let latestUnreadMessage = latestUnreadValidMessageInRealm(realm, withConversationType: ConversationType.Group) // 找不到就找最新的消息 - if let latestMessage = (latestUnreadMessage ?? latestMessageInRealm(realm, withConversationType: ConversationType.Group)) { + if let latestMessage = (latestUnreadMessage ?? latestValidMessageInRealm(realm, withConversationType: ConversationType.Group)) { if let mediaType = MessageMediaType(rawValue: latestMessage.mediaType), placeholder = mediaType.placeholder { cell.chatLabel.text = placeholder diff --git a/Yep/Views/Cells/Conversation/ConversationCell.swift b/Yep/Views/Cells/Conversation/ConversationCell.swift index 2f2f242b..4937cb94 100644 --- a/Yep/Views/Cells/Conversation/ConversationCell.swift +++ b/Yep/Views/Cells/Conversation/ConversationCell.swift @@ -69,15 +69,15 @@ class ConversationCell: UITableViewCell { func updateInfoLabels() { - if let latestMessage = messagesInConversation(conversation).last { + if let latestValidMessage = conversation.latestValidMessage { - if let mediaType = MessageMediaType(rawValue: latestMessage.mediaType), placeholder = mediaType.placeholder { + if let mediaType = MessageMediaType(rawValue: latestValidMessage.mediaType), placeholder = mediaType.placeholder { self.chatLabel.text = placeholder } else { - self.chatLabel.text = latestMessage.textContent + self.chatLabel.text = latestValidMessage.textContent } - let createdAt = NSDate(timeIntervalSince1970: latestMessage.createdUnixTime) + let createdAt = NSDate(timeIntervalSince1970: latestValidMessage.createdUnixTime) self.timeAgoLabel.text = createdAt.timeAgo } else { diff --git a/Yep/Views/Cells/FeedConversation/FeedConversationCell.swift b/Yep/Views/Cells/FeedConversation/FeedConversationCell.swift index 4b814b06..75cc2d1b 100644 --- a/Yep/Views/Cells/FeedConversation/FeedConversationCell.swift +++ b/Yep/Views/Cells/FeedConversation/FeedConversationCell.swift @@ -68,12 +68,12 @@ class FeedConversationCell: UITableViewCell { }) mediaView.setImagesWithAttachments(attachments) - if let latestMessage = messagesInConversation(conversation).last { + if let latestValidMessage = conversation.latestValidMessage { - if let mediaType = MessageMediaType(rawValue: latestMessage.mediaType), placeholder = mediaType.placeholder { + if let mediaType = MessageMediaType(rawValue: latestValidMessage.mediaType), placeholder = mediaType.placeholder { self.chatLabel.text = placeholder } else { - self.chatLabel.text = latestMessage.nicknameWithTextContent + self.chatLabel.text = latestValidMessage.nicknameWithTextContent } } else { From b0725c724d3e4c009eadf0f37b4c3e0aacce8ad9 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 13:55:44 +0800 Subject: [PATCH 13/14] fix latestValidMessage of Conversation --- Yep/Realm/Models.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 460bc54f..aff0e74f 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -738,11 +738,7 @@ class Conversation: Object { dynamic var unreadMessagesCount: Int = 0 var latestValidMessage: Message? { - guard let realm = realm, type = ConversationType(rawValue: type) else { - return nil - } - - return latestValidMessageInRealm(realm, withConversationType: type) + return messages.filter({ ($0.hidden == false) && ($0.deletedByCreator == false && ($0.mediaType != MessageMediaType.SectionDate.rawValue)) }).sort({ $0.createdUnixTime > $1.createdUnixTime }).first } } From 0ab9540f7d21587c71e4f90fb868eac54bc46240 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Dec 2015 13:59:56 +0800 Subject: [PATCH 14/14] trans --- Yep/zh-Hans.lproj/Localizable.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Yep/zh-Hans.lproj/Localizable.strings b/Yep/zh-Hans.lproj/Localizable.strings index c3bb86dd..8595eff8 100644 --- a/Yep/zh-Hans.lproj/Localizable.strings +++ b/Yep/zh-Hans.lproj/Localizable.strings @@ -726,3 +726,5 @@ "Hide" = "隐藏"; +"Deleted by creator." = "被创建者删除。"; +