This commit is contained in:
Peter 2019-03-24 20:49:23 +04:00
parent 90f3be0ca8
commit 53b3408cb7
2 changed files with 105 additions and 121 deletions

View File

@ -21,18 +21,8 @@ func chatHistoryEntriesForView(location: ChatLocation, view: MessageHistoryView,
var groupBucket: [(Message, Bool, ChatHistoryMessageSelection, ChatMessageEntryAttributes)] = [] var groupBucket: [(Message, Bool, ChatHistoryMessageSelection, ChatMessageEntryAttributes)] = []
loop: for entry in view.entries { loop: for entry in view.entries {
switch entry { if entry.message.id.peerId.namespace == Namespaces.Peer.CloudChannel || entry.message.id.peerId.namespace == Namespaces.Peer.CloudUser {
case let .HoleEntry(hole, _): for media in entry.message.media {
if !groupBucket.isEmpty {
entries.append(.MessageGroupEntry(groupBucket[0].0.groupInfo!, groupBucket, presentationData))
groupBucket.removeAll()
}
if view.tagMask == nil {
entries.append(.HoleEntry(hole, presentationData))
}
case let .MessageEntry(message, read, _, monthLocation, attributes):
if message.id.peerId.namespace == Namespaces.Peer.CloudChannel || message.id.peerId.namespace == Namespaces.Peer.CloudUser {
for media in message.media {
if let action = media as? TelegramMediaAction { if let action = media as? TelegramMediaAction {
switch action.action { switch action.action {
case .channelMigratedFromGroup, .groupMigratedToChannel, .historyCleared: case .channelMigratedFromGroup, .groupMigratedToChannel, .historyCleared:
@ -45,41 +35,40 @@ func chatHistoryEntriesForView(location: ChatLocation, view: MessageHistoryView,
} }
var isAdmin = false var isAdmin = false
if let author = message.author { if let author = entry.message.author {
isAdmin = adminIds.contains(author.id) isAdmin = adminIds.contains(author.id)
} }
if groupMessages { if groupMessages {
if !groupBucket.isEmpty && message.groupInfo != groupBucket[0].0.groupInfo { if !groupBucket.isEmpty && entry.message.groupInfo != groupBucket[0].0.groupInfo {
entries.append(.MessageGroupEntry(groupBucket[0].0.groupInfo!, groupBucket, presentationData)) entries.append(.MessageGroupEntry(groupBucket[0].0.groupInfo!, groupBucket, presentationData))
groupBucket.removeAll() groupBucket.removeAll()
} }
if let _ = message.groupInfo { if let _ = entry.message.groupInfo {
let selection: ChatHistoryMessageSelection let selection: ChatHistoryMessageSelection
if let selectedMessages = selectedMessages { if let selectedMessages = selectedMessages {
selection = .selectable(selected: selectedMessages.contains(message.id)) selection = .selectable(selected: selectedMessages.contains(entry.message.id))
} else { } else {
selection = .none selection = .none
} }
groupBucket.append((message, read, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: attributes.authorIsContact))) groupBucket.append((entry.message, entry.isRead, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: entry.attributes.authorIsContact)))
} else { } else {
let selection: ChatHistoryMessageSelection let selection: ChatHistoryMessageSelection
if let selectedMessages = selectedMessages { if let selectedMessages = selectedMessages {
selection = .selectable(selected: selectedMessages.contains(message.id)) selection = .selectable(selected: selectedMessages.contains(entry.message.id))
} else { } else {
selection = .none selection = .none
} }
entries.append(.MessageEntry(message, presentationData, read, monthLocation, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: attributes.authorIsContact))) entries.append(.MessageEntry(entry.message, presentationData, entry.isRead, entry.monthLocation, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: entry.attributes.authorIsContact)))
} }
} else { } else {
let selection: ChatHistoryMessageSelection let selection: ChatHistoryMessageSelection
if let selectedMessages = selectedMessages { if let selectedMessages = selectedMessages {
selection = .selectable(selected: selectedMessages.contains(message.id)) selection = .selectable(selected: selectedMessages.contains(entry.message.id))
} else { } else {
selection = .none selection = .none
} }
entries.append(.MessageEntry(message, presentationData, read, monthLocation, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: attributes.authorIsContact))) entries.append(.MessageEntry(entry.message, presentationData, entry.isRead, entry.monthLocation, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: entry.attributes.authorIsContact)))
}
} }
} }

View File

@ -132,33 +132,31 @@ private func galleryMessageCaptionText(_ message: Message) -> String {
} }
func galleryItemForEntry(context: AccountContext, presentationData: PresentationData, entry: MessageHistoryEntry, isCentral: Bool = false, streamVideos: Bool, loopVideos: Bool = false, hideControls: Bool = false, fromPlayingVideo: Bool = false, landscape: Bool = false, tempFilePath: String? = nil, playbackCompleted: @escaping () -> Void = {}, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void = { _ in }, openActionOptions: @escaping (GalleryControllerInteractionTapAction) -> Void = { _ in }) -> GalleryItem? { func galleryItemForEntry(context: AccountContext, presentationData: PresentationData, entry: MessageHistoryEntry, isCentral: Bool = false, streamVideos: Bool, loopVideos: Bool = false, hideControls: Bool = false, fromPlayingVideo: Bool = false, landscape: Bool = false, tempFilePath: String? = nil, playbackCompleted: @escaping () -> Void = {}, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void = { _ in }, openActionOptions: @escaping (GalleryControllerInteractionTapAction) -> Void = { _ in }) -> GalleryItem? {
switch entry { if let (media, mediaImage) = mediaForMessage(message: entry.message) {
case let .MessageEntry(message, _, location, _, _):
if let (media, mediaImage) = mediaForMessage(message: message) {
if let _ = media as? TelegramMediaImage { if let _ = media as? TelegramMediaImage {
return ChatImageGalleryItem(context: context, presentationData: presentationData, message: message, location: location, performAction: performAction, openActionOptions: openActionOptions) return ChatImageGalleryItem(context: context, presentationData: presentationData, message: entry.message, location: entry.location, performAction: performAction, openActionOptions: openActionOptions)
} else if let file = media as? TelegramMediaFile { } else if let file = media as? TelegramMediaFile {
if file.isVideo { if file.isVideo {
let content: UniversalVideoContent let content: UniversalVideoContent
if file.isAnimated { if file.isAnimated {
content = NativeVideoContent(id: .message(message.id, message.stableId, file.fileId), fileReference: .message(message: MessageReference(message), media: file), imageReference: mediaImage.flatMap({ ImageMediaReference.message(message: MessageReference(message), media: $0) }), loopVideo: true, enableSound: false, tempFilePath: tempFilePath) content = NativeVideoContent(id: .message(entry.message.id, entry.message.stableId, file.fileId), fileReference: .message(message: MessageReference(entry.message), media: file), imageReference: mediaImage.flatMap({ ImageMediaReference.message(message: MessageReference(entry.message), media: $0) }), loopVideo: true, enableSound: false, tempFilePath: tempFilePath)
} else { } else {
if true || (file.mimeType == "video/mpeg4" || file.mimeType == "video/mov" || file.mimeType == "video/mp4") { if true || (file.mimeType == "video/mpeg4" || file.mimeType == "video/mov" || file.mimeType == "video/mp4") {
content = NativeVideoContent(id: .message(message.id, message.stableId, file.fileId), fileReference: .message(message: MessageReference(message), media: file), imageReference: mediaImage.flatMap({ ImageMediaReference.message(message: MessageReference(message), media: $0) }), streamVideo: .conservative, loopVideo: loopVideos, tempFilePath: tempFilePath) content = NativeVideoContent(id: .message(entry.message.id, entry.message.stableId, file.fileId), fileReference: .message(message: MessageReference(entry.message), media: file), imageReference: mediaImage.flatMap({ ImageMediaReference.message(message: MessageReference(entry.message), media: $0) }), streamVideo: .conservative, loopVideo: loopVideos, tempFilePath: tempFilePath)
} else { } else {
content = PlatformVideoContent(id: .message(message.id, message.stableId, file.fileId), fileReference: .message(message: MessageReference(message), media: file), streamVideo: streamVideos, loopVideo: loopVideos) content = PlatformVideoContent(id: .message(entry.message.id, entry.message.stableId, file.fileId), fileReference: .message(message: MessageReference(entry.message), media: file), streamVideo: streamVideos, loopVideo: loopVideos)
} }
} }
var entities: [MessageTextEntity] = [] var entities: [MessageTextEntity] = []
for attribute in message.attributes { for attribute in entry.message.attributes {
if let attribute = attribute as? TextEntitiesMessageAttribute { if let attribute = attribute as? TextEntitiesMessageAttribute {
entities = attribute.entities entities = attribute.entities
break break
} }
} }
let caption = galleryCaptionStringWithAppliedEntities(galleryMessageCaptionText(message), entities: entities) let caption = galleryCaptionStringWithAppliedEntities(galleryMessageCaptionText(entry.message), entities: entities)
return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: content, originData: GalleryItemOriginData(title: message.author?.displayTitle, timestamp: message.timestamp), indexData: location.flatMap { GalleryItemIndexData(position: Int32($0.index), totalCount: Int32($0.count)) }, contentInfo: .message(message), caption: caption, hideControls: hideControls, fromPlayingVideo: fromPlayingVideo, landscape: landscape, playbackCompleted: playbackCompleted, performAction: performAction, openActionOptions: openActionOptions) return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: content, originData: GalleryItemOriginData(title: entry.message.author?.displayTitle, timestamp: entry.message.timestamp), indexData: entry.location.flatMap { GalleryItemIndexData(position: Int32($0.index), totalCount: Int32($0.count)) }, contentInfo: .message(entry.message), caption: caption, hideControls: hideControls, fromPlayingVideo: fromPlayingVideo, landscape: landscape, playbackCompleted: playbackCompleted, performAction: performAction, openActionOptions: openActionOptions)
} else { } else {
if file.mimeType.hasPrefix("image/") && file.mimeType != "image/gif" { if file.mimeType.hasPrefix("image/") && file.mimeType != "image/gif" {
var pixelsCount: Int = 0 var pixelsCount: Int = 0
@ -166,25 +164,25 @@ func galleryItemForEntry(context: AccountContext, presentationData: Presentation
pixelsCount = Int(dimensions.width) * Int(dimensions.height) pixelsCount = Int(dimensions.width) * Int(dimensions.height)
} }
if (file.size == nil || file.size! < 4 * 1024 * 1024) && pixelsCount < 4096 * 4096 { if (file.size == nil || file.size! < 4 * 1024 * 1024) && pixelsCount < 4096 * 4096 {
return ChatImageGalleryItem(context: context, presentationData: presentationData, message: message, location: location, performAction: performAction, openActionOptions: openActionOptions) return ChatImageGalleryItem(context: context, presentationData: presentationData, message: entry.message, location: entry.location, performAction: performAction, openActionOptions: openActionOptions)
} else { } else {
return ChatDocumentGalleryItem(context: context, presentationData: presentationData, message: message, location: location) return ChatDocumentGalleryItem(context: context, presentationData: presentationData, message: entry.message, location: entry.location)
} }
} else if internalDocumentItemSupportsMimeType(file.mimeType, fileName: file.fileName) { } else if internalDocumentItemSupportsMimeType(file.mimeType, fileName: file.fileName) {
return ChatDocumentGalleryItem(context: context, presentationData: presentationData, message: message, location: location) return ChatDocumentGalleryItem(context: context, presentationData: presentationData, message: entry.message, location: entry.location)
} else { } else {
return ChatExternalFileGalleryItem(context: context, presentationData: presentationData, message: message, location: location) return ChatExternalFileGalleryItem(context: context, presentationData: presentationData, message: entry.message, location: entry.location)
} }
} }
} else if let webpage = media as? TelegramMediaWebpage, case let .Loaded(webpageContent) = webpage.content { } else if let webpage = media as? TelegramMediaWebpage, case let .Loaded(webpageContent) = webpage.content {
var content: UniversalVideoContent? var content: UniversalVideoContent?
switch websiteType(of: webpageContent) { switch websiteType(of: webpageContent) {
case .instagram where webpageContent.file != nil && webpageContent.image != nil && webpageContent.file!.isVideo: case .instagram where webpageContent.file != nil && webpageContent.image != nil && webpageContent.file!.isVideo:
content = NativeVideoContent(id: .message(message.id, message.stableId, webpageContent.file?.id ?? webpage.webpageId), fileReference: .message(message: MessageReference(message), media: webpageContent.file!), imageReference: webpageContent.image.flatMap({ ImageMediaReference.message(message: MessageReference(message), media: $0) }), streamVideo: .conservative, enableSound: true) content = NativeVideoContent(id: .message(entry.message.id, entry.message.stableId, webpageContent.file?.id ?? webpage.webpageId), fileReference: .message(message: MessageReference(entry.message), media: webpageContent.file!), imageReference: webpageContent.image.flatMap({ ImageMediaReference.message(message: MessageReference(entry.message), media: $0) }), streamVideo: .conservative, enableSound: true)
default: default:
if let embedUrl = webpageContent.embedUrl, let image = webpageContent.image { if let embedUrl = webpageContent.embedUrl, let image = webpageContent.image {
if let file = webpageContent.file, file.isVideo { if let file = webpageContent.file, file.isVideo {
content = NativeVideoContent(id: .message(message.id, message.stableId, file.fileId), fileReference: .message(message: MessageReference(message), media: file), imageReference: mediaImage.flatMap({ ImageMediaReference.message(message: MessageReference(message), media: $0) }), streamVideo: .conservative, loopVideo: loopVideos, tempFilePath: tempFilePath) content = NativeVideoContent(id: .message(entry.message.id, entry.message.stableId, file.fileId), fileReference: .message(message: MessageReference(entry.message), media: file), imageReference: mediaImage.flatMap({ ImageMediaReference.message(message: MessageReference(entry.message), media: $0) }), streamVideo: .conservative, loopVideo: loopVideos, tempFilePath: tempFilePath)
} else if URL(string: embedUrl)?.pathExtension == "mp4" { } else if URL(string: embedUrl)?.pathExtension == "mp4" {
content = SystemVideoContent(url: embedUrl, imageReference: .webPage(webPage: WebpageReference(webpage), media: image), dimensions: webpageContent.embedSize ?? CGSize(width: 640.0, height: 640.0), duration: Int32(webpageContent.duration ?? 0)) content = SystemVideoContent(url: embedUrl, imageReference: .webPage(webPage: WebpageReference(webpage), media: image), dimensions: webpageContent.embedSize ?? CGSize(width: 640.0, height: 640.0), duration: Int32(webpageContent.duration ?? 0))
} }
@ -194,15 +192,12 @@ func galleryItemForEntry(context: AccountContext, presentationData: Presentation
} }
} }
if let content = content { if let content = content {
return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: content, originData: GalleryItemOriginData(title: message.author?.displayTitle, timestamp: message.timestamp), indexData: location.flatMap { GalleryItemIndexData(position: Int32($0.index), totalCount: Int32($0.count)) }, contentInfo: .message(message), caption: NSAttributedString(string: ""), fromPlayingVideo: fromPlayingVideo, landscape: landscape, performAction: performAction, openActionOptions: openActionOptions) return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: content, originData: GalleryItemOriginData(title: entry.message.author?.displayTitle, timestamp: entry.message.timestamp), indexData: entry.location.flatMap { GalleryItemIndexData(position: Int32($0.index), totalCount: Int32($0.count)) }, contentInfo: .message(entry.message), caption: NSAttributedString(string: ""), fromPlayingVideo: fromPlayingVideo, landscape: landscape, performAction: performAction, openActionOptions: openActionOptions)
} else { } else {
return nil return nil
} }
} }
} }
default:
break
}
return nil return nil
} }