mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
Add support for unsupported media
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = " "
|
||||
|
||||
@@ -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?
|
||||
|
||||
Reference in New Issue
Block a user