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 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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 = " "
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|||||||
Reference in New Issue
Block a user