From 53b3408cb72bae7a2dabc026792daae873bdff68 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Sun, 24 Mar 2019 20:49:23 +0400 Subject: [PATCH] Temp --- TelegramUI/ChatHistoryEntriesForView.swift | 99 +++++++--------- TelegramUI/GalleryController.swift | 127 ++++++++++----------- 2 files changed, 105 insertions(+), 121 deletions(-) diff --git a/TelegramUI/ChatHistoryEntriesForView.swift b/TelegramUI/ChatHistoryEntriesForView.swift index e6e939ebd4..c86e136f8f 100644 --- a/TelegramUI/ChatHistoryEntriesForView.swift +++ b/TelegramUI/ChatHistoryEntriesForView.swift @@ -21,65 +21,54 @@ func chatHistoryEntriesForView(location: ChatLocation, view: MessageHistoryView, var groupBucket: [(Message, Bool, ChatHistoryMessageSelection, ChatMessageEntryAttributes)] = [] loop: for entry in view.entries { - switch entry { - case let .HoleEntry(hole, _): - 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 { - switch action.action { - case .channelMigratedFromGroup, .groupMigratedToChannel, .historyCleared: - continue loop - default: - break - } - } + if entry.message.id.peerId.namespace == Namespaces.Peer.CloudChannel || entry.message.id.peerId.namespace == Namespaces.Peer.CloudUser { + for media in entry.message.media { + if let action = media as? TelegramMediaAction { + switch action.action { + case .channelMigratedFromGroup, .groupMigratedToChannel, .historyCleared: + continue loop + default: + break } } - - var isAdmin = false - if let author = message.author { - isAdmin = adminIds.contains(author.id) - } - - if groupMessages { - if !groupBucket.isEmpty && message.groupInfo != groupBucket[0].0.groupInfo { - entries.append(.MessageGroupEntry(groupBucket[0].0.groupInfo!, groupBucket, presentationData)) - groupBucket.removeAll() - } - if let _ = message.groupInfo { - let selection: ChatHistoryMessageSelection - if let selectedMessages = selectedMessages { - selection = .selectable(selected: selectedMessages.contains(message.id)) - } else { - selection = .none - } - groupBucket.append((message, read, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: attributes.authorIsContact))) - } else { - let selection: ChatHistoryMessageSelection - if let selectedMessages = selectedMessages { - selection = .selectable(selected: selectedMessages.contains(message.id)) - } else { - selection = .none - } - entries.append(.MessageEntry(message, presentationData, read, monthLocation, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: attributes.authorIsContact))) - } + } + } + + var isAdmin = false + if let author = entry.message.author { + isAdmin = adminIds.contains(author.id) + } + + if groupMessages { + if !groupBucket.isEmpty && entry.message.groupInfo != groupBucket[0].0.groupInfo { + entries.append(.MessageGroupEntry(groupBucket[0].0.groupInfo!, groupBucket, presentationData)) + groupBucket.removeAll() + } + if let _ = entry.message.groupInfo { + let selection: ChatHistoryMessageSelection + if let selectedMessages = selectedMessages { + selection = .selectable(selected: selectedMessages.contains(entry.message.id)) } else { - let selection: ChatHistoryMessageSelection - if let selectedMessages = selectedMessages { - selection = .selectable(selected: selectedMessages.contains(message.id)) - } else { - selection = .none - } - entries.append(.MessageEntry(message, presentationData, read, monthLocation, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: attributes.authorIsContact))) + selection = .none } + groupBucket.append((entry.message, entry.isRead, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: entry.attributes.authorIsContact))) + } else { + let selection: ChatHistoryMessageSelection + if let selectedMessages = selectedMessages { + selection = .selectable(selected: selectedMessages.contains(entry.message.id)) + } else { + selection = .none + } + entries.append(.MessageEntry(entry.message, presentationData, entry.isRead, entry.monthLocation, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: entry.attributes.authorIsContact))) + } + } else { + let selection: ChatHistoryMessageSelection + if let selectedMessages = selectedMessages { + selection = .selectable(selected: selectedMessages.contains(entry.message.id)) + } else { + selection = .none + } + entries.append(.MessageEntry(entry.message, presentationData, entry.isRead, entry.monthLocation, selection, ChatMessageEntryAttributes(isAdmin: isAdmin, isContact: entry.attributes.authorIsContact))) } } diff --git a/TelegramUI/GalleryController.swift b/TelegramUI/GalleryController.swift index a8dd2c5dee..7db3ad34f3 100644 --- a/TelegramUI/GalleryController.swift +++ b/TelegramUI/GalleryController.swift @@ -132,76 +132,71 @@ 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? { - switch entry { - case let .MessageEntry(message, _, location, _, _): - if let (media, mediaImage) = mediaForMessage(message: message) { - if let _ = media as? TelegramMediaImage { - return ChatImageGalleryItem(context: context, presentationData: presentationData, message: message, location: location, performAction: performAction, openActionOptions: openActionOptions) - } else if let file = media as? TelegramMediaFile { - if file.isVideo { - let content: UniversalVideoContent - 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) - } else { - 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) - } else { - content = PlatformVideoContent(id: .message(message.id, message.stableId, file.fileId), fileReference: .message(message: MessageReference(message), media: file), streamVideo: streamVideos, loopVideo: loopVideos) - } - } - - var entities: [MessageTextEntity] = [] - for attribute in message.attributes { - if let attribute = attribute as? TextEntitiesMessageAttribute { - entities = attribute.entities - break - } - } - let caption = galleryCaptionStringWithAppliedEntities(galleryMessageCaptionText(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) + if let (media, mediaImage) = mediaForMessage(message: entry.message) { + if let _ = media as? TelegramMediaImage { + return ChatImageGalleryItem(context: context, presentationData: presentationData, message: entry.message, location: entry.location, performAction: performAction, openActionOptions: openActionOptions) + } else if let file = media as? TelegramMediaFile { + if file.isVideo { + let content: UniversalVideoContent + if file.isAnimated { + 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 { + if true || (file.mimeType == "video/mpeg4" || file.mimeType == "video/mov" || file.mimeType == "video/mp4") { + 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 file.mimeType.hasPrefix("image/") && file.mimeType != "image/gif" { - var pixelsCount: Int = 0 - if let dimensions = file.dimensions { - pixelsCount = Int(dimensions.width) * Int(dimensions.height) - } - 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) - } else { - return ChatDocumentGalleryItem(context: context, presentationData: presentationData, message: message, location: location) - } - } else if internalDocumentItemSupportsMimeType(file.mimeType, fileName: file.fileName) { - return ChatDocumentGalleryItem(context: context, presentationData: presentationData, message: message, location: location) - } else { - return ChatExternalFileGalleryItem(context: context, presentationData: presentationData, message: message, location: location) - } - } - } else if let webpage = media as? TelegramMediaWebpage, case let .Loaded(webpageContent) = webpage.content { - var content: UniversalVideoContent? - switch websiteType(of: webpageContent) { - 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) - default: - if let embedUrl = webpageContent.embedUrl, let image = webpageContent.image { - 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) - } 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)) - } - } - if content == nil, let webEmbedContent = WebEmbedVideoContent(webPage: webpage, webpageContent: webpageContent) { - content = webEmbedContent - } - } - 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) - } else { - return nil + 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] = [] + for attribute in entry.message.attributes { + if let attribute = attribute as? TextEntitiesMessageAttribute { + entities = attribute.entities + break + } + } + let caption = galleryCaptionStringWithAppliedEntities(galleryMessageCaptionText(entry.message), entities: entities) + 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 { + if file.mimeType.hasPrefix("image/") && file.mimeType != "image/gif" { + var pixelsCount: Int = 0 + if let dimensions = file.dimensions { + pixelsCount = Int(dimensions.width) * Int(dimensions.height) + } + if (file.size == nil || file.size! < 4 * 1024 * 1024) && pixelsCount < 4096 * 4096 { + return ChatImageGalleryItem(context: context, presentationData: presentationData, message: entry.message, location: entry.location, performAction: performAction, openActionOptions: openActionOptions) + } else { + return ChatDocumentGalleryItem(context: context, presentationData: presentationData, message: entry.message, location: entry.location) + } + } else if internalDocumentItemSupportsMimeType(file.mimeType, fileName: file.fileName) { + return ChatDocumentGalleryItem(context: context, presentationData: presentationData, message: entry.message, location: entry.location) + } else { + return ChatExternalFileGalleryItem(context: context, presentationData: presentationData, message: entry.message, location: entry.location) + } } - default: - break + } else if let webpage = media as? TelegramMediaWebpage, case let .Loaded(webpageContent) = webpage.content { + var content: UniversalVideoContent? + switch websiteType(of: webpageContent) { + case .instagram where webpageContent.file != nil && webpageContent.image != nil && webpageContent.file!.isVideo: + 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: + if let embedUrl = webpageContent.embedUrl, let image = webpageContent.image { + if let file = webpageContent.file, file.isVideo { + 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" { + 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)) + } + } + if content == nil, let webEmbedContent = WebEmbedVideoContent(webPage: webpage, webpageContent: webpageContent) { + content = webEmbedContent + } + } + if let content = content { + 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 { + return nil + } + } } return nil }