mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Spoiler improvements
This commit is contained in:
parent
96f40088e3
commit
1ff6ef1a39
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user