Add support for unsupported media

This commit is contained in:
Peter Iakovlev
2018-12-14 20:50:53 +04:00
parent 3ebef5171b
commit 2d2725ae87
4 changed files with 39 additions and 13 deletions

View File

@@ -324,6 +324,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
private let messageProcessingManager = ChatMessageThrottledProcessingManager() private let messageProcessingManager = ChatMessageThrottledProcessingManager()
private let pollMessageProcessingManager = ChatMessageThrottledProcessingManager() private let pollMessageProcessingManager = ChatMessageThrottledProcessingManager()
private let unsupportedMessageProcessingManager = ChatMessageThrottledProcessingManager()
private let messageMentionProcessingManager = ChatMessageThrottledProcessingManager(delay: 0.2) private let messageMentionProcessingManager = ChatMessageThrottledProcessingManager(delay: 0.2)
private var maxVisibleMessageIndexReported: MessageIndex? private var maxVisibleMessageIndexReported: MessageIndex?
@@ -373,6 +374,9 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
self.pollMessageProcessingManager.process = { [weak account] messageIds in self.pollMessageProcessingManager.process = { [weak account] messageIds in
account?.viewTracker.updatePollForMessageIds(messageIds: messageIds) account?.viewTracker.updatePollForMessageIds(messageIds: messageIds)
} }
self.unsupportedMessageProcessingManager.process = { [weak account] messageIds in
account?.viewTracker.updateUnsupportedMediaForMessageIds(messageIds: messageIds)
}
self.messageMentionProcessingManager.process = { [weak account] messageIds in self.messageMentionProcessingManager.process = { [weak account] messageIds in
account?.viewTracker.updateMarkMentionsSeenForMessageIds(messageIds: messageIds) account?.viewTracker.updateMarkMentionsSeenForMessageIds(messageIds: messageIds)
} }
@@ -586,6 +590,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
var messageIdsWithViewCount: [MessageId] = [] var messageIdsWithViewCount: [MessageId] = []
var messageIdsWithPoll: [MessageId] = [] var messageIdsWithPoll: [MessageId] = []
var messageIdsWithUnsupportedMedia: [MessageId] = []
var messageIdsWithUnseenPersonalMention: [MessageId] = [] var messageIdsWithUnseenPersonalMention: [MessageId] = []
for i in (indexRange.0 ... indexRange.1) { for i in (indexRange.0 ... indexRange.1) {
switch historyView.filteredEntries[i] { switch historyView.filteredEntries[i] {
@@ -611,6 +616,8 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
for media in message.media { for media in message.media {
if let _ = media as? TelegramMediaPoll { if let _ = media as? TelegramMediaPoll {
messageIdsWithPoll.append(message.id) messageIdsWithPoll.append(message.id)
} else if let _ = media as? TelegramMediaUnsupported {
messageIdsWithUnsupportedMedia.append(message.id)
} }
} }
if hasUnconsumedMention && !hasUnconsumedContent { if hasUnconsumedMention && !hasUnconsumedContent {
@@ -651,7 +658,9 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
if !messageIdsWithPoll.isEmpty { if !messageIdsWithPoll.isEmpty {
strongSelf.pollMessageProcessingManager.add(messageIdsWithPoll) strongSelf.pollMessageProcessingManager.add(messageIdsWithPoll)
} }
if !messageIdsWithUnsupportedMedia.isEmpty {
strongSelf.unsupportedMessageProcessingManager.add(messageIdsWithUnsupportedMedia)
}
if !messageIdsWithUnseenPersonalMention.isEmpty { if !messageIdsWithUnseenPersonalMention.isEmpty {
strongSelf.messageMentionProcessingManager.add(messageIdsWithUnseenPersonalMention) strongSelf.messageMentionProcessingManager.add(messageIdsWithUnseenPersonalMention)
} }

View File

@@ -8,6 +8,7 @@ private func contentNodeMessagesAndClassesForItem(_ item: ChatMessageItem) -> [(
var result: [(Message, AnyClass)] = [] var result: [(Message, AnyClass)] = []
var skipText = false var skipText = false
var addFinalText = false var addFinalText = false
var isUnsupportedMedia = false
outer: for message in item.content { outer: for message in item.content {
inner: for media in message.media { inner: for media in message.media {
@@ -43,10 +44,12 @@ private func contentNodeMessagesAndClassesForItem(_ item: ChatMessageItem) -> [(
return result return result
} else if let _ = media as? TelegramMediaPoll { } else if let _ = media as? TelegramMediaPoll {
result.append((message, ChatMessagePollBubbleContentNode.self)) 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 !skipText {
if case .group = item.content { if case .group = item.content {
addFinalText = true addFinalText = true

View File

@@ -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 (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 let votersString: String
if let totalVoters = poll?.results?.totalVoters { if let totalVoters = poll?.results?.totalVoters, totalVoters != 0 {
votersString = item.presentationData.strings.MessagePoll_VotedCount(totalVoters) votersString = item.presentationData.strings.MessagePoll_VotedCount(totalVoters)
} else { } else {
votersString = " " votersString = " "

View File

@@ -116,24 +116,38 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode {
statusApply = apply statusApply = apply
} }
let rawText: String
let attributedText: NSAttributedString let attributedText: NSAttributedString
var messageEntities: [MessageTextEntity]? var messageEntities: [MessageTextEntity]?
for attribute in item.message.attributes {
if let attribute = attribute as? TextEntitiesMessageAttribute { var isUnsupportedMedia = false
messageEntities = attribute.entities for media in item.message.media {
break 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 entities: [MessageTextEntity]?
var updatedCachedChatMessageText: CachedChatMessageText? 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 entities = cached.entities
} else { } else {
entities = messageEntities entities = messageEntities
if let entitiesValue = entities { 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 entities = result
} }
} else { } else {
@@ -148,22 +162,22 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode {
generateEntities = true generateEntities = true
} }
if generateEntities { if generateEntities {
let parsedEntities = generateTextEntities(message.text, enabledTypes: .all) let parsedEntities = generateTextEntities(rawText, enabledTypes: .all)
if !parsedEntities.isEmpty { if !parsedEntities.isEmpty {
entities = parsedEntities 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 let bubbleTheme = item.presentationData.theme.theme.chat.bubble
if let entities = entities { 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 { } 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? var cutout: TextNodeCutout?