From 2de830df26c5efe7ea672eef1903b70939ed3f41 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Wed, 27 May 2020 18:03:22 +0400 Subject: [PATCH] Pretend gif is loaded when its video thumbnail is ready --- .../AccountContext/Sources/FetchManager.swift | 2 ++ .../Sources/FetchMediaUtils.swift | 29 +++++++++++++++++-- .../ChatMessageInteractiveMediaNode.swift | 2 +- .../TelegramUI/Sources/FetchManager.swift | 2 +- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/submodules/AccountContext/Sources/FetchManager.swift b/submodules/AccountContext/Sources/FetchManager.swift index 930d360a0a..c70576facd 100644 --- a/submodules/AccountContext/Sources/FetchManager.swift +++ b/submodules/AccountContext/Sources/FetchManager.swift @@ -152,6 +152,8 @@ public enum FetchManagerPriority: Comparable { public let FetchCompleteRange = IndexSet(integersIn: 0 ..< Int(Int32.max) as Range) public protocol FetchManager { + var queue: Queue { get } + func interactivelyFetched(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, mediaReference: AnyMediaReference?, resourceReference: MediaResourceReference, ranges: IndexSet, statsCategory: MediaResourceStatsCategory, elevatedPriority: Bool, userInitiated: Bool, priority: FetchManagerPriority, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal func cancelInteractiveFetches(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, resource: MediaResource) func fetchStatus(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, resource: MediaResource) -> Signal diff --git a/submodules/AccountContext/Sources/FetchMediaUtils.swift b/submodules/AccountContext/Sources/FetchMediaUtils.swift index a9dd942677..e580697411 100644 --- a/submodules/AccountContext/Sources/FetchMediaUtils.swift +++ b/submodules/AccountContext/Sources/FetchMediaUtils.swift @@ -60,6 +60,31 @@ public func messageMediaImageCancelInteractiveFetch(context: AccountContext, mes context.fetchManager.cancelInteractiveFetches(category: .image, location: .chat(messageId.peerId), locationKey: .messageId(messageId), resource: resource) } -public func messageMediaFileStatus(context: AccountContext, messageId: MessageId, file: TelegramMediaFile) -> Signal { - return context.fetchManager.fetchStatus(category: fetchCategoryForFile(file), location: .chat(messageId.peerId), locationKey: .messageId(messageId), resource: file.resource) +public func messageMediaFileStatus(context: AccountContext, messageId: MessageId, file: TelegramMediaFile, adjustForVideoThumbnail: Bool = false) -> Signal { + let fileStatus = context.fetchManager.fetchStatus(category: fetchCategoryForFile(file), location: .chat(messageId.peerId), locationKey: .messageId(messageId), resource: file.resource) + if !adjustForVideoThumbnail { + return fileStatus + } + + var thumbnailStatus: Signal = .single(nil) + if let videoThumbnail = file.videoThumbnails.first { + thumbnailStatus = context.account.postbox.mediaBox.resourceStatus(videoThumbnail.resource) + |> map(Optional.init) + } + + return combineLatest(queue: context.fetchManager.queue, + fileStatus, + thumbnailStatus + ) + |> map { fileStatus, thumbnailStatus -> MediaResourceStatus in + guard let thumbnailStatus = thumbnailStatus else { + return fileStatus + } + if case .Local = thumbnailStatus { + return thumbnailStatus + } else { + return fileStatus + } + } + |> distinctUntilChanged } diff --git a/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift index 0ddcf73ac6..ff308c5be2 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift @@ -653,7 +653,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio } } } else if let file = media as? TelegramMediaFile { - updatedStatusSignal = combineLatest(messageMediaFileStatus(context: context, messageId: message.id, file: file), context.account.pendingMessageManager.pendingMessageStatus(message.id) |> map { $0.0 }) + updatedStatusSignal = combineLatest(messageMediaFileStatus(context: context, messageId: message.id, file: file, adjustForVideoThumbnail: true), context.account.pendingMessageManager.pendingMessageStatus(message.id) |> map { $0.0 }) |> map { resourceStatus, pendingStatus -> (MediaResourceStatus, MediaResourceStatus?) in if let pendingStatus = pendingStatus { let adjustedProgress = max(pendingStatus.progress, 0.027) diff --git a/submodules/TelegramUI/Sources/FetchManager.swift b/submodules/TelegramUI/Sources/FetchManager.swift index f8fe6683a2..b14f780da1 100644 --- a/submodules/TelegramUI/Sources/FetchManager.swift +++ b/submodules/TelegramUI/Sources/FetchManager.swift @@ -460,7 +460,7 @@ private final class FetchManagerCategoryContext { } public final class FetchManagerImpl: FetchManager { - private let queue = Queue.mainQueue() + public let queue = Queue.mainQueue() private let postbox: Postbox private let storeManager: DownloadedMediaStoreManager? private var nextEpisodeId: Int32 = 0