Pretend gif is loaded when its video thumbnail is ready

This commit is contained in:
Ali 2020-05-27 18:03:22 +04:00
parent a8d099068d
commit 2de830df26
4 changed files with 31 additions and 4 deletions

View File

@ -152,6 +152,8 @@ public enum FetchManagerPriority: Comparable {
public let FetchCompleteRange = IndexSet(integersIn: 0 ..< Int(Int32.max) as Range<Int>)
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<Void, NoError>
func cancelInteractiveFetches(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, resource: MediaResource)
func fetchStatus(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, resource: MediaResource) -> Signal<MediaResourceStatus, NoError>

View File

@ -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<MediaResourceStatus, NoError> {
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<MediaResourceStatus, NoError> {
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<MediaResourceStatus?, NoError> = .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
}

View File

@ -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)

View File

@ -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