From e2ca4e989cc59952d1d58dbeb8fc9475cd2d948c Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 31 Jan 2022 23:55:18 +0300 Subject: [PATCH] Various Fixes --- .../Sources/StickerPackPreviewGridItem.swift | 107 +++++++++++------- 1 file changed, 66 insertions(+), 41 deletions(-) diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift index 8668e51e92..8bdcc1e26a 100644 --- a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift +++ b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift @@ -60,13 +60,16 @@ final class StickerPackPreviewGridItemNode: GridItemNode { private var isEmpty: Bool? private let imageNode: TransformImageNode private var animationNode: AnimatedStickerNode? - private var placeholderNode: StickerShimmerEffectNode? + private var placeholderNode: StickerShimmerEffectNode private var theme: PresentationTheme? override var isVisibleInGrid: Bool { didSet { let visibility = self.isVisibleInGrid && (self.interaction?.playAnimatedStickers ?? true) + if visibility && self.setupTimestamp == nil { + self.setupTimestamp = CACurrentMediaTime() + } if let animationNode = self.animationNode { animationNode.visibility = visibility } @@ -89,24 +92,34 @@ final class StickerPackPreviewGridItemNode: GridItemNode { self.imageNode = TransformImageNode() self.imageNode.isLayerBacked = !smartInvertColorsEnabled() self.placeholderNode = StickerShimmerEffectNode() - self.placeholderNode?.isUserInteractionEnabled = false + self.placeholderNode.isUserInteractionEnabled = false super.init() self.addSubnode(self.imageNode) - if let placeholderNode = self.placeholderNode { - self.addSubnode(placeholderNode) - } + self.addSubnode(self.placeholderNode) var firstTime = true self.imageNode.imageUpdated = { [weak self] image in guard let strongSelf = self else { return } + if image != nil { - strongSelf.removePlaceholder(animated: !firstTime) + if let stickerItem = strongSelf.currentState?.1 { + if stickerItem.file.isVideoSticker || stickerItem.file.isAnimatedSticker { + strongSelf.removePlaceholder(animated: !firstTime) + } else { + let current = CACurrentMediaTime() + if let setupTimestamp = strongSelf.setupTimestamp, current - setupTimestamp > 0.3 { + strongSelf.removePlaceholder(animated: true) + } else { + strongSelf.removePlaceholder(animated: false) + } + } + } + firstTime = false } - firstTime = false } } @@ -115,18 +128,18 @@ final class StickerPackPreviewGridItemNode: GridItemNode { } private func removePlaceholder(animated: Bool) { - if let placeholderNode = self.placeholderNode { - self.placeholderNode = nil - if !animated { - placeholderNode.removeFromSupernode() - } else { - placeholderNode.allowsGroupOpacity = true - placeholderNode.alpha = 0.0 - placeholderNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, completion: { [weak placeholderNode] _ in - placeholderNode?.removeFromSupernode() - placeholderNode?.allowsGroupOpacity = false - }) - } + guard self.placeholderNode.alpha != 0 else { + return + } + if !animated { + self.placeholderNode.removeFromSupernode() + } else { + self.placeholderNode.alpha = 0.0 + self.placeholderNode.allowsGroupOpacity = true + self.placeholderNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, completion: { [weak self] _ in + self?.placeholderNode.removeFromSupernode() + self?.placeholderNode.allowsGroupOpacity = false + }) } } @@ -136,12 +149,18 @@ final class StickerPackPreviewGridItemNode: GridItemNode { self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.imageNodeTap(_:)))) } + private var setupTimestamp: Double? func setup(account: Account, stickerItem: StickerPackItem?, interaction: StickerPackPreviewInteraction, theme: PresentationTheme, isEmpty: Bool) { self.interaction = interaction self.theme = theme if self.currentState == nil || self.currentState!.0 !== account || self.currentState!.1 != stickerItem || self.isEmpty != isEmpty { if let stickerItem = stickerItem { + let visibility = self.isVisibleInGrid && self.interaction?.playAnimatedStickers ?? true + if visibility && self.setupTimestamp == nil { + self.setupTimestamp = CACurrentMediaTime() + } + if stickerItem.file.isAnimatedSticker || stickerItem.file.isVideoSticker { let dimensions = stickerItem.file.dimensions ?? PixelDimensions(width: 512, height: 512) if stickerItem.file.isVideoSticker { @@ -155,13 +174,26 @@ final class StickerPackPreviewGridItemNode: GridItemNode { self.animationNode = animationNode self.insertSubnode(animationNode, aboveSubnode: self.imageNode) animationNode.started = { [weak self] in + guard let strongSelf = self else { + return + } self?.imageNode.isHidden = true - self?.removePlaceholder(animated: false) + + let current = CACurrentMediaTime() + if let setupTimestamp = strongSelf.setupTimestamp, current - setupTimestamp > 0.3 { + if !strongSelf.placeholderNode.alpha.isZero { + strongSelf.removePlaceholder(animated: true) + } + } else { + strongSelf.removePlaceholder(animated: false) + } } } let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0)) self.animationNode?.setup(source: AnimatedStickerResourceSource(account: account, resource: stickerItem.file.resource, isVideo: stickerItem.file.isVideoSticker), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) - self.animationNode?.visibility = self.isVisibleInGrid && self.interaction?.playAnimatedStickers ?? true + + self.animationNode?.visibility = visibility + self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: stickerItem.file.resource).start()) } else { if let animationNode = self.animationNode { @@ -173,15 +205,13 @@ final class StickerPackPreviewGridItemNode: GridItemNode { self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: chatMessageStickerResource(file: stickerItem.file, small: true)).start()) } } else { - if let placeholderNode = self.placeholderNode { - if isEmpty { - if !placeholderNode.alpha.isZero { - placeholderNode.alpha = 0.0 - placeholderNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2) - } - } else { - placeholderNode.alpha = 1.0 + if isEmpty { + if !self.placeholderNode.alpha.isZero { + self.placeholderNode.alpha = 0.0 + self.placeholderNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2) } + } else { + self.placeholderNode.alpha = 1.0 } } self.currentState = (account, stickerItem) @@ -210,23 +240,18 @@ final class StickerPackPreviewGridItemNode: GridItemNode { } } - if let placeholderNode = self.placeholderNode { - let imageFrame = self.imageNode.frame + let imageFrame = self.imageNode.frame -// let placeholderFrame = CGRect(origin: CGPoint(x: floor((bounds.width - boundingSize.width) / 2.0), y: floor((bounds.height - boundingSize.height) / 2.0)), size: boundingSize) - let placeholderFrame = imageFrame - placeholderNode.frame = imageFrame - - if let theme = self.theme, let (_, stickerItem) = self.currentState, let item = stickerItem { - placeholderNode.update(backgroundColor: theme.list.itemBlocksBackgroundColor, foregroundColor: theme.list.mediaPlaceholderColor, shimmeringColor: theme.list.itemBlocksBackgroundColor.withAlphaComponent(0.4), data: item.file.immediateThumbnailData, size: placeholderFrame.size) - } + let placeholderFrame = imageFrame + self.placeholderNode.frame = imageFrame + + if let theme = self.theme, let (_, stickerItem) = self.currentState, let item = stickerItem { + self.placeholderNode.update(backgroundColor: theme.list.itemBlocksBackgroundColor, foregroundColor: theme.list.mediaPlaceholderColor, shimmeringColor: theme.list.itemBlocksBackgroundColor.withAlphaComponent(0.4), data: item.file.immediateThumbnailData, size: placeholderFrame.size) } } override func updateAbsoluteRect(_ absoluteRect: CGRect, within containerSize: CGSize) { - if let placeholderNode = self.placeholderNode { - placeholderNode.updateAbsoluteRect(absoluteRect, within: containerSize) - } + self.placeholderNode.updateAbsoluteRect(absoluteRect, within: containerSize) } func transitionNode() -> ASDisplayNode? {