diff --git a/submodules/TelegramUI/TelegramUI/AnimatedStickerNode.swift b/submodules/TelegramUI/TelegramUI/AnimatedStickerNode.swift index 51d72672c7..db46c3acbc 100644 --- a/submodules/TelegramUI/TelegramUI/AnimatedStickerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AnimatedStickerNode.swift @@ -306,9 +306,6 @@ final class AnimatedStickerNode: ASDisplayNode { private let fetchDisposable = MetaDisposable() private let eventsNode: AnimatedStickerNodeDisplayEvents - var shouldAutoPlay: () -> Bool = { - return true - } var started: () -> Void = {} var reportedStarted = false @@ -410,7 +407,7 @@ final class AnimatedStickerNode: ASDisplayNode { } private func updateIsPlaying() { - let isPlaying = self.visibility && self.isDisplaying && self.shouldAutoPlay() + let isPlaying = self.visibility && self.isDisplaying if self.isPlaying != isPlaying { self.isPlaying = isPlaying if isPlaying { @@ -481,6 +478,59 @@ final class AnimatedStickerNode: ASDisplayNode { self.timer.swap(nil)?.invalidate() } + func seekToStart() { + self.isPlaying = false + + let directData = self.directData + let cachedData = self.cachedData + let queue = self.queue + let timerHolder = self.timer + self.queue.async { [weak self] in + var maybeFrameSource: AnimatedStickerFrameSource? + if let directData = directData { + maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData._0, width: directData._2, height: directData._3) + } else if let cachedData = cachedData { + if #available(iOS 9.0, *) { + maybeFrameSource = AnimatedStickerCachedFrameSource(queue: queue, data: cachedData) + } + } + guard let frameSource = maybeFrameSource else { + return + } + let frameQueue = QueueLocalObject(queue: queue, generate: { + return AnimatedStickerFrameQueue(queue: queue, length: 1, source: frameSource) + }) + timerHolder.swap(nil)?.invalidate() + + let maybeFrame = frameQueue.syncWith { frameQueue in + return frameQueue.take() + } + if let maybeFrame = maybeFrame, let frame = maybeFrame { + Queue.mainQueue().async { + guard let strongSelf = self else { + return + } + strongSelf.renderer?.render(queue: strongSelf.queue, width: frame.width, height: frame.height, bytesPerRow: frame.bytesPerRow, data: frame.data, type: frame.type, completion: { + guard let strongSelf = self else { + return + } + if !strongSelf.reportedStarted { + strongSelf.reportedStarted = true + strongSelf.started() + } + }) + if case .once = strongSelf.playbackMode, frame.isLastFrame { + strongSelf.stop() + strongSelf.isPlaying = false + } + } + } + frameQueue.with { frameQueue in + frameQueue.generateFramesIfNeeded() + } + } + } + func playIfNeeded() -> Bool { if !self.isPlaying { self.isPlaying = true diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index 82be722df1..910a2e6738 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -62,17 +62,6 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } } - self.animationNode.shouldAutoPlay = { [weak self] in - if let strongSelf = self { - if let item = strongSelf.item { - if let _ = strongSelf.emojiFile { - return !item.controllerInteraction.seenOneTimeAnimatedMedia.contains(item.message.id) - } - } - } - return true - } - self.imageNode.displaysAsynchronously = false self.addSubnode(self.imageNode) self.addSubnode(self.animationNode) @@ -174,7 +163,19 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { let isPlaying = self.visibilityStatus if self.isPlaying != isPlaying { self.isPlaying = isPlaying - self.animationNode.visibility = isPlaying + + var alreadySeen = false + if isPlaying, let _ = self.emojiFile { + if item.controllerInteraction.seenOneTimeAnimatedMedia.contains(item.message.id) { + alreadySeen = true + } + } + + self.animationNode.visibility = isPlaying && !alreadySeen + if self.didSetUpAnimationNode && alreadySeen { + self.animationNode.seekToStart() + } + if self.isPlaying && !self.didSetUpAnimationNode { self.didSetUpAnimationNode = true