Spoiler improvements

This commit is contained in:
Ilya Laktyushin 2022-12-26 13:36:22 +04:00
parent 96f40088e3
commit 1ff6ef1a39
11 changed files with 94 additions and 55 deletions

View File

@ -1009,12 +1009,12 @@ public final class ChatListNode: ListView {
guard let strongSelf = self else { guard let strongSelf = self else {
return return
} }
if case .peers = strongSelf.mode { // if case .peers = strongSelf.mode {
if let strongSelf = self, let peerSelected = strongSelf.peerSelected { // if let strongSelf = self, let peerSelected = strongSelf.peerSelected {
peerSelected(peer, nil, true, true, nil) // peerSelected(peer, nil, true, true, nil)
} // }
return // return
} // }
var didBeginSelecting = false var didBeginSelecting = false
var count = 0 var count = 0
strongSelf.updateState { [weak self] state in strongSelf.updateState { [weak self] state in

View File

@ -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)))) 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.controller?.present(contextController, in: .window(.root))
self.currentFontPicker = contextController self.currentFontPicker = contextController
contextController.view.disablesInteractiveKeyboardGestureRecognizer = true
} }
@discardableResult @discardableResult

View File

@ -1514,6 +1514,11 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
let strings = self.presentationData.strings let strings = self.presentationData.strings
let selectionCount = self.selectionCount let selectionCount = self.selectionCount
var isSpoilerAvailable = true
if let peer = self.peer, case .secretChat = peer {
isSpoilerAvailable = false
}
var hasSpoilers = false var hasSpoilers = false
var hasGeneric = false var hasGeneric = false
if let selectionContext = self.interaction?.selectionState, let editingContext = self.interaction?.editingState { if let selectionContext = self.interaction?.selectionState, let editingContext = self.interaction?.editingState {
@ -1564,6 +1569,7 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
self?.groupedValue = false self?.groupedValue = false
}))) })))
} }
if isSpoilerAvailable {
if !items.isEmpty { if !items.isEmpty {
items.append(.separator) items.append(.separator)
} }
@ -1579,7 +1585,7 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
} }
} }
}))) })))
}
return ContextController.Items(content: .list(items)) return ContextController.Items(content: .list(items))
} }

View File

@ -800,7 +800,7 @@ public func chatMessagePhotoInternal(photoData: Signal<Tuple4<Data?, Data?, Chat
} }
} }
private func chatMessagePhotoThumbnailDatas(account: Account, userLocation: MediaResourceUserLocation, photoReference: ImageMediaReference, onlyFullSize: Bool = false) -> Signal<Tuple3<Data?, Data?, Bool>, NoError> { private func chatMessagePhotoThumbnailDatas(account: Account, userLocation: MediaResourceUserLocation, photoReference: ImageMediaReference, onlyFullSize: Bool = false, forceThumbnail: Bool = false) -> Signal<Tuple3<Data?, Data?, Bool>, NoError> {
let fullRepresentationSize: CGSize = CGSize(width: 1280.0, height: 1280.0) 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))) { 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 let signal = maybeFullSize
|> take(1) |> take(1)
|> mapToSignal { maybeData -> Signal<Tuple3<Data?, Data?, Bool>, NoError> in |> mapToSignal { maybeData -> Signal<Tuple3<Data?, Data?, Bool>, NoError> in
if maybeData.complete { if maybeData.complete, !forceThumbnail {
let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: [])
return .single(Tuple(nil, loadedData, true)) return .single(Tuple(nil, loadedData, true))
} else { } 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> { 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) let signal = chatMessagePhotoThumbnailDatas(account: account, userLocation: userLocation, photoReference: photoReference, onlyFullSize: onlyFullSize, forceThumbnail: blurred)
return signal return signal
|> map { value in |> map { value in
let thumbnailData = value._0 let thumbnailData = value._0
@ -875,7 +875,7 @@ public func chatMessagePhotoThumbnail(account: Account, userLocation: MediaResou
var fullSizeImage: CGImage? var fullSizeImage: CGImage?
var imageOrientation: UIImage.Orientation = .up var imageOrientation: UIImage.Orientation = .up
if let fullSizeData = fullSizeData { if let fullSizeData = fullSizeData, !blurred {
if fullSizeComplete { if fullSizeComplete {
let options = NSMutableDictionary() let options = NSMutableDictionary()
options[kCGImageSourceShouldCache as NSString] = false as NSNumber options[kCGImageSourceShouldCache as NSString] = false as NSNumber
@ -904,7 +904,7 @@ public func chatMessagePhotoThumbnail(account: Account, userLocation: MediaResou
var blurredThumbnailImage: UIImage? var blurredThumbnailImage: UIImage?
if let thumbnailImage = thumbnailImage { if let thumbnailImage = thumbnailImage {
let thumbnailSize = CGSize(width: thumbnailImage.width, height: thumbnailImage.height) 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) { if let thumbnailContext = DrawingContext(size: thumbnailContextSize, scale: 1.0) {
thumbnailContext.withFlippedContext { c in thumbnailContext.withFlippedContext { c in
c.interpolationQuality = .none 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) 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() 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> { 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) let signal = chatMessageVideoDatas(postbox: account.postbox, userLocation: userLocation, fileReference: fileReference, thumbnailSize: true, autoFetchFullSizeThumbnail: true, forceThumbnail: blurred)
return signal return signal
|> map { value in |> map { value in
@ -974,7 +979,7 @@ public func chatMessageVideoThumbnail(account: Account, userLocation: MediaResou
var fullSizeImage: CGImage? var fullSizeImage: CGImage?
var imageOrientation: UIImage.Orientation = .up var imageOrientation: UIImage.Orientation = .up
if let fullSizeData = fullSizeData?._0 { if let fullSizeData = fullSizeData?._0, !blurred {
if fullSizeComplete { if fullSizeComplete {
let options = NSMutableDictionary() let options = NSMutableDictionary()
options[kCGImageSourceShouldCache as NSString] = false as NSNumber options[kCGImageSourceShouldCache as NSString] = false as NSNumber
@ -1002,11 +1007,11 @@ public func chatMessageVideoThumbnail(account: Account, userLocation: MediaResou
var blurredThumbnailImage: UIImage? var blurredThumbnailImage: UIImage?
if let thumbnailImage = thumbnailImage { if let thumbnailImage = thumbnailImage {
if max(thumbnailImage.width, thumbnailImage.height) > 200 { if max(thumbnailImage.width, thumbnailImage.height) > 200 && !blurred {
blurredThumbnailImage = UIImage(cgImage: thumbnailImage) blurredThumbnailImage = UIImage(cgImage: thumbnailImage)
} else { } else {
let thumbnailSize = CGSize(width: thumbnailImage.width, height: thumbnailImage.height) 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) { if let thumbnailContext = DrawingContext(size: thumbnailContextSize, scale: 1.0) {
thumbnailContext.withFlippedContext { c in thumbnailContext.withFlippedContext { c in
c.interpolationQuality = .none 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) 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() 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> { 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) let signal = chatMessagePhotoDatas(postbox: account.postbox, userLocation: userLocation, photoReference: photoReference, synchronousLoad: synchronousLoad, forceThumbnail: ignoreFullSize)
return signal return signal
|> map { value in |> map { value in
let thumbnailData = value._0 let thumbnailData = value._0
@ -1426,6 +1436,7 @@ public func mediaGridMessagePhoto(account: Account, userLocation: MediaResourceU
if blurred { if blurred {
telegramFastBlurMore(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes) telegramFastBlurMore(Int32(thumbnailContextSize.width), Int32(thumbnailContextSize.height), Int32(thumbnailContext.bytesPerRow), thumbnailContext.bytes)
adjustSaturationInContext(context: thumbnailContext, saturation: 1.7)
} }
blurredThumbnailImage = thumbnailContext.generateImage() blurredThumbnailImage = thumbnailContext.generateImage()

View File

@ -423,6 +423,7 @@ private func uploadedMediaImageContent(network: Network, postbox: Postbox, trans
ttlSeconds = autoclearMessageAttribute.timeout ttlSeconds = autoclearMessageAttribute.timeout
} }
var stickers: [Api.InputDocument]? var stickers: [Api.InputDocument]?
var hasSpoiler = false
for attribute in attributes { for attribute in attributes {
if let attribute = attribute as? EmbeddedMediaStickersMessageAttribute { if let attribute = attribute as? EmbeddedMediaStickersMessageAttribute {
var stickersValue: [Api.InputDocument] = [] var stickersValue: [Api.InputDocument] = []
@ -437,6 +438,7 @@ private func uploadedMediaImageContent(network: Network, postbox: Postbox, trans
} }
} else if let _ = attribute as? MediaSpoilerMessageAttribute { } else if let _ = attribute as? MediaSpoilerMessageAttribute {
flags |= 1 << 2 flags |= 1 << 2
hasSpoiler = true
} }
} }
return postbox.transaction { transaction -> Api.InputPeer? in return postbox.transaction { transaction -> Api.InputPeer? in
@ -461,6 +463,9 @@ private func uploadedMediaImageContent(network: Network, postbox: Postbox, trans
flags |= 1 << 0 flags |= 1 << 0
ttlSeconds = autoclearMessageAttribute.timeout 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) 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: default:
@ -727,6 +732,7 @@ private func uploadedMediaFileContent(network: Network, postbox: Postbox, auxili
if case let .done(file, thumbnail) = fileAndThumbnailResult { if case let .done(file, thumbnail) = fileAndThumbnailResult {
var flags: Int32 = 0 var flags: Int32 = 0
var hasSpoiler = false
var thumbnailFile: Api.InputFile? var thumbnailFile: Api.InputFile?
if case let .file(file) = thumbnail { if case let .file(file) = thumbnail {
thumbnailFile = file thumbnailFile = file
@ -743,6 +749,7 @@ private func uploadedMediaFileContent(network: Network, postbox: Postbox, auxili
ttlSeconds = attribute.timeout ttlSeconds = attribute.timeout
} else if let _ = attribute as? MediaSpoilerMessageAttribute { } else if let _ = attribute as? MediaSpoilerMessageAttribute {
flags |= 1 << 5 flags |= 1 << 5
hasSpoiler = true
} }
} }
@ -791,7 +798,11 @@ private func uploadedMediaFileContent(network: Network, postbox: Postbox, auxili
switch result { switch result {
case let .messageMediaDocument(_, document, _): case let .messageMediaDocument(_, document, _):
if let document = document, let mediaFile = telegramMediaFileFromApiDocument(document), let resource = mediaFile.resource as? CloudDocumentMediaResource, let fileReference = resource.fileReference { 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: default:
break break

View File

@ -7106,8 +7106,6 @@ public final class EmojiPagerContentComponent: Component {
displaySearchWithPlaceholder = strings.EmojiSearch_SearchReactionsPlaceholder displaySearchWithPlaceholder = strings.EmojiSearch_SearchReactionsPlaceholder
} else if isStatusSelection { } else if isStatusSelection {
displaySearchWithPlaceholder = strings.EmojiSearch_SearchStatusesPlaceholder displaySearchWithPlaceholder = strings.EmojiSearch_SearchStatusesPlaceholder
} else if isTopicIconSelection {
displaySearchWithPlaceholder = strings.EmojiSearch_SearchTopicIconsPlaceholder
} else if isEmojiSelection { } else if isEmojiSelection {
displaySearchWithPlaceholder = strings.EmojiSearch_SearchEmojiPlaceholder displaySearchWithPlaceholder = strings.EmojiSearch_SearchEmojiPlaceholder
searchInitiallyHidden = false searchInitiallyHidden = false

View File

@ -185,6 +185,7 @@ private class ExtendedMediaOverlayNode: ASDisplayNode {
private var maskView: UIView? private var maskView: UIView?
private var maskLayer: CAShapeLayer? private var maskLayer: CAShapeLayer?
private var randomId: Int32?
var isRevealed = false var isRevealed = false
var tapped: () -> Void = {} var tapped: () -> Void = {}
@ -270,17 +271,20 @@ private class ExtendedMediaOverlayNode: ASDisplayNode {
return result 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 spacing: CGFloat = 2.0
let padding: CGFloat = 10.0 let padding: CGFloat = 10.0
if let (imageSignal, drawingSize, boundingSize) = imageSignal { if let (imageSignal, drawingSize, boundingSize, randomId) = imageSignal {
if self.randomId != randomId {
self.randomId = randomId
self.blurredImageNode.setSignal(imageSignal, attemptSynchronously: true) self.blurredImageNode.setSignal(imageSignal, attemptSynchronously: true)
let imageLayout = self.blurredImageNode.asyncLayout() let imageLayout = self.blurredImageNode.asyncLayout()
let arguments = TransformImageArguments(corners: corners ?? ImageCorners(), imageSize: drawingSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets(), resizeMode: .blurBackground, emptyColor: .clear, custom: nil) let arguments = TransformImageArguments(corners: corners ?? ImageCorners(), imageSize: drawingSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets(), resizeMode: .blurBackground, emptyColor: .clear, custom: nil)
let apply = imageLayout(arguments) let apply = imageLayout(arguments)
apply() apply()
}
self.blurredImageNode.isHidden = false self.blurredImageNode.isHidden = false
@ -343,7 +347,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
private let imageNode: TransformImageNode private let imageNode: TransformImageNode
private var currentImageArguments: TransformImageArguments? private var currentImageArguments: TransformImageArguments?
private var currentHighQualityImageSignal: (Signal<(TransformImageArguments) -> DrawingContext?, NoError>, CGSize)? 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 highQualityImageNode: TransformImageNode?
private var videoNode: UniversalVideoNode? 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) 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 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) strongSelf.currentHighQualityImageSignal = (updateImageSignal(false, true), imageDimensions)
if let updateBlurredImageSignal = updateBlurredImageSignal { if let updateBlurredImageSignal = updateBlurredImageSignal {
strongSelf.currentBlurredImageSignal = (updateBlurredImageSignal(false, true), drawingSize, boundingSize) strongSelf.currentBlurredImageSignal = (updateBlurredImageSignal(false, true), drawingSize, boundingSize, Int32.random(in: 0..<Int32.max))
} }
} }
} }

View File

@ -250,13 +250,15 @@ class ChatMessageReplyInfoNode: ASDisplayNode {
mediaUpdated = true mediaUpdated = true
} }
let hasSpoiler = arguments.message.attributes.contains(where: { $0 is MediaSpoilerMessageAttribute })
var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>? var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>?
if let updatedMediaReference = updatedMediaReference, mediaUpdated && imageDimensions != nil { if let updatedMediaReference = updatedMediaReference, mediaUpdated && imageDimensions != nil {
if let imageReference = updatedMediaReference.concrete(TelegramMediaImage.self) { 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) { } else if let fileReference = updatedMediaReference.concrete(TelegramMediaFile.self) {
if fileReference.media.isVideo { 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) { } 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) updateImageSignal = chatWebpageSnippetFile(account: arguments.context.account, userLocation: .peer(arguments.message.id.peerId), mediaReference: fileReference.abstract, representation: iconImageRepresentation)
} }

View File

@ -622,19 +622,21 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
mediaUpdated = true mediaUpdated = true
} }
let hasSpoiler = message.attributes.contains(where: { $0 is MediaSpoilerMessageAttribute })
var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>? var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>?
var updatedFetchMediaSignal: Signal<FetchResourceSourceType, FetchResourceError>? var updatedFetchMediaSignal: Signal<FetchResourceSourceType, FetchResourceError>?
if mediaUpdated { if mediaUpdated {
if let updatedMediaReference = updatedMediaReference, imageDimensions != nil { if let updatedMediaReference = updatedMediaReference, imageDimensions != nil {
if let imageReference = updatedMediaReference.concrete(TelegramMediaImage.self) { 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) { } else if let fileReference = updatedMediaReference.concrete(TelegramMediaFile.self) {
if fileReference.media.isAnimatedSticker { if fileReference.media.isAnimatedSticker {
let dimensions = fileReference.media.dimensions ?? PixelDimensions(width: 512, height: 512) 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))) 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)) 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 { } 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) { } else if let iconImageRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) {
updateImageSignal = chatWebpageSnippetFile(account: context.account, userLocation: .peer(message.id.peerId), mediaReference: fileReference.abstract, representation: iconImageRepresentation) updateImageSignal = chatWebpageSnippetFile(account: context.account, userLocation: .peer(message.id.peerId), mediaReference: fileReference.abstract, representation: iconImageRepresentation)
} }

View File

@ -232,16 +232,18 @@ final class EditAccessoryPanelNode: AccessoryPanelNode {
} }
self.previousMediaReference = updatedMediaReference self.previousMediaReference = updatedMediaReference
let hasSpoiler = message?.attributes.contains(where: { $0 is MediaSpoilerMessageAttribute }) ?? false
var isPhoto = false var isPhoto = false
var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>? var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>?
if mediaUpdated { if mediaUpdated {
if let updatedMediaReference = updatedMediaReference, imageDimensions != nil { if let updatedMediaReference = updatedMediaReference, imageDimensions != nil {
if let imageReference = updatedMediaReference.concrete(TelegramMediaImage.self) { 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 isPhoto = true
} else if let fileReference = updatedMediaReference.concrete(TelegramMediaFile.self) { } else if let fileReference = updatedMediaReference.concrete(TelegramMediaFile.self) {
if fileReference.media.isVideo { 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) { } 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) updateImageSignal = chatWebpageSnippetFile(account: self.context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, mediaReference: fileReference.abstract, representation: iconImageRepresentation)
} }

View File

@ -205,14 +205,16 @@ final class ReplyAccessoryPanelNode: AccessoryPanelNode {
} }
strongSelf.previousMediaReference = updatedMediaReference strongSelf.previousMediaReference = updatedMediaReference
let hasSpoiler = message?.attributes.contains(where: { $0 is MediaSpoilerMessageAttribute }) ?? false
var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>? var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>?
if mediaUpdated { if mediaUpdated {
if let updatedMediaReference = updatedMediaReference, imageDimensions != nil { if let updatedMediaReference = updatedMediaReference, imageDimensions != nil {
if let imageReference = updatedMediaReference.concrete(TelegramMediaImage.self) { 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) { } else if let fileReference = updatedMediaReference.concrete(TelegramMediaFile.self) {
if fileReference.media.isVideo { 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) { } 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) updateImageSignal = chatWebpageSnippetFile(account: context.account, userLocation: (message?.id.peerId).flatMap(MediaResourceUserLocation.peer) ?? .other, mediaReference: fileReference.abstract, representation: iconImageRepresentation)
} }