From 2d2725ae878388bf402813ec3e3974a1ba1d145a Mon Sep 17 00:00:00 2001 From: Peter Iakovlev Date: Fri, 14 Dec 2018 20:50:53 +0400 Subject: [PATCH] Add support for unsupported media --- TelegramUI/ChatHistoryListNode.swift | 11 +++++- TelegramUI/ChatMessageBubbleItemNode.swift | 5 ++- .../ChatMessagePollBubbleContentNode.swift | 2 +- .../ChatMessageTextBubbleContentNode.swift | 34 +++++++++++++------ 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/TelegramUI/ChatHistoryListNode.swift b/TelegramUI/ChatHistoryListNode.swift index b36729287b..e52705b8f4 100644 --- a/TelegramUI/ChatHistoryListNode.swift +++ b/TelegramUI/ChatHistoryListNode.swift @@ -324,6 +324,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { private let messageProcessingManager = ChatMessageThrottledProcessingManager() private let pollMessageProcessingManager = ChatMessageThrottledProcessingManager() + private let unsupportedMessageProcessingManager = ChatMessageThrottledProcessingManager() private let messageMentionProcessingManager = ChatMessageThrottledProcessingManager(delay: 0.2) private var maxVisibleMessageIndexReported: MessageIndex? @@ -373,6 +374,9 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { self.pollMessageProcessingManager.process = { [weak account] messageIds in account?.viewTracker.updatePollForMessageIds(messageIds: messageIds) } + self.unsupportedMessageProcessingManager.process = { [weak account] messageIds in + account?.viewTracker.updateUnsupportedMediaForMessageIds(messageIds: messageIds) + } self.messageMentionProcessingManager.process = { [weak account] messageIds in account?.viewTracker.updateMarkMentionsSeenForMessageIds(messageIds: messageIds) } @@ -586,6 +590,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { var messageIdsWithViewCount: [MessageId] = [] var messageIdsWithPoll: [MessageId] = [] + var messageIdsWithUnsupportedMedia: [MessageId] = [] var messageIdsWithUnseenPersonalMention: [MessageId] = [] for i in (indexRange.0 ... indexRange.1) { switch historyView.filteredEntries[i] { @@ -611,6 +616,8 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { for media in message.media { if let _ = media as? TelegramMediaPoll { messageIdsWithPoll.append(message.id) + } else if let _ = media as? TelegramMediaUnsupported { + messageIdsWithUnsupportedMedia.append(message.id) } } if hasUnconsumedMention && !hasUnconsumedContent { @@ -651,7 +658,9 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { if !messageIdsWithPoll.isEmpty { strongSelf.pollMessageProcessingManager.add(messageIdsWithPoll) } - + if !messageIdsWithUnsupportedMedia.isEmpty { + strongSelf.unsupportedMessageProcessingManager.add(messageIdsWithUnsupportedMedia) + } if !messageIdsWithUnseenPersonalMention.isEmpty { strongSelf.messageMentionProcessingManager.add(messageIdsWithUnseenPersonalMention) } diff --git a/TelegramUI/ChatMessageBubbleItemNode.swift b/TelegramUI/ChatMessageBubbleItemNode.swift index af23a88644..3cd3547069 100644 --- a/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/TelegramUI/ChatMessageBubbleItemNode.swift @@ -8,6 +8,7 @@ private func contentNodeMessagesAndClassesForItem(_ item: ChatMessageItem) -> [( var result: [(Message, AnyClass)] = [] var skipText = false var addFinalText = false + var isUnsupportedMedia = false outer: for message in item.content { inner: for media in message.media { @@ -43,10 +44,12 @@ private func contentNodeMessagesAndClassesForItem(_ item: ChatMessageItem) -> [( return result } else if let _ = media as? TelegramMediaPoll { result.append((message, ChatMessagePollBubbleContentNode.self)) + } else if let _ = media as? TelegramMediaUnsupported { + isUnsupportedMedia = true } } - if !message.text.isEmpty { + if !message.text.isEmpty || isUnsupportedMedia { if !skipText { if case .group = item.content { addFinalText = true diff --git a/TelegramUI/ChatMessagePollBubbleContentNode.swift b/TelegramUI/ChatMessagePollBubbleContentNode.swift index f6ea2b9fc7..17efdcb240 100644 --- a/TelegramUI/ChatMessagePollBubbleContentNode.swift +++ b/TelegramUI/ChatMessagePollBubbleContentNode.swift @@ -560,7 +560,7 @@ class ChatMessagePollBubbleContentNode: ChatMessageBubbleContentNode { let (typeLayout, typeApply) = makeTypeLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.presentationData.strings.MessagePoll_LabelAnonymous, font: labelsFont, textColor: incoming ? bubbleTheme.incomingSecondaryTextColor : bubbleTheme.outgoingSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: textConstrainedSize, alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let votersString: String - if let totalVoters = poll?.results?.totalVoters { + if let totalVoters = poll?.results?.totalVoters, totalVoters != 0 { votersString = item.presentationData.strings.MessagePoll_VotedCount(totalVoters) } else { votersString = " " diff --git a/TelegramUI/ChatMessageTextBubbleContentNode.swift b/TelegramUI/ChatMessageTextBubbleContentNode.swift index 7a7c813849..d8ebc019ce 100644 --- a/TelegramUI/ChatMessageTextBubbleContentNode.swift +++ b/TelegramUI/ChatMessageTextBubbleContentNode.swift @@ -116,24 +116,38 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { statusApply = apply } + let rawText: String let attributedText: NSAttributedString var messageEntities: [MessageTextEntity]? - for attribute in item.message.attributes { - if let attribute = attribute as? TextEntitiesMessageAttribute { - messageEntities = attribute.entities - break + + var isUnsupportedMedia = false + for media in item.message.media { + if let _ = media as? TelegramMediaUnsupported { + isUnsupportedMedia = true + } + } + + if isUnsupportedMedia { + rawText = item.presentationData.strings.Conversation_UnsupportedMedia + } else { + rawText = item.message.text + for attribute in item.message.attributes { + if let attribute = attribute as? TextEntitiesMessageAttribute { + messageEntities = attribute.entities + break + } } } var entities: [MessageTextEntity]? var updatedCachedChatMessageText: CachedChatMessageText? - if let cached = currentCachedChatMessageText, cached.matches(text: message.text, inputEntities: messageEntities) { + if let cached = currentCachedChatMessageText, cached.matches(text: rawText, inputEntities: messageEntities) { entities = cached.entities } else { entities = messageEntities if let entitiesValue = entities { - if let result = addLocallyGeneratedEntities(message.text, enabledTypes: .all, entities: entitiesValue) { + if let result = addLocallyGeneratedEntities(rawText, enabledTypes: .all, entities: entitiesValue) { entities = result } } else { @@ -148,22 +162,22 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { generateEntities = true } if generateEntities { - let parsedEntities = generateTextEntities(message.text, enabledTypes: .all) + let parsedEntities = generateTextEntities(rawText, enabledTypes: .all) if !parsedEntities.isEmpty { entities = parsedEntities } } } - updatedCachedChatMessageText = CachedChatMessageText(text: message.text, inputEntities: messageEntities, entities: entities) + updatedCachedChatMessageText = CachedChatMessageText(text: rawText, inputEntities: messageEntities, entities: entities) } let bubbleTheme = item.presentationData.theme.theme.chat.bubble if let entities = entities { - attributedText = stringWithAppliedEntities(message.text, entities: entities, baseColor: incoming ? bubbleTheme.incomingPrimaryTextColor : bubbleTheme.outgoingPrimaryTextColor, linkColor: incoming ? bubbleTheme.incomingLinkTextColor : bubbleTheme.outgoingLinkTextColor, baseFont: item.presentationData.messageFont, linkFont: item.presentationData.messageFont, boldFont: item.presentationData.messageBoldFont, italicFont: item.presentationData.messageItalicFont, fixedFont: item.presentationData.messageFixedFont) + attributedText = stringWithAppliedEntities(rawText, entities: entities, baseColor: incoming ? bubbleTheme.incomingPrimaryTextColor : bubbleTheme.outgoingPrimaryTextColor, linkColor: incoming ? bubbleTheme.incomingLinkTextColor : bubbleTheme.outgoingLinkTextColor, baseFont: item.presentationData.messageFont, linkFont: item.presentationData.messageFont, boldFont: item.presentationData.messageBoldFont, italicFont: item.presentationData.messageItalicFont, fixedFont: item.presentationData.messageFixedFont) } else { - attributedText = NSAttributedString(string: message.text, font: item.presentationData.messageFont, textColor: incoming ? bubbleTheme.incomingPrimaryTextColor : bubbleTheme.outgoingPrimaryTextColor) + attributedText = NSAttributedString(string: rawText, font: item.presentationData.messageFont, textColor: incoming ? bubbleTheme.incomingPrimaryTextColor : bubbleTheme.outgoingPrimaryTextColor) } var cutout: TextNodeCutout?