diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index 414d9441b5..c2d2ee0b14 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -793,7 +793,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { if let strongSelf = self, !isAnimated { videoNode?.seek(0.0) - if strongSelf.actionAtEnd == .stop { + if strongSelf.actionAtEnd == .stop && strongSelf.isCentral { strongSelf.updateControlsVisibility(true) strongSelf.controlsTimer?.invalidate() strongSelf.controlsTimer = nil @@ -900,6 +900,9 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } } } else { + self.controlsTimer?.invalidate() + self.controlsTimer = nil + self.dismissOnOrientationChange = false if videoNode.ownsContentNode { videoNode.pause() diff --git a/submodules/ShimmerEffect/Sources/StickerShimmerEffectNode.swift b/submodules/ShimmerEffect/Sources/StickerShimmerEffectNode.swift index 073c6e0073..b0d5a129d8 100644 --- a/submodules/ShimmerEffect/Sources/StickerShimmerEffectNode.swift +++ b/submodules/ShimmerEffect/Sources/StickerShimmerEffectNode.swift @@ -164,6 +164,10 @@ public class StickerShimmerEffectNode: ASDisplayNode { self.addSubnode(self.foregroundNode) } + public var isEmpty: Bool { + return self.currentData == nil + } + public func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) { self.effectNode.updateAbsoluteRect(rect, within: containerSize) } diff --git a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift index 44ebb79321..770c6cd022 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -144,7 +144,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { private let contextSourceNode: ContextExtractedContentContainingNode private let containerNode: ContextControllerSourceNode let imageNode: TransformImageNode - private var placeholderNode: StickerShimmerEffectNode? + private var placeholderNode: StickerShimmerEffectNode private var animationNode: GenericAnimatedStickerNode? private var didSetUpAnimationNode = false private var isPlaying = false @@ -194,7 +194,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { self.dateAndStatusNode = ChatMessageDateAndStatusNode() self.placeholderNode = StickerShimmerEffectNode() - self.placeholderNode?.isUserInteractionEnabled = false + self.placeholderNode.isUserInteractionEnabled = false super.init(layerBacked: false) @@ -242,10 +242,9 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { return } if image != nil { - if firstTime { - strongSelf.animationNode?.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, completion: { [weak self] _ in - self?.removePlaceholder(animated: false) - }) + if firstTime && !strongSelf.placeholderNode.isEmpty { + strongSelf.animationNode?.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + strongSelf.removePlaceholder(animated: true) } else { strongSelf.removePlaceholder(animated: true) } @@ -258,10 +257,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { self.containerNode.targetNodeForActivationProgress = self.contextSourceNode.contentNode self.addSubnode(self.containerNode) self.contextSourceNode.contentNode.addSubnode(self.imageNode) - - if let placeholderNode = self.placeholderNode { - self.contextSourceNode.contentNode.addSubnode(placeholderNode) - } + self.contextSourceNode.contentNode.addSubnode(self.placeholderNode) self.contextSourceNode.contentNode.addSubnode(self.dateAndStatusNode) @@ -283,16 +279,13 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } private func removePlaceholder(animated: Bool) { - if let placeholderNode = self.placeholderNode { - self.placeholderNode = nil - if !animated { - placeholderNode.removeFromSupernode() - } else { - placeholderNode.alpha = 0.0 - placeholderNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, completion: { [weak placeholderNode] _ in - placeholderNode?.removeFromSupernode() - }) - } + if !animated { + self.placeholderNode.removeFromSupernode() + } else { + self.placeholderNode.alpha = 0.0 + self.placeholderNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, completion: { [weak self] _ in + self?.placeholderNode.removeFromSupernode() + }) } } @@ -429,11 +422,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } if let animationNode = self.animationNode, !self.animateGreeting { - if let placeholderNode = self.placeholderNode { - self.contextSourceNode.contentNode.insertSubnode(animationNode, aboveSubnode: placeholderNode) - } else { - self.contextSourceNode.contentNode.insertSubnode(animationNode, aboveSubnode: self.imageNode) - } + self.contextSourceNode.contentNode.insertSubnode(animationNode, aboveSubnode: self.placeholderNode) } } @@ -573,9 +562,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { var rect = rect rect.origin.y = containerSize.height - rect.maxY + self.insets.top - if let placeholderNode = self.placeholderNode { - placeholderNode.updateAbsoluteRect(CGRect(origin: CGPoint(x: rect.minX + placeholderNode.frame.minX, y: rect.minY + placeholderNode.frame.minY), size: placeholderNode.frame.size), within: containerSize) - } + self.placeholderNode.updateAbsoluteRect(CGRect(origin: CGPoint(x: rect.minX + self.placeholderNode.frame.minX, y: rect.minY + self.placeholderNode.frame.minY), size: self.placeholderNode.frame.size), within: containerSize) } } @@ -969,11 +956,11 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { file = telegramFile } - if let file = file, let immediateThumbnailData = file.immediateThumbnailData, let placeholderNode = strongSelf.placeholderNode { + if let file = file, let immediateThumbnailData = file.immediateThumbnailData { let foregroundColor = bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.stickerPlaceholderColor, wallpaper: item.presentationData.theme.wallpaper) let shimmeringColor = bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.stickerPlaceholderShimmerColor, wallpaper: item.presentationData.theme.wallpaper) - placeholderNode.update(backgroundColor: nil, foregroundColor: foregroundColor, shimmeringColor: shimmeringColor, data: immediateThumbnailData, size: animationNodeFrame.size, imageSize: file.dimensions?.cgSize ?? CGSize(width: 512.0, height: 512.0)) - placeholderNode.frame = animationNodeFrame + strongSelf.placeholderNode.update(backgroundColor: nil, foregroundColor: foregroundColor, shimmeringColor: shimmeringColor, data: immediateThumbnailData, size: animationNodeFrame.size, imageSize: file.dimensions?.cgSize ?? CGSize(width: 512.0, height: 512.0)) + strongSelf.placeholderNode.frame = animationNodeFrame } if let animationNode = strongSelf.animationNode, let parentNode = strongSelf.greetingStickerParentNode, strongSelf.animateGreeting { diff --git a/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift index f81eb4b7f1..52d5730ff6 100644 --- a/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift @@ -22,7 +22,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { private let contextSourceNode: ContextExtractedContentContainingNode private let containerNode: ContextControllerSourceNode let imageNode: TransformImageNode - private var placeholderNode: StickerShimmerEffectNode? + private var placeholderNode: StickerShimmerEffectNode var textNode: TextNode? private var swipeToReplyNode: ChatMessageSwipeToReplyNode? @@ -53,7 +53,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { self.containerNode = ContextControllerSourceNode() self.imageNode = TransformImageNode() self.placeholderNode = StickerShimmerEffectNode() - self.placeholderNode?.isUserInteractionEnabled = false + self.placeholderNode.isUserInteractionEnabled = false self.dateAndStatusNode = ChatMessageDateAndStatusNode() super.init(layerBacked: false) @@ -64,8 +64,8 @@ class ChatMessageStickerItemNode: ChatMessageItemView { return } if image != nil { - if firstTime { - strongSelf.imageNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, completion: { [weak self] _ in + if firstTime && !strongSelf.placeholderNode.isEmpty { + strongSelf.imageNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2, completion: { [weak self] _ in self?.removePlaceholder(animated: false) }) } else { @@ -117,9 +117,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { self.containerNode.addSubnode(self.contextSourceNode) self.containerNode.targetNodeForActivationProgress = self.contextSourceNode.contentNode self.addSubnode(self.containerNode) - if let placeholderNode = self.placeholderNode { - self.contextSourceNode.contentNode.addSubnode(placeholderNode) - } + self.contextSourceNode.contentNode.addSubnode(self.placeholderNode) self.contextSourceNode.contentNode.addSubnode(self.imageNode) self.contextSourceNode.contentNode.addSubnode(self.dateAndStatusNode) @@ -141,16 +139,13 @@ class ChatMessageStickerItemNode: ChatMessageItemView { private func removePlaceholder(animated: Bool) { - if let placeholderNode = self.placeholderNode { - self.placeholderNode = nil - if !animated { - placeholderNode.removeFromSupernode() - } else { - placeholderNode.alpha = 0.0 - placeholderNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, completion: { [weak placeholderNode] _ in - placeholderNode?.removeFromSupernode() - }) - } + if !animated { + self.placeholderNode.removeFromSupernode() + } else { + self.placeholderNode.alpha = 0.0 + self.placeholderNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, completion: { [weak self] _ in + self?.placeholderNode.removeFromSupernode() + }) } } @@ -239,9 +234,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { var rect = rect rect.origin.y = containerSize.height - rect.maxY + self.insets.top - if let placeholderNode = self.placeholderNode { - placeholderNode.updateAbsoluteRect(CGRect(origin: CGPoint(x: rect.minX + placeholderNode.frame.minX, y: rect.minY + placeholderNode.frame.minY), size: placeholderNode.frame.size), within: containerSize) - } + self.placeholderNode.updateAbsoluteRect(CGRect(origin: CGPoint(x: rect.minX + placeholderNode.frame.minX, y: rect.minY + placeholderNode.frame.minY), size: placeholderNode.frame.size), within: containerSize) } } @@ -608,13 +601,13 @@ class ChatMessageStickerItemNode: ChatMessageItemView { transition.updateFrame(node: strongSelf.imageNode, frame: updatedImageFrame) imageApply() - if let immediateThumbnailData = telegramFile?.immediateThumbnailData, let placeholderNode = strongSelf.placeholderNode { + if let immediateThumbnailData = telegramFile?.immediateThumbnailData { let foregroundColor = bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.stickerPlaceholderColor, wallpaper: item.presentationData.theme.wallpaper) let shimmeringColor = bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.stickerPlaceholderShimmerColor, wallpaper: item.presentationData.theme.wallpaper) let placeholderFrame = updatedImageFrame.insetBy(dx: innerImageInset, dy: innerImageInset) - placeholderNode.update(backgroundColor: nil, foregroundColor: foregroundColor, shimmeringColor: shimmeringColor, data: immediateThumbnailData, size: placeholderFrame.size) - placeholderNode.frame = placeholderFrame + strongSelf.placeholderNode.update(backgroundColor: nil, foregroundColor: foregroundColor, shimmeringColor: shimmeringColor, data: immediateThumbnailData, size: placeholderFrame.size) + strongSelf.placeholderNode.frame = placeholderFrame } strongSelf.containerNode.frame = CGRect(origin: CGPoint(), size: layoutSize)