From 852c1386556d284bc8833301117c70ad096d4df4 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 3 Feb 2023 20:37:39 +0100 Subject: [PATCH] Background upload experiment --- .../Sources/NotificationService.swift | 2 + Telegram/SiriIntents/IntentHandler.swift | 2 + .../WidgetKitWidget/TodayViewController.swift | 2 + .../Sources/Account/Account.swift | 4 +- .../PendingMessageUploadedContent.swift | 22 ++- .../Sources/State/PendingMessageManager.swift | 2 +- .../Sources/NotificationContentContext.swift | 2 +- .../Sources/ShareExtensionContext.swift | 2 +- .../Sources/SharedAccountContext.swift | 8 +- .../TelegramAccountAuxiliaryMethods.swift | 165 +++++++++--------- 10 files changed, 122 insertions(+), 89 deletions(-) diff --git a/Telegram/NotificationService/Sources/NotificationService.swift b/Telegram/NotificationService/Sources/NotificationService.swift index b56adb778f..44d3bf0aa7 100644 --- a/Telegram/NotificationService/Sources/NotificationService.swift +++ b/Telegram/NotificationService/Sources/NotificationService.swift @@ -33,6 +33,8 @@ private let accountAuxiliaryMethods = AccountAuxiliaryMethods(fetchResource: { a return .single(nil) }, prepareSecretThumbnailData: { _ in return nil +}, backgroundUpload: { _, _, _ in + return .single(nil) }) private func rootPathForBasePath(_ appGroupPath: String) -> String { diff --git a/Telegram/SiriIntents/IntentHandler.swift b/Telegram/SiriIntents/IntentHandler.swift index cfb667798e..50236fb0a0 100644 --- a/Telegram/SiriIntents/IntentHandler.swift +++ b/Telegram/SiriIntents/IntentHandler.swift @@ -28,6 +28,8 @@ private let accountAuxiliaryMethods = AccountAuxiliaryMethods(fetchResource: { a return .single(nil) }, prepareSecretThumbnailData: { _ in return nil +}, backgroundUpload: { _, _, _ in + return .single(nil) }) private struct ApplicationSettings { diff --git a/Telegram/WidgetKitWidget/TodayViewController.swift b/Telegram/WidgetKitWidget/TodayViewController.swift index 151136e396..e33a63b225 100644 --- a/Telegram/WidgetKitWidget/TodayViewController.swift +++ b/Telegram/WidgetKitWidget/TodayViewController.swift @@ -56,6 +56,8 @@ private let accountAuxiliaryMethods = AccountAuxiliaryMethods(fetchResource: { a return .single(nil) }, prepareSecretThumbnailData: { _ in return nil +}, backgroundUpload: { _, _, _ in + return .single(nil) }) private func rootPathForBasePath(_ appGroupPath: String) -> String { diff --git a/submodules/TelegramCore/Sources/Account/Account.swift b/submodules/TelegramCore/Sources/Account/Account.swift index 6a86884d7e..2342ae4c5b 100644 --- a/submodules/TelegramCore/Sources/Account/Account.swift +++ b/submodules/TelegramCore/Sources/Account/Account.swift @@ -678,11 +678,13 @@ public final class AccountAuxiliaryMethods { public let fetchResource: (Account, MediaResource, Signal<[(Range, MediaBoxFetchPriority)], NoError>, MediaResourceFetchParameters?) -> Signal? public let fetchResourceMediaReferenceHash: (MediaResource) -> Signal public let prepareSecretThumbnailData: (MediaResourceData) -> (PixelDimensions, Data)? + public let backgroundUpload: (Postbox, Network, MediaResource) -> Signal - public init(fetchResource: @escaping (Account, MediaResource, Signal<[(Range, MediaBoxFetchPriority)], NoError>, MediaResourceFetchParameters?) -> Signal?, fetchResourceMediaReferenceHash: @escaping (MediaResource) -> Signal, prepareSecretThumbnailData: @escaping (MediaResourceData) -> (PixelDimensions, Data)?) { + public init(fetchResource: @escaping (Account, MediaResource, Signal<[(Range, MediaBoxFetchPriority)], NoError>, MediaResourceFetchParameters?) -> Signal?, fetchResourceMediaReferenceHash: @escaping (MediaResource) -> Signal, prepareSecretThumbnailData: @escaping (MediaResourceData) -> (PixelDimensions, Data)?, backgroundUpload: @escaping (Postbox, Network, MediaResource) -> Signal) { self.fetchResource = fetchResource self.fetchResourceMediaReferenceHash = fetchResourceMediaReferenceHash self.prepareSecretThumbnailData = prepareSecretThumbnailData + self.backgroundUpload = backgroundUpload } } diff --git a/submodules/TelegramCore/Sources/PendingMessages/PendingMessageUploadedContent.swift b/submodules/TelegramCore/Sources/PendingMessages/PendingMessageUploadedContent.swift index e9d3f5659a..29d6a27614 100644 --- a/submodules/TelegramCore/Sources/PendingMessages/PendingMessageUploadedContent.swift +++ b/submodules/TelegramCore/Sources/PendingMessages/PendingMessageUploadedContent.swift @@ -102,7 +102,7 @@ func mediaContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods: if peerId.namespace != Namespaces.Peer.SecretChat, let reference = image.reference, case let .cloud(id, accessHash, maybeFileReference) = reference, let fileReference = maybeFileReference { return .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .media(Api.InputMedia.inputMediaPhoto(flags: 0, id: Api.InputPhoto.inputPhoto(id: id, accessHash: accessHash, fileReference: Buffer(data: fileReference)), ttlSeconds: nil), text), reuploadInfo: nil, cacheReferenceKey: nil))) } else { - return uploadedMediaImageContent(network: network, postbox: postbox, transformOutgoingMessageMedia: transformOutgoingMessageMedia, forceReupload: forceReupload, isGrouped: isGrouped, peerId: peerId, image: image, messageId: messageId, text: text, attributes: attributes, autoremoveMessageAttribute: autoremoveMessageAttribute, autoclearMessageAttribute: autoclearMessageAttribute) + return uploadedMediaImageContent(network: network, postbox: postbox, transformOutgoingMessageMedia: transformOutgoingMessageMedia, forceReupload: forceReupload, isGrouped: isGrouped, peerId: peerId, image: image, messageId: messageId, text: text, attributes: attributes, autoremoveMessageAttribute: autoremoveMessageAttribute, autoclearMessageAttribute: autoclearMessageAttribute, auxiliaryMethods: auxiliaryMethods) } } else if let file = media as? TelegramMediaFile { if let resource = file.resource as? CloudDocumentMediaResource { @@ -319,11 +319,29 @@ private func maybeCacheUploadedResource(postbox: Postbox, key: CachedSentMediaRe } } -private func uploadedMediaImageContent(network: Network, postbox: Postbox, transformOutgoingMessageMedia: TransformOutgoingMessageMedia?, forceReupload: Bool, isGrouped: Bool, peerId: PeerId, image: TelegramMediaImage, messageId: MessageId?, text: String, attributes: [MessageAttribute], autoremoveMessageAttribute: AutoremoveTimeoutMessageAttribute?, autoclearMessageAttribute: AutoclearTimeoutMessageAttribute?) -> Signal { +private func uploadedMediaImageContent(network: Network, postbox: Postbox, transformOutgoingMessageMedia: TransformOutgoingMessageMedia?, forceReupload: Bool, isGrouped: Bool, peerId: PeerId, image: TelegramMediaImage, messageId: MessageId?, text: String, attributes: [MessageAttribute], autoremoveMessageAttribute: AutoremoveTimeoutMessageAttribute?, autoclearMessageAttribute: AutoclearTimeoutMessageAttribute?, auxiliaryMethods: AccountAuxiliaryMethods) -> Signal { guard let largestRepresentation = largestImageRepresentation(image.representations) else { return .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .text(text), reuploadInfo: nil, cacheReferenceKey: nil))) } +/*#if DEBUG +if "".isEmpty { + return auxiliaryMethods.backgroundUpload(postbox, network, largestRepresentation.resource) + |> castError(PendingMessageUploadError.self) + |> mapToSignal { result -> Signal in + if let result = result { + return .single(.content(PendingMessageUploadedContentAndReuploadInfo( + content: .text(result), + reuploadInfo: nil, + cacheReferenceKey: nil + ))) + } else { + return .fail(.generic) + } + } +} +#endif*/ + let predownloadedResource: Signal = maybePredownloadedImageResource(postbox: postbox, peerId: peerId, resource: largestRepresentation.resource, forceRefresh: forceReupload) return predownloadedResource |> mapToSignal { result -> Signal in diff --git a/submodules/TelegramCore/Sources/State/PendingMessageManager.swift b/submodules/TelegramCore/Sources/State/PendingMessageManager.swift index 94978e384b..5383c9c5bb 100644 --- a/submodules/TelegramCore/Sources/State/PendingMessageManager.swift +++ b/submodules/TelegramCore/Sources/State/PendingMessageManager.swift @@ -1076,7 +1076,7 @@ public final class PendingMessageManager { let sendMessageRequest: Signal, MTRpcError> switch content.content { - case .text: + case let .text: if bubbleUpEmojiOrStickersets { flags |= Int32(1 << 15) } diff --git a/submodules/TelegramUI/Sources/NotificationContentContext.swift b/submodules/TelegramUI/Sources/NotificationContentContext.swift index 71a21f9a76..1f348040ac 100644 --- a/submodules/TelegramUI/Sources/NotificationContentContext.swift +++ b/submodules/TelegramUI/Sources/NotificationContentContext.swift @@ -138,7 +138,7 @@ public final class NotificationViewControllerImpl { return nil }) - sharedAccountContext = SharedAccountContextImpl(mainWindow: nil, sharedContainerPath: self.initializationData.appGroupPath, basePath: rootPath, encryptionParameters: ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: self.initializationData.encryptionParameters.0)!, salt: ValueBoxEncryptionParameters.Salt(data: self.initializationData.encryptionParameters.1)!), accountManager: accountManager, appLockContext: appLockContext, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings!, networkArguments: NetworkInitializationArguments(apiId: self.initializationData.apiId, apiHash: self.initializationData.apiHash, languagesCategory: self.initializationData.languagesCategory, appVersion: self.initializationData.appVersion, voipMaxLayer: 0, voipVersions: [], appData: .single(self.initializationData.bundleData), autolockDeadine: .single(nil), encryptionProvider: OpenSSLEncryptionProvider(), resolvedDeviceName: nil), hasInAppPurchases: false, rootPath: rootPath, legacyBasePath: nil, apsNotificationToken: .never(), voipNotificationToken: .never(), firebaseSecretStream: .never(), setNotificationCall: { _ in }, navigateToChat: { _, _, _ in }) + sharedAccountContext = SharedAccountContextImpl(mainWindow: nil, sharedContainerPath: self.initializationData.appGroupPath, basePath: rootPath, encryptionParameters: ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: self.initializationData.encryptionParameters.0)!, salt: ValueBoxEncryptionParameters.Salt(data: self.initializationData.encryptionParameters.1)!), accountManager: accountManager, appLockContext: appLockContext, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings!, networkArguments: NetworkInitializationArguments(apiId: self.initializationData.apiId, apiHash: self.initializationData.apiHash, languagesCategory: self.initializationData.languagesCategory, appVersion: self.initializationData.appVersion, voipMaxLayer: 0, voipVersions: [], appData: .single(self.initializationData.bundleData), autolockDeadine: .single(nil), encryptionProvider: OpenSSLEncryptionProvider(), resolvedDeviceName: nil), hasInAppPurchases: false, rootPath: rootPath, legacyBasePath: nil, apsNotificationToken: .never(), voipNotificationToken: .never(), firebaseSecretStream: .never(), setNotificationCall: { _ in }, navigateToChat: { _, _, _ in }, appDelegate: nil) presentationDataPromise.set(sharedAccountContext!.presentationData) } diff --git a/submodules/TelegramUI/Sources/ShareExtensionContext.swift b/submodules/TelegramUI/Sources/ShareExtensionContext.swift index 7834a043c7..15df5d7bd5 100644 --- a/submodules/TelegramUI/Sources/ShareExtensionContext.swift +++ b/submodules/TelegramUI/Sources/ShareExtensionContext.swift @@ -239,7 +239,7 @@ public class ShareRootControllerImpl { return nil }) - let sharedContext = SharedAccountContextImpl(mainWindow: nil, sharedContainerPath: self.initializationData.appGroupPath, basePath: rootPath, encryptionParameters: ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: self.initializationData.encryptionParameters.0)!, salt: ValueBoxEncryptionParameters.Salt(data: self.initializationData.encryptionParameters.1)!), accountManager: accountManager, appLockContext: appLockContext, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings!, networkArguments: NetworkInitializationArguments(apiId: self.initializationData.apiId, apiHash: self.initializationData.apiHash, languagesCategory: self.initializationData.languagesCategory, appVersion: self.initializationData.appVersion, voipMaxLayer: 0, voipVersions: [], appData: .single(self.initializationData.bundleData), autolockDeadine: .single(nil), encryptionProvider: OpenSSLEncryptionProvider(), resolvedDeviceName: nil), hasInAppPurchases: false, rootPath: rootPath, legacyBasePath: nil, apsNotificationToken: .never(), voipNotificationToken: .never(), firebaseSecretStream: .never(), setNotificationCall: { _ in }, navigateToChat: { _, _, _ in }) + let sharedContext = SharedAccountContextImpl(mainWindow: nil, sharedContainerPath: self.initializationData.appGroupPath, basePath: rootPath, encryptionParameters: ValueBoxEncryptionParameters(forceEncryptionIfNoSet: false, key: ValueBoxEncryptionParameters.Key(data: self.initializationData.encryptionParameters.0)!, salt: ValueBoxEncryptionParameters.Salt(data: self.initializationData.encryptionParameters.1)!), accountManager: accountManager, appLockContext: appLockContext, applicationBindings: applicationBindings, initialPresentationDataAndSettings: initialPresentationDataAndSettings!, networkArguments: NetworkInitializationArguments(apiId: self.initializationData.apiId, apiHash: self.initializationData.apiHash, languagesCategory: self.initializationData.languagesCategory, appVersion: self.initializationData.appVersion, voipMaxLayer: 0, voipVersions: [], appData: .single(self.initializationData.bundleData), autolockDeadine: .single(nil), encryptionProvider: OpenSSLEncryptionProvider(), resolvedDeviceName: nil), hasInAppPurchases: false, rootPath: rootPath, legacyBasePath: nil, apsNotificationToken: .never(), voipNotificationToken: .never(), firebaseSecretStream: .never(), setNotificationCall: { _ in }, navigateToChat: { _, _, _ in }, appDelegate: nil) presentationDataPromise.set(sharedContext.presentationData) internalContext = InternalContext(sharedContext: sharedContext) globalInternalContext = internalContext diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index d6b1eb93d2..39bfc964b3 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -175,7 +175,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { private var spotlightDataContext: SpotlightDataContext? private var widgetDataContext: WidgetDataContext? - public init(mainWindow: Window1?, sharedContainerPath: String, basePath: String, encryptionParameters: ValueBoxEncryptionParameters, accountManager: AccountManager, appLockContext: AppLockContext, applicationBindings: TelegramApplicationBindings, initialPresentationDataAndSettings: InitialPresentationDataAndSettings, networkArguments: NetworkInitializationArguments, hasInAppPurchases: Bool, rootPath: String, legacyBasePath: String?, apsNotificationToken: Signal, voipNotificationToken: Signal, firebaseSecretStream: Signal<[String: String], NoError>, setNotificationCall: @escaping (PresentationCall?) -> Void, navigateToChat: @escaping (AccountRecordId, PeerId, MessageId?) -> Void, displayUpgradeProgress: @escaping (Float?) -> Void = { _ in }) { + init(mainWindow: Window1?, sharedContainerPath: String, basePath: String, encryptionParameters: ValueBoxEncryptionParameters, accountManager: AccountManager, appLockContext: AppLockContext, applicationBindings: TelegramApplicationBindings, initialPresentationDataAndSettings: InitialPresentationDataAndSettings, networkArguments: NetworkInitializationArguments, hasInAppPurchases: Bool, rootPath: String, legacyBasePath: String?, apsNotificationToken: Signal, voipNotificationToken: Signal, firebaseSecretStream: Signal<[String: String], NoError>, setNotificationCall: @escaping (PresentationCall?) -> Void, navigateToChat: @escaping (AccountRecordId, PeerId, MessageId?) -> Void, displayUpgradeProgress: @escaping (Float?) -> Void = { _ in }, appDelegate: AppDelegate?) { assert(Queue.mainQueue().isCurrent()) precondition(!testHasInstance) @@ -437,7 +437,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { var addedAuthSignal: Signal = .single(nil) for (id, attributes) in records { if self.activeAccountsValue?.accounts.firstIndex(where: { $0.0 == id}) == nil { - addedSignals.append(accountWithId(accountManager: accountManager, networkArguments: networkArguments, id: id, encryptionParameters: encryptionParameters, supplementary: !applicationBindings.isMainApp, rootPath: rootPath, beginWithTestingEnvironment: attributes.isTestingEnvironment, backupData: attributes.backupData, auxiliaryMethods: telegramAccountAuxiliaryMethods) + addedSignals.append(accountWithId(accountManager: accountManager, networkArguments: networkArguments, id: id, encryptionParameters: encryptionParameters, supplementary: !applicationBindings.isMainApp, rootPath: rootPath, beginWithTestingEnvironment: attributes.isTestingEnvironment, backupData: attributes.backupData, auxiliaryMethods: makeTelegramAccountAuxiliaryMethods(appDelegate: appDelegate)) |> mapToSignal { result -> Signal in switch result { case let .authorized(account): @@ -459,7 +459,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { } } if let authRecord = authRecord, authRecord.0 != self.activeAccountsValue?.currentAuth?.id { - addedAuthSignal = accountWithId(accountManager: accountManager, networkArguments: networkArguments, id: authRecord.0, encryptionParameters: encryptionParameters, supplementary: !applicationBindings.isMainApp, rootPath: rootPath, beginWithTestingEnvironment: authRecord.1, backupData: nil, auxiliaryMethods: telegramAccountAuxiliaryMethods) + addedAuthSignal = accountWithId(accountManager: accountManager, networkArguments: networkArguments, id: authRecord.0, encryptionParameters: encryptionParameters, supplementary: !applicationBindings.isMainApp, rootPath: rootPath, beginWithTestingEnvironment: authRecord.1, backupData: nil, auxiliaryMethods: makeTelegramAccountAuxiliaryMethods(appDelegate: appDelegate)) |> mapToSignal { result -> Signal in switch result { case let .unauthorized(account): @@ -809,7 +809,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { let _ = immediateHasOngoingCallValue.swap(value) }) - let _ = managedCleanupAccounts(networkArguments: networkArguments, accountManager: self.accountManager, rootPath: rootPath, auxiliaryMethods: telegramAccountAuxiliaryMethods, encryptionParameters: encryptionParameters).start() + let _ = managedCleanupAccounts(networkArguments: networkArguments, accountManager: self.accountManager, rootPath: rootPath, auxiliaryMethods: makeTelegramAccountAuxiliaryMethods(appDelegate: appDelegate), encryptionParameters: encryptionParameters).start() self.updateNotificationTokensRegistration() diff --git a/submodules/TelegramUI/Sources/TelegramAccountAuxiliaryMethods.swift b/submodules/TelegramUI/Sources/TelegramAccountAuxiliaryMethods.swift index 8abc9f7b31..719e750138 100644 --- a/submodules/TelegramUI/Sources/TelegramAccountAuxiliaryMethods.swift +++ b/submodules/TelegramUI/Sources/TelegramAccountAuxiliaryMethods.swift @@ -12,88 +12,95 @@ import WallpaperResources import AppBundle import SwiftSignalKit -public let telegramAccountAuxiliaryMethods = AccountAuxiliaryMethods(fetchResource: { account, resource, ranges, _ in - if let resource = resource as? VideoLibraryMediaResource { - return fetchVideoLibraryMediaResource(account: account, resource: resource) - } else if let resource = resource as? LocalFileVideoMediaResource { - return fetchLocalFileVideoMediaResource(account: account, resource: resource) - } else if let resource = resource as? LocalFileGifMediaResource { - return fetchLocalFileGifMediaResource(resource: resource) - } else if let photoLibraryResource = resource as? PhotoLibraryMediaResource { - return fetchPhotoLibraryResource(localIdentifier: photoLibraryResource.localIdentifier) - } else if let resource = resource as? ICloudFileResource { - return fetchICloudFileResource(resource: resource) - } else if let resource = resource as? SecureIdLocalImageResource { - return fetchSecureIdLocalImageResource(postbox: account.postbox, resource: resource) - } else if let resource = resource as? EmojiSpriteResource { - return fetchEmojiSpriteResource(account: account, resource: resource) - } else if let resource = resource as? BundleResource { - return Signal { subscriber in - subscriber.putNext(.reset) - if let data = try? Data(contentsOf: URL(fileURLWithPath: resource.path), options: .mappedRead) { - subscriber.putNext(.dataPart(resourceOffset: 0, data: data, range: 0 ..< Int64(data.count), complete: true)) - } - return EmptyDisposable - } - } else if let wallpaperResource = resource as? WallpaperDataResource { - let builtinWallpapers: [String] = [ - "fqv01SQemVIBAAAApND8LDRUhRU" - ] - if builtinWallpapers.contains(wallpaperResource.slug) { - if let url = getAppBundle().url(forResource: wallpaperResource.slug, withExtension: "tgv") { - return Signal { subscriber in - subscriber.putNext(.reset) - if let data = try? Data(contentsOf: url, options: .mappedRead) { - subscriber.putNext(.dataPart(resourceOffset: 0, data: data, range: 0 ..< Int64(data.count), complete: true)) - } - - return EmptyDisposable +func makeTelegramAccountAuxiliaryMethods(appDelegate: AppDelegate?) -> AccountAuxiliaryMethods { + return AccountAuxiliaryMethods(fetchResource: { account, resource, ranges, _ in + if let resource = resource as? VideoLibraryMediaResource { + return fetchVideoLibraryMediaResource(account: account, resource: resource) + } else if let resource = resource as? LocalFileVideoMediaResource { + return fetchLocalFileVideoMediaResource(account: account, resource: resource) + } else if let resource = resource as? LocalFileGifMediaResource { + return fetchLocalFileGifMediaResource(resource: resource) + } else if let photoLibraryResource = resource as? PhotoLibraryMediaResource { + return fetchPhotoLibraryResource(localIdentifier: photoLibraryResource.localIdentifier) + } else if let resource = resource as? ICloudFileResource { + return fetchICloudFileResource(resource: resource) + } else if let resource = resource as? SecureIdLocalImageResource { + return fetchSecureIdLocalImageResource(postbox: account.postbox, resource: resource) + } else if let resource = resource as? EmojiSpriteResource { + return fetchEmojiSpriteResource(account: account, resource: resource) + } else if let resource = resource as? BundleResource { + return Signal { subscriber in + subscriber.putNext(.reset) + if let data = try? Data(contentsOf: URL(fileURLWithPath: resource.path), options: .mappedRead) { + subscriber.putNext(.dataPart(resourceOffset: 0, data: data, range: 0 ..< Int64(data.count), complete: true)) } - } else { - return nil + return EmptyDisposable } + } else if let wallpaperResource = resource as? WallpaperDataResource { + let builtinWallpapers: [String] = [ + "fqv01SQemVIBAAAApND8LDRUhRU" + ] + if builtinWallpapers.contains(wallpaperResource.slug) { + if let url = getAppBundle().url(forResource: wallpaperResource.slug, withExtension: "tgv") { + return Signal { subscriber in + subscriber.putNext(.reset) + if let data = try? Data(contentsOf: url, options: .mappedRead) { + subscriber.putNext(.dataPart(resourceOffset: 0, data: data, range: 0 ..< Int64(data.count), complete: true)) + } + + return EmptyDisposable + } + } else { + return nil + } + } + return nil + } else if let cloudDocumentMediaResource = resource as? CloudDocumentMediaResource { + if cloudDocumentMediaResource.fileId == 5789658100176783156 { + if let url = getAppBundle().url(forResource: "fqv01SQemVIBAAAApND8LDRUhRU", withExtension: "tgv") { + return Signal { subscriber in + subscriber.putNext(.reset) + if let data = try? Data(contentsOf: url, options: .mappedRead) { + subscriber.putNext(.dataPart(resourceOffset: 0, data: data, range: 0 ..< Int64(data.count), complete: true)) + } + + return EmptyDisposable + } + } else { + return nil + } + } + } else if let cloudDocumentSizeMediaResource = resource as? CloudDocumentSizeMediaResource { + if cloudDocumentSizeMediaResource.documentId == 5789658100176783156 && cloudDocumentSizeMediaResource.sizeSpec == "m" { + if let url = getAppBundle().url(forResource: "5789658100176783156-m", withExtension: "resource") { + return Signal { subscriber in + subscriber.putNext(.reset) + if let data = try? Data(contentsOf: url, options: .mappedRead) { + subscriber.putNext(.dataPart(resourceOffset: 0, data: data, range: 0 ..< Int64(data.count), complete: true)) + } + + return EmptyDisposable + } + } else { + return nil + } + } + return nil } return nil - } else if let cloudDocumentMediaResource = resource as? CloudDocumentMediaResource { - if cloudDocumentMediaResource.fileId == 5789658100176783156 { - if let url = getAppBundle().url(forResource: "fqv01SQemVIBAAAApND8LDRUhRU", withExtension: "tgv") { - return Signal { subscriber in - subscriber.putNext(.reset) - if let data = try? Data(contentsOf: url, options: .mappedRead) { - subscriber.putNext(.dataPart(resourceOffset: 0, data: data, range: 0 ..< Int64(data.count), complete: true)) - } - - return EmptyDisposable - } - } else { - return nil - } + }, fetchResourceMediaReferenceHash: { resource in + if let resource = resource as? VideoLibraryMediaResource { + return fetchVideoLibraryMediaResourceHash(resource: resource) } - } else if let cloudDocumentSizeMediaResource = resource as? CloudDocumentSizeMediaResource { - if cloudDocumentSizeMediaResource.documentId == 5789658100176783156 && cloudDocumentSizeMediaResource.sizeSpec == "m" { - if let url = getAppBundle().url(forResource: "5789658100176783156-m", withExtension: "resource") { - return Signal { subscriber in - subscriber.putNext(.reset) - if let data = try? Data(contentsOf: url, options: .mappedRead) { - subscriber.putNext(.dataPart(resourceOffset: 0, data: data, range: 0 ..< Int64(data.count), complete: true)) - } - - return EmptyDisposable - } - } else { - return nil - } + return .single(nil) + }, prepareSecretThumbnailData: { data in + return prepareSecretThumbnailData(data).flatMap { size, data in + return (PixelDimensions(size), data) } - return nil - } - return nil -}, fetchResourceMediaReferenceHash: { resource in - if let resource = resource as? VideoLibraryMediaResource { - return fetchVideoLibraryMediaResourceHash(resource: resource) - } - return .single(nil) -}, prepareSecretThumbnailData: { data in - return prepareSecretThumbnailData(data).flatMap { size, data in - return (PixelDimensions(size), data) - } -}) + }, backgroundUpload: { postbox, _, resource in + if let appDelegate { + return appDelegate.uploadInBackround(postbox: postbox, resource: resource) + } + return .single(nil) + }) +}