diff --git a/submodules/ChatListUI/Sources/Node/ChatListNode.swift b/submodules/ChatListUI/Sources/Node/ChatListNode.swift index 91470cc516..a672e32274 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListNode.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListNode.swift @@ -1009,12 +1009,12 @@ public final class ChatListNode: ListView { guard let strongSelf = self else { return } - if case .peers = strongSelf.mode { - if let strongSelf = self, let peerSelected = strongSelf.peerSelected { - peerSelected(peer, nil, true, true, nil) - } - return - } +// if case .peers = strongSelf.mode { +// if let strongSelf = self, let peerSelected = strongSelf.peerSelected { +// peerSelected(peer, nil, true, true, nil) +// } +// return +// } var didBeginSelecting = false var count = 0 strongSelf.updateState { [weak self] state in diff --git a/submodules/DrawingUI/Sources/DrawingScreen.swift b/submodules/DrawingUI/Sources/DrawingScreen.swift index f8a41d66f0..edc851263d 100644 --- a/submodules/DrawingUI/Sources/DrawingScreen.swift +++ b/submodules/DrawingUI/Sources/DrawingScreen.swift @@ -2429,6 +2429,7 @@ public class DrawingScreen: ViewController, TGPhotoDrawingInterfaceController { let contextController = ContextController(account: self.context.account, presentationData: presentationData, source: .reference(ReferenceContentSource(sourceView: sourceView, contentArea: CGRect(origin: .zero, size: CGSize(width: validLayout.size.width, height: validLayout.size.height - (validLayout.inputHeight ?? 0.0))), customPosition: CGPoint(x: 0.0, y: 1.0))), items: .single(ContextController.Items(content: .list(items)))) self.controller?.present(contextController, in: .window(.root)) self.currentFontPicker = contextController + contextController.view.disablesInteractiveKeyboardGestureRecognizer = true } @discardableResult diff --git a/submodules/MediaPickerUI/Sources/MediaPickerScreen.swift b/submodules/MediaPickerUI/Sources/MediaPickerScreen.swift index d232e7d68f..92c9b85622 100644 --- a/submodules/MediaPickerUI/Sources/MediaPickerScreen.swift +++ b/submodules/MediaPickerUI/Sources/MediaPickerScreen.swift @@ -1514,6 +1514,11 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable { let strings = self.presentationData.strings let selectionCount = self.selectionCount + var isSpoilerAvailable = true + if let peer = self.peer, case .secretChat = peer { + isSpoilerAvailable = false + } + var hasSpoilers = false var hasGeneric = false if let selectionContext = self.interaction?.selectionState, let editingContext = self.interaction?.editingState { @@ -1564,22 +1569,23 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable { self?.groupedValue = false }))) } - if !items.isEmpty { - items.append(.separator) - } - items.append(.action(ContextMenuActionItem(text: hasGeneric ? strings.Attachment_EnableSpoiler : strings.Attachment_DisableSpoiler, icon: { _ in return nil }, animationName: "anim_spoiler", action: { [weak self] _, f in - f(.default) - guard let strongSelf = self else { - return + if isSpoilerAvailable { + if !items.isEmpty { + items.append(.separator) } - - if let selectionContext = strongSelf.interaction?.selectionState, let editingContext = strongSelf.interaction?.editingState { - for case let item as TGMediaEditableItem in selectionContext.selectedItems() { - editingContext.setSpoiler(hasGeneric, for: item) + items.append(.action(ContextMenuActionItem(text: hasGeneric ? strings.Attachment_EnableSpoiler : strings.Attachment_DisableSpoiler, icon: { _ in return nil }, animationName: "anim_spoiler", action: { [weak self] _, f in + f(.default) + guard let strongSelf = self else { + return } - } - }))) - + + if let selectionContext = strongSelf.interaction?.selectionState, let editingContext = strongSelf.interaction?.editingState { + for case let item as TGMediaEditableItem in selectionContext.selectedItems() { + editingContext.setSpoiler(hasGeneric, for: item) + } + } + }))) + } return ContextController.Items(content: .list(items)) } diff --git a/submodules/PhotoResources/Sources/PhotoResources.swift b/submodules/PhotoResources/Sources/PhotoResources.swift index 7e3202b4cd..f01708cd3e 100644 --- a/submodules/PhotoResources/Sources/PhotoResources.swift +++ b/submodules/PhotoResources/Sources/PhotoResources.swift @@ -800,7 +800,7 @@ public func chatMessagePhotoInternal(photoData: Signal Signal, NoError> { +private func chatMessagePhotoThumbnailDatas(account: Account, userLocation: MediaResourceUserLocation, photoReference: ImageMediaReference, onlyFullSize: Bool = false, forceThumbnail: Bool = false) -> Signal, NoError> { let fullRepresentationSize: CGSize = CGSize(width: 1280.0, height: 1280.0) if let smallestRepresentation = smallestImageRepresentation(photoReference.media.representations), let largestRepresentation = photoReference.media.representationForDisplayAtSize(PixelDimensions(width: Int32(fullRepresentationSize.width), height: Int32(fullRepresentationSize.height))) { @@ -810,7 +810,7 @@ private func chatMessagePhotoThumbnailDatas(account: Account, userLocation: Medi let signal = maybeFullSize |> take(1) |> mapToSignal { maybeData -> Signal, NoError> in - if maybeData.complete { + if maybeData.complete, !forceThumbnail { let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) return .single(Tuple(nil, loadedData, true)) } else { @@ -850,8 +850,8 @@ private func chatMessagePhotoThumbnailDatas(account: Account, userLocation: Medi } } -public func chatMessagePhotoThumbnail(account: Account, userLocation: MediaResourceUserLocation, photoReference: ImageMediaReference, onlyFullSize: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { - let signal = chatMessagePhotoThumbnailDatas(account: account, userLocation: userLocation, photoReference: photoReference, onlyFullSize: onlyFullSize) +public func chatMessagePhotoThumbnail(account: Account, userLocation: MediaResourceUserLocation, photoReference: ImageMediaReference, onlyFullSize: Bool = false, blurred: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { + let signal = chatMessagePhotoThumbnailDatas(account: account, userLocation: userLocation, photoReference: photoReference, onlyFullSize: onlyFullSize, forceThumbnail: blurred) return signal |> map { value in let thumbnailData = value._0 @@ -875,7 +875,7 @@ public func chatMessagePhotoThumbnail(account: Account, userLocation: MediaResou var fullSizeImage: CGImage? var imageOrientation: UIImage.Orientation = .up - if let fullSizeData = fullSizeData { + if let fullSizeData = fullSizeData, !blurred { if fullSizeComplete { let options = NSMutableDictionary() options[kCGImageSourceShouldCache as NSString] = false as NSNumber @@ -904,7 +904,7 @@ public func chatMessagePhotoThumbnail(account: Account, userLocation: MediaResou var blurredThumbnailImage: UIImage? if let thumbnailImage = thumbnailImage { let thumbnailSize = CGSize(width: thumbnailImage.width, height: thumbnailImage.height) - let thumbnailContextSize = thumbnailSize.aspectFitted(CGSize(width: 150.0, height: 150.0)) + let thumbnailContextSize = thumbnailSize.aspectFitted(blurred ? CGSize(width: 50.0, height: 50.0) : CGSize(width: 150.0, height: 150.0)) if let thumbnailContext = DrawingContext(size: thumbnailContextSize, scale: 1.0) { thumbnailContext.withFlippedContext { c in c.interpolationQuality = .none @@ -912,6 +912,11 @@ public func chatMessagePhotoThumbnail(account: Account, userLocation: MediaResou } imageFastBlur(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) + if blurred { + imageFastBlur(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) + adjustSaturationInContext(context: thumbnailContext, saturation: 1.7) + } + blurredThumbnailImage = thumbnailContext.generateImage() } } @@ -943,8 +948,8 @@ public func chatMessagePhotoThumbnail(account: Account, userLocation: MediaResou } } -public func chatMessageVideoThumbnail(account: Account, userLocation: MediaResourceUserLocation, fileReference: FileMediaReference) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { - let signal = chatMessageVideoDatas(postbox: account.postbox, userLocation: userLocation, fileReference: fileReference, thumbnailSize: true, autoFetchFullSizeThumbnail: true) +public func chatMessageVideoThumbnail(account: Account, userLocation: MediaResourceUserLocation, fileReference: FileMediaReference, blurred: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { + let signal = chatMessageVideoDatas(postbox: account.postbox, userLocation: userLocation, fileReference: fileReference, thumbnailSize: true, autoFetchFullSizeThumbnail: true, forceThumbnail: blurred) return signal |> map { value in @@ -974,7 +979,7 @@ public func chatMessageVideoThumbnail(account: Account, userLocation: MediaResou var fullSizeImage: CGImage? var imageOrientation: UIImage.Orientation = .up - if let fullSizeData = fullSizeData?._0 { + if let fullSizeData = fullSizeData?._0, !blurred { if fullSizeComplete { let options = NSMutableDictionary() options[kCGImageSourceShouldCache as NSString] = false as NSNumber @@ -1002,11 +1007,11 @@ public func chatMessageVideoThumbnail(account: Account, userLocation: MediaResou var blurredThumbnailImage: UIImage? if let thumbnailImage = thumbnailImage { - if max(thumbnailImage.width, thumbnailImage.height) > 200 { + if max(thumbnailImage.width, thumbnailImage.height) > 200 && !blurred { blurredThumbnailImage = UIImage(cgImage: thumbnailImage) } else { let thumbnailSize = CGSize(width: thumbnailImage.width, height: thumbnailImage.height) - let thumbnailContextSize = thumbnailSize.aspectFitted(CGSize(width: 150.0, height: 150.0)) + let thumbnailContextSize = thumbnailSize.aspectFitted(blurred ? CGSize(width: 50.0, height: 50.0) : CGSize(width: 150.0, height: 150.0)) if let thumbnailContext = DrawingContext(size: thumbnailContextSize, scale: 1.0) { thumbnailContext.withFlippedContext { c in c.interpolationQuality = .none @@ -1014,6 +1019,11 @@ public func chatMessageVideoThumbnail(account: Account, userLocation: MediaResou } imageFastBlur(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) + if blurred { + imageFastBlur(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) + adjustSaturationInContext(context: thumbnailContext, saturation: 1.7) + } + blurredThumbnailImage = thumbnailContext.generateImage() } } @@ -1046,8 +1056,8 @@ public func chatMessageVideoThumbnail(account: Account, userLocation: MediaResou } } -public func chatSecretPhoto(account: Account, userLocation: MediaResourceUserLocation, photoReference: ImageMediaReference, synchronousLoad: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { - let signal = chatMessagePhotoDatas(postbox: account.postbox, userLocation: userLocation, photoReference: photoReference, synchronousLoad: synchronousLoad) +public func chatSecretPhoto(account: Account, userLocation: MediaResourceUserLocation, photoReference: ImageMediaReference, ignoreFullSize: Bool = false, synchronousLoad: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { + let signal = chatMessagePhotoDatas(postbox: account.postbox, userLocation: userLocation, photoReference: photoReference, synchronousLoad: synchronousLoad, forceThumbnail: ignoreFullSize) return signal |> map { value in let thumbnailData = value._0 @@ -1426,6 +1436,7 @@ public func mediaGridMessagePhoto(account: Account, userLocation: MediaResourceU if blurred { telegramFastBlurMore(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) + adjustSaturationInContext(context: thumbnailContext, saturation: 1.7) } blurredThumbnailImage = thumbnailContext.generateImage() diff --git a/submodules/TelegramCore/Sources/PendingMessages/PendingMessageUploadedContent.swift b/submodules/TelegramCore/Sources/PendingMessages/PendingMessageUploadedContent.swift index bbf912d96b..714829923b 100644 --- a/submodules/TelegramCore/Sources/PendingMessages/PendingMessageUploadedContent.swift +++ b/submodules/TelegramCore/Sources/PendingMessages/PendingMessageUploadedContent.swift @@ -423,6 +423,7 @@ private func uploadedMediaImageContent(network: Network, postbox: Postbox, trans ttlSeconds = autoclearMessageAttribute.timeout } var stickers: [Api.InputDocument]? + var hasSpoiler = false for attribute in attributes { if let attribute = attribute as? EmbeddedMediaStickersMessageAttribute { var stickersValue: [Api.InputDocument] = [] @@ -437,6 +438,7 @@ private func uploadedMediaImageContent(network: Network, postbox: Postbox, trans } } else if let _ = attribute as? MediaSpoilerMessageAttribute { flags |= 1 << 2 + hasSpoiler = true } } return postbox.transaction { transaction -> Api.InputPeer? in @@ -461,6 +463,9 @@ private func uploadedMediaImageContent(network: Network, postbox: Postbox, trans flags |= 1 << 0 ttlSeconds = autoclearMessageAttribute.timeout } + if hasSpoiler { + flags |= 1 << 1 + } return maybeCacheUploadedResource(postbox: postbox, key: referenceKey, result: .content(PendingMessageUploadedContentAndReuploadInfo(content: .media(.inputMediaPhoto(flags: flags, id: .inputPhoto(id: id, accessHash: accessHash, fileReference: Buffer(data: fileReference)), ttlSeconds: ttlSeconds), text), reuploadInfo: nil)), media: mediaImage) } default: @@ -727,6 +732,7 @@ private func uploadedMediaFileContent(network: Network, postbox: Postbox, auxili if case let .done(file, thumbnail) = fileAndThumbnailResult { var flags: Int32 = 0 + var hasSpoiler = false var thumbnailFile: Api.InputFile? if case let .file(file) = thumbnail { thumbnailFile = file @@ -743,6 +749,7 @@ private func uploadedMediaFileContent(network: Network, postbox: Postbox, auxili ttlSeconds = attribute.timeout } else if let _ = attribute as? MediaSpoilerMessageAttribute { flags |= 1 << 5 + hasSpoiler = true } } @@ -791,7 +798,11 @@ private func uploadedMediaFileContent(network: Network, postbox: Postbox, auxili switch result { case let .messageMediaDocument(_, document, _): if let document = document, let mediaFile = telegramMediaFileFromApiDocument(document), let resource = mediaFile.resource as? CloudDocumentMediaResource, let fileReference = resource.fileReference { - return maybeCacheUploadedResource(postbox: postbox, key: referenceKey, result: .content(PendingMessageUploadedContentAndReuploadInfo(content: .media(.inputMediaDocument(flags: 0, id: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: fileReference)), ttlSeconds: nil, query: nil), text), reuploadInfo: nil)), media: mediaFile) + var flags: Int32 = 0 + if hasSpoiler { + flags |= (1 << 1) + } + return maybeCacheUploadedResource(postbox: postbox, key: referenceKey, result: .content(PendingMessageUploadedContentAndReuploadInfo(content: .media(.inputMediaDocument(flags: flags, id: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: fileReference)), ttlSeconds: nil, query: nil), text), reuploadInfo: nil)), media: mediaFile) } default: break diff --git a/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentComponent.swift b/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentComponent.swift index e17f17d9a7..e2086001ce 100644 --- a/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentComponent.swift +++ b/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentComponent.swift @@ -7106,8 +7106,6 @@ public final class EmojiPagerContentComponent: Component { displaySearchWithPlaceholder = strings.EmojiSearch_SearchReactionsPlaceholder } else if isStatusSelection { displaySearchWithPlaceholder = strings.EmojiSearch_SearchStatusesPlaceholder - } else if isTopicIconSelection { - displaySearchWithPlaceholder = strings.EmojiSearch_SearchTopicIconsPlaceholder } else if isEmojiSelection { displaySearchWithPlaceholder = strings.EmojiSearch_SearchEmojiPlaceholder searchInitiallyHidden = false diff --git a/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift index 8b8c7718eb..dc21c182e1 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift @@ -185,6 +185,7 @@ private class ExtendedMediaOverlayNode: ASDisplayNode { private var maskView: UIView? private var maskLayer: CAShapeLayer? + private var randomId: Int32? var isRevealed = false var tapped: () -> Void = {} @@ -270,17 +271,20 @@ private class ExtendedMediaOverlayNode: ASDisplayNode { return result } - func update(size: CGSize, text: String, imageSignal: (Signal<(TransformImageArguments) -> DrawingContext?, NoError>, CGSize, CGSize)?, imageFrame: CGRect, corners: ImageCorners?) { + func update(size: CGSize, text: String, imageSignal: (Signal<(TransformImageArguments) -> DrawingContext?, NoError>, CGSize, CGSize, Int32)?, imageFrame: CGRect, corners: ImageCorners?) { let spacing: CGFloat = 2.0 let padding: CGFloat = 10.0 - if let (imageSignal, drawingSize, boundingSize) = imageSignal { - self.blurredImageNode.setSignal(imageSignal, attemptSynchronously: true) - - let imageLayout = self.blurredImageNode.asyncLayout() - let arguments = TransformImageArguments(corners: corners ?? ImageCorners(), imageSize: drawingSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets(), resizeMode: .blurBackground, emptyColor: .clear, custom: nil) - let apply = imageLayout(arguments) - apply() + if let (imageSignal, drawingSize, boundingSize, randomId) = imageSignal { + if self.randomId != randomId { + self.randomId = randomId + self.blurredImageNode.setSignal(imageSignal, attemptSynchronously: true) + + let imageLayout = self.blurredImageNode.asyncLayout() + let arguments = TransformImageArguments(corners: corners ?? ImageCorners(), imageSize: drawingSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets(), resizeMode: .blurBackground, emptyColor: .clear, custom: nil) + let apply = imageLayout(arguments) + apply() + } self.blurredImageNode.isHidden = false @@ -343,7 +347,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio private let imageNode: TransformImageNode private var currentImageArguments: TransformImageArguments? private var currentHighQualityImageSignal: (Signal<(TransformImageArguments) -> DrawingContext?, NoError>, CGSize)? - private var currentBlurredImageSignal: (Signal<(TransformImageArguments) -> DrawingContext?, NoError>, CGSize, CGSize)? + private var currentBlurredImageSignal: (Signal<(TransformImageArguments) -> DrawingContext?, NoError>, CGSize, CGSize, Int32)? private var highQualityImageNode: TransformImageNode? private var videoNode: UniversalVideoNode? @@ -1010,7 +1014,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio return chatMessagePhoto(postbox: context.account.postbox, userLocation: .peer(message.id.peerId), photoReference: .message(message: MessageReference(message), media: image), synchronousLoad: synchronousLoad, highQuality: highQuality) } updateBlurredImageSignal = { synchronousLoad, _ in - return chatSecretPhoto(account: context.account, userLocation: .peer(message.id.peerId), photoReference: .message(message: MessageReference(message), media: image), synchronousLoad: true) + return chatSecretPhoto(account: context.account, userLocation: .peer(message.id.peerId), photoReference: .message(message: MessageReference(message), media: image), ignoreFullSize: true, synchronousLoad: true) } } @@ -1399,7 +1403,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio strongSelf.currentHighQualityImageSignal = (updateImageSignal(false, true), imageDimensions) if let updateBlurredImageSignal = updateBlurredImageSignal { - strongSelf.currentBlurredImageSignal = (updateBlurredImageSignal(false, true), drawingSize, boundingSize) + strongSelf.currentBlurredImageSignal = (updateBlurredImageSignal(false, true), drawingSize, boundingSize, Int32.random(in: 0.. DrawingContext?, NoError>? if let updatedMediaReference = updatedMediaReference, mediaUpdated && imageDimensions != nil { if let imageReference = updatedMediaReference.concrete(TelegramMediaImage.self) { - updateImageSignal = chatMessagePhotoThumbnail(account: arguments.context.account, userLocation: .peer(arguments.message.id.peerId), photoReference: imageReference) + updateImageSignal = chatMessagePhotoThumbnail(account: arguments.context.account, userLocation: .peer(arguments.message.id.peerId), photoReference: imageReference, blurred: hasSpoiler) } else if let fileReference = updatedMediaReference.concrete(TelegramMediaFile.self) { if fileReference.media.isVideo { - updateImageSignal = chatMessageVideoThumbnail(account: arguments.context.account, userLocation: .peer(arguments.message.id.peerId), fileReference: fileReference) + updateImageSignal = chatMessageVideoThumbnail(account: arguments.context.account, userLocation: .peer(arguments.message.id.peerId), fileReference: fileReference, blurred: hasSpoiler) } else if let iconImageRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) { updateImageSignal = chatWebpageSnippetFile(account: arguments.context.account, userLocation: .peer(arguments.message.id.peerId), mediaReference: fileReference.abstract, representation: iconImageRepresentation) } diff --git a/submodules/TelegramUI/Sources/ChatPinnedMessageTitlePanelNode.swift b/submodules/TelegramUI/Sources/ChatPinnedMessageTitlePanelNode.swift index fda53c1487..bc8cf1ed89 100644 --- a/submodules/TelegramUI/Sources/ChatPinnedMessageTitlePanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatPinnedMessageTitlePanelNode.swift @@ -622,19 +622,21 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode { mediaUpdated = true } + let hasSpoiler = message.attributes.contains(where: { $0 is MediaSpoilerMessageAttribute }) + var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>? var updatedFetchMediaSignal: Signal? if mediaUpdated { if let updatedMediaReference = updatedMediaReference, imageDimensions != nil { if let imageReference = updatedMediaReference.concrete(TelegramMediaImage.self) { - updateImageSignal = chatMessagePhotoThumbnail(account: context.account, userLocation: .peer(message.id.peerId), photoReference: imageReference) + updateImageSignal = chatMessagePhotoThumbnail(account: context.account, userLocation: .peer(message.id.peerId), photoReference: imageReference, blurred: hasSpoiler) } else if let fileReference = updatedMediaReference.concrete(TelegramMediaFile.self) { if fileReference.media.isAnimatedSticker { let dimensions = fileReference.media.dimensions ?? PixelDimensions(width: 512, height: 512) updateImageSignal = chatMessageAnimatedSticker(postbox: context.account.postbox, userLocation: .peer(message.id.peerId), file: fileReference.media, small: false, size: dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0))) updatedFetchMediaSignal = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, userLocation: .peer(message.id.peerId), userContentType: MediaResourceUserContentType(file: fileReference.media), reference: fileReference.resourceReference(fileReference.media.resource)) } else if fileReference.media.isVideo || fileReference.media.isAnimated { - updateImageSignal = chatMessageVideoThumbnail(account: context.account, userLocation: .peer(message.id.peerId), fileReference: fileReference) + updateImageSignal = chatMessageVideoThumbnail(account: context.account, userLocation: .peer(message.id.peerId), fileReference: fileReference, blurred: hasSpoiler) } else if let iconImageRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) { updateImageSignal = chatWebpageSnippetFile(account: context.account, userLocation: .peer(message.id.peerId), mediaReference: fileReference.abstract, representation: iconImageRepresentation) } diff --git a/submodules/TelegramUI/Sources/EditAccessoryPanelNode.swift b/submodules/TelegramUI/Sources/EditAccessoryPanelNode.swift index 1f0d8fdcc7..0c7657eeca 100644 --- a/submodules/TelegramUI/Sources/EditAccessoryPanelNode.swift +++ b/submodules/TelegramUI/Sources/EditAccessoryPanelNode.swift @@ -232,16 +232,18 @@ final class EditAccessoryPanelNode: AccessoryPanelNode { } self.previousMediaReference = updatedMediaReference + let hasSpoiler = message?.attributes.contains(where: { $0 is MediaSpoilerMessageAttribute }) ?? false + var isPhoto = false var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>? if mediaUpdated { if let updatedMediaReference = updatedMediaReference, imageDimensions != nil { if let imageReference = updatedMediaReference.concrete(TelegramMediaImage.self) { - updateImageSignal = chatMessagePhotoThumbnail(account: self.context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, photoReference: imageReference) + updateImageSignal = chatMessagePhotoThumbnail(account: self.context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, photoReference: imageReference, blurred: hasSpoiler) isPhoto = true } else if let fileReference = updatedMediaReference.concrete(TelegramMediaFile.self) { if fileReference.media.isVideo { - updateImageSignal = chatMessageVideoThumbnail(account: self.context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, fileReference: fileReference) + updateImageSignal = chatMessageVideoThumbnail(account: self.context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, fileReference: fileReference, blurred: hasSpoiler) } else if let iconImageRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) { updateImageSignal = chatWebpageSnippetFile(account: self.context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, mediaReference: fileReference.abstract, representation: iconImageRepresentation) } diff --git a/submodules/TelegramUI/Sources/ReplyAccessoryPanelNode.swift b/submodules/TelegramUI/Sources/ReplyAccessoryPanelNode.swift index 523163d969..836338c3ee 100644 --- a/submodules/TelegramUI/Sources/ReplyAccessoryPanelNode.swift +++ b/submodules/TelegramUI/Sources/ReplyAccessoryPanelNode.swift @@ -205,14 +205,16 @@ final class ReplyAccessoryPanelNode: AccessoryPanelNode { } strongSelf.previousMediaReference = updatedMediaReference + let hasSpoiler = message?.attributes.contains(where: { $0 is MediaSpoilerMessageAttribute }) ?? false + var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>? if mediaUpdated { if let updatedMediaReference = updatedMediaReference, imageDimensions != nil { if let imageReference = updatedMediaReference.concrete(TelegramMediaImage.self) { - updateImageSignal = chatMessagePhotoThumbnail(account: context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, photoReference: imageReference) + updateImageSignal = chatMessagePhotoThumbnail(account: context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, photoReference: imageReference, blurred: hasSpoiler) } else if let fileReference = updatedMediaReference.concrete(TelegramMediaFile.self) { if fileReference.media.isVideo { - updateImageSignal = chatMessageVideoThumbnail(account: context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, fileReference: fileReference) + updateImageSignal = chatMessageVideoThumbnail(account: context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, fileReference: fileReference, blurred: hasSpoiler) } else if let iconImageRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) { updateImageSignal = chatWebpageSnippetFile(account: context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, mediaReference: fileReference.abstract, representation: iconImageRepresentation) }