diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift index 625c6b12da..a44dd6145a 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift @@ -519,14 +519,28 @@ public class WallpaperGalleryController: ViewController { let representation = CachedPatternWallpaperRepresentation(colors: file.settings.colors, intensity: intensity, rotation: file.settings.rotation) var data: Data? + var thumbnailData: Data? if let path = strongSelf.context.account.postbox.mediaBox.completedResourcePath(resource), let maybeData = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead) { data = maybeData } else if let path = strongSelf.context.sharedContext.accountManager.mediaBox.completedResourcePath(resource), let maybeData = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead) { data = maybeData } + + let thumbnailResource = file.file.previewRepresentations.first?.resource + + if let resource = thumbnailResource { + if let path = strongSelf.context.account.postbox.mediaBox.completedResourcePath(resource), let maybeData = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead) { + thumbnailData = maybeData + } else if let path = strongSelf.context.sharedContext.accountManager.mediaBox.completedResourcePath(resource), let maybeData = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead) { + thumbnailData = maybeData + } + } if let data = data { strongSelf.context.sharedContext.accountManager.mediaBox.storeResourceData(resource.id, data: data, synchronous: true) + if let thumbnailResource = thumbnailResource, let thumbnailData = thumbnailData { + strongSelf.context.sharedContext.accountManager.mediaBox.storeResourceData(thumbnailResource.id, data: thumbnailData, synchronous: true) + } let _ = (strongSelf.context.sharedContext.accountManager.mediaBox.cachedResourceRepresentation(resource, representation: representation, complete: true, fetch: true) |> filter({ $0.complete }) |> take(1) diff --git a/submodules/WallpaperResources/Sources/WallpaperResources.swift b/submodules/WallpaperResources/Sources/WallpaperResources.swift index 43f688ab64..fb1b2703e0 100644 --- a/submodules/WallpaperResources/Sources/WallpaperResources.swift +++ b/submodules/WallpaperResources/Sources/WallpaperResources.swift @@ -391,7 +391,7 @@ private func patternWallpaperDatas(account: Account, accountManager: AccountMana let fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[smallestIndex].reference) let fetchedFullSize = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[largestIndex].reference) - let thumbnailData = Signal { subscriber in + let accountThumbnailData = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() let thumbnailDisposable = account.postbox.mediaBox.cachedResourceRepresentation(representations[smallestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: true).start(next: { next in subscriber.putNext(next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: [])) @@ -407,8 +407,37 @@ private func patternWallpaperDatas(account: Account, accountManager: AccountMana thumbnailDisposable.dispose() } } + + let sharedThumbnailData = Signal { subscriber in + let thumbnailDisposable = accountManager.mediaBox.cachedResourceRepresentation(representations[smallestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: true).start(next: { next in + subscriber.putNext(next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: [])) + }, error: subscriber.putError, completed: subscriber.putCompletion) + + return ActionDisposable { + thumbnailDisposable.dispose() + } + } + + let thumbnailData = combineLatest(accountThumbnailData, sharedThumbnailData) + |> map { thumbnailData, sharedThumbnailData -> Data? in + return thumbnailData ?? sharedThumbnailData + } + |> distinctUntilChanged(isEqual: { lhs, rhs in + if lhs == nil && rhs == nil { + return true + } else { + return false + } + }) + |> take(until: { value in + if value != nil { + return SignalTakeAction(passthrough: true, complete: true) + } else { + return SignalTakeAction(passthrough: true, complete: false) + } + }) - let fullSizeData = Signal<(Data?, Bool), NoError> { subscriber in + let accountFullSizeData = Signal<(Data?, Bool), NoError> { subscriber in let fetchedFullSizeDisposable = fetchedFullSize.start() let fullSizeDisposable = account.postbox.mediaBox.cachedResourceRepresentation(representations[largestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: true).start(next: { next in subscriber.putNext((next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []), next.complete)) @@ -424,6 +453,39 @@ private func patternWallpaperDatas(account: Account, accountManager: AccountMana fullSizeDisposable.dispose() } } + + let sharedFullSizeData = Signal<(Data?, Bool), NoError> { subscriber in + let fullSizeDisposable = accountManager.mediaBox.cachedResourceRepresentation(representations[largestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: true).start(next: { next in + subscriber.putNext((next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []), next.complete)) + }, error: subscriber.putError, completed: subscriber.putCompletion) + + return ActionDisposable { + fullSizeDisposable.dispose() + } + } + + let fullSizeData = combineLatest(accountFullSizeData, sharedFullSizeData) + |> map { accountFullSizeData, sharedFullSizeData -> (Data?, Bool) in + if accountFullSizeData.0 != nil { + return accountFullSizeData + } else { + return sharedFullSizeData + } + } + |> distinctUntilChanged(isEqual: { lhs, rhs in + if lhs.0 == nil && rhs.0 == nil { + return true + } else { + return false + } + }) + |> take(until: { value in + if value.0 != nil { + return SignalTakeAction(passthrough: true, complete: true) + } else { + return SignalTakeAction(passthrough: true, complete: false) + } + }) return thumbnailData |> mapToSignal { thumbnailData in return fullSizeData |> map { (fullSizeData, complete) in