diff --git a/submodules/AccountContext/Sources/FetchManager.swift b/submodules/AccountContext/Sources/FetchManager.swift index 1646bfef07..a01a4b66b6 100644 --- a/submodules/AccountContext/Sources/FetchManager.swift +++ b/submodules/AccountContext/Sources/FetchManager.swift @@ -3,6 +3,7 @@ import Postbox import TelegramCore import SwiftSignalKit import TelegramUIPreferences +import RangeSet public enum FetchManagerCategory: Int32 { case image @@ -151,7 +152,7 @@ public enum FetchManagerPriority: Comparable { 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 interactivelyFetched(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, mediaReference: AnyMediaReference?, resourceReference: MediaResourceReference, ranges: RangeSet, statsCategory: MediaResourceStatsCategory, elevatedPriority: Bool, userInitiated: Bool, priority: FetchManagerPriority, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal func cancelInteractiveFetches(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, resource: MediaResource) func cancelInteractiveFetches(resourceId: String) func toggleInteractiveFetchPaused(resourceId: String, isPaused: Bool) diff --git a/submodules/AccountContext/Sources/FetchMediaUtils.swift b/submodules/AccountContext/Sources/FetchMediaUtils.swift index 64eea5d434..29bf1e3d89 100644 --- a/submodules/AccountContext/Sources/FetchMediaUtils.swift +++ b/submodules/AccountContext/Sources/FetchMediaUtils.swift @@ -4,6 +4,7 @@ import TelegramCore import Postbox import SwiftSignalKit import TelegramUIPreferences +import RangeSet public func freeMediaFileInteractiveFetched(account: Account, fileReference: FileMediaReference) -> Signal { return fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource)) @@ -12,7 +13,7 @@ public func freeMediaFileInteractiveFetched(account: Account, fileReference: Fil public func freeMediaFileInteractiveFetched(fetchManager: FetchManager, fileReference: FileMediaReference, priority: FetchManagerPriority) -> Signal { let file = fileReference.media let mediaReference = AnyMediaReference.standalone(media: fileReference.media) - return fetchManager.interactivelyFetched(category: fetchCategoryForFile(file), location: .chat(PeerId(0)), locationKey: .free, mediaReference: mediaReference, resourceReference: mediaReference.resourceReference(file.resource), ranges: IndexSet(integersIn: 0 ..< Int(Int64.max) as Range), statsCategory: statsCategoryForFileWithAttributes(file.attributes), elevatedPriority: false, userInitiated: false, priority: priority, storeToDownloadsPeerType: nil) + return fetchManager.interactivelyFetched(category: fetchCategoryForFile(file), location: .chat(PeerId(0)), locationKey: .free, mediaReference: mediaReference, resourceReference: mediaReference.resourceReference(file.resource), ranges: RangeSet(0 ..< Int64.max), statsCategory: statsCategoryForFileWithAttributes(file.attributes), elevatedPriority: false, userInitiated: false, priority: priority, storeToDownloadsPeerType: nil) } public func freeMediaFileResourceInteractiveFetched(account: Account, fileReference: FileMediaReference, resource: MediaResource) -> Signal { @@ -37,7 +38,7 @@ public func messageMediaFileInteractiveFetched(context: AccountContext, message: return messageMediaFileInteractiveFetched(fetchManager: context.fetchManager, messageId: message.id, messageReference: MessageReference(message), file: file, userInitiated: userInitiated, priority: .userInitiated) } -public func messageMediaFileInteractiveFetched(fetchManager: FetchManager, messageId: MessageId, messageReference: MessageReference, file: TelegramMediaFile, ranges: IndexSet = IndexSet(integersIn: 0 ..< Int(Int64.max) as Range), userInitiated: Bool, priority: FetchManagerPriority) -> Signal { +public func messageMediaFileInteractiveFetched(fetchManager: FetchManager, messageId: MessageId, messageReference: MessageReference, file: TelegramMediaFile, ranges: RangeSet = RangeSet(0 ..< Int64.max), userInitiated: Bool, priority: FetchManagerPriority) -> Signal { let mediaReference = AnyMediaReference.message(message: messageReference, media: file) return fetchManager.interactivelyFetched(category: fetchCategoryForFile(file), location: .chat(messageId.peerId), locationKey: .messageId(messageId), mediaReference: mediaReference, resourceReference: mediaReference.resourceReference(file.resource), ranges: ranges, statsCategory: statsCategoryForFileWithAttributes(file.attributes), elevatedPriority: false, userInitiated: userInitiated, priority: priority, storeToDownloadsPeerType: nil) } @@ -52,11 +53,11 @@ public func messageMediaImageInteractiveFetched(context: AccountContext, message public func messageMediaImageInteractiveFetched(fetchManager: FetchManager, messageId: MessageId, messageReference: MessageReference, image: TelegramMediaImage, resource: MediaResource, range: Range? = nil, userInitiated: Bool, priority: FetchManagerPriority, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal { let mediaReference = AnyMediaReference.message(message: messageReference, media: image) - let ranges: IndexSet + let ranges: RangeSet if let range = range { - ranges = IndexSet(integersIn: Int(range.lowerBound) ..< Int(range.upperBound)) + ranges = RangeSet(range.lowerBound ..< range.upperBound) } else { - ranges = IndexSet(integersIn: Int(0) ..< Int(Int64.max)) + ranges = RangeSet(0 ..< Int64.max) } return fetchManager.interactivelyFetched(category: .image, location: .chat(messageId.peerId), locationKey: .messageId(messageId), mediaReference: mediaReference, resourceReference: mediaReference.resourceReference(resource), ranges: ranges, statsCategory: .image, elevatedPriority: false, userInitiated: userInitiated, priority: priority, storeToDownloadsPeerType: storeToDownloadsPeerType) } diff --git a/submodules/DirectMediaImageCache/Sources/DirectMediaImageCache.swift b/submodules/DirectMediaImageCache/Sources/DirectMediaImageCache.swift index 975d030fef..0b71087ed0 100644 --- a/submodules/DirectMediaImageCache/Sources/DirectMediaImageCache.swift +++ b/submodules/DirectMediaImageCache/Sources/DirectMediaImageCache.swift @@ -199,7 +199,7 @@ public final class DirectMediaImageCache { ).start() let dataSignal: Signal - if resourceSizeLimit < Int(Int64.max) { + if resourceSizeLimit < Int64.max { dataSignal = self.account.postbox.mediaBox.resourceData(resource.resource, size: resourceSizeLimit, in: 0 ..< resourceSizeLimit) |> map { data, _ -> Data? in return data diff --git a/submodules/FetchManagerImpl/BUILD b/submodules/FetchManagerImpl/BUILD index 93a7be74c7..2838c3104c 100644 --- a/submodules/FetchManagerImpl/BUILD +++ b/submodules/FetchManagerImpl/BUILD @@ -16,6 +16,7 @@ swift_library( "//submodules/TelegramUIPreferences:TelegramUIPreferences", "//submodules/AccountContext:AccountContext", "//submodules/MediaPlayer:UniversalMediaPlayer", + "//submodules/Utils/RangeSet:RangeSet", ], visibility = [ "//visibility:public", diff --git a/submodules/FetchManagerImpl/Sources/FetchManagerImpl.swift b/submodules/FetchManagerImpl/Sources/FetchManagerImpl.swift index 7308111946..c998542496 100644 --- a/submodules/FetchManagerImpl/Sources/FetchManagerImpl.swift +++ b/submodules/FetchManagerImpl/Sources/FetchManagerImpl.swift @@ -6,6 +6,7 @@ import Postbox import TelegramUIPreferences import AccountContext import UniversalMediaPlayer +import RangeSet public struct FetchManagerLocationEntryId: Hashable { public let location: FetchManagerLocation @@ -41,15 +42,15 @@ private final class FetchManagerLocationEntry { var userInitiated: Bool = false var storeToDownloadsPeerType: MediaAutoDownloadPeerType? let references = Bag() - let ranges = Bag() + let ranges = Bag>() var elevatedPriorityReferenceCount: Int32 = 0 var userInitiatedPriorityIndices: [Int32] = [] var isPaused: Bool = false - var combinedRanges: IndexSet { - var result = IndexSet() + var combinedRanges: RangeSet { + var result = RangeSet() if self.userInitiated { - result.insert(integersIn: 0 ..< Int(Int64.max)) + result.insert(contentsOf: 0 ..< Int64.max) } else { for range in self.ranges.copyItems() { result.formUnion(range) @@ -77,7 +78,7 @@ private final class FetchManagerLocationEntry { private final class FetchManagerActiveContext { let userInitiated: Bool - var ranges = IndexSet() + var ranges = RangeSet() var disposable: Disposable? init(userInitiated: Bool) { @@ -224,12 +225,13 @@ private final class FetchManagerCategoryContext { let entryCompleted = self.entryCompleted let storeManager = self.storeManager let parsedRanges: [(Range, MediaBoxFetchPriority)]? - if ranges.count == 1 && ranges.min() == 0 && ranges.max() == Int(Int64.max) { + + if ranges == RangeSet(0 ..< Int64.max) { parsedRanges = nil } else { var resultRanges: [(Range, MediaBoxFetchPriority)] = [] - for range in ranges.rangeView { - resultRanges.append((Int64(range.lowerBound) ..< Int64(range.upperBound), .default)) + for range in ranges.ranges { + resultRanges.append((range, .default)) } parsedRanges = resultRanges } @@ -312,14 +314,14 @@ private final class FetchManagerCategoryContext { var count = 0 var isCompleteRange = false var isVideoPreload = false - for range in ranges.rangeView { + for range in ranges.ranges { count += 1 - if range.lowerBound == 0 && range.upperBound == Int(Int64.max) { + if range.lowerBound == 0 && range.upperBound == Int64.max { isCompleteRange = true } } - if count == 2, let range = ranges.rangeView.first, range.lowerBound == 0 && range.upperBound == 2 * 1024 * 1024 { + if count == 2, let range = ranges.ranges.first, range.lowerBound == 0 && range.upperBound == 2 * 1024 * 1024 { isVideoPreload = true } @@ -327,8 +329,8 @@ private final class FetchManagerCategoryContext { parsedRanges = nil } else { var resultRanges: [(Range, MediaBoxFetchPriority)] = [] - for range in ranges.rangeView { - resultRanges.append((Int64(range.lowerBound) ..< Int64(range.upperBound), .default)) + for range in ranges.ranges { + resultRanges.append((range, .default)) } parsedRanges = resultRanges } @@ -709,7 +711,7 @@ public final class FetchManagerImpl: FetchManager { } } - public func interactivelyFetched(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, mediaReference: AnyMediaReference?, resourceReference: MediaResourceReference, ranges: IndexSet, statsCategory: MediaResourceStatsCategory, elevatedPriority: Bool, userInitiated: Bool, priority: FetchManagerPriority = .userInitiated, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal { + public func interactivelyFetched(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, mediaReference: AnyMediaReference?, resourceReference: MediaResourceReference, ranges: RangeSet, statsCategory: MediaResourceStatsCategory, elevatedPriority: Bool, userInitiated: Bool, priority: FetchManagerPriority = .userInitiated, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal { let queue = self.queue return Signal { [weak self] subscriber in if let strongSelf = self {