diff --git a/submodules/TelegramUI/TelegramUI/ICloudResources.swift b/submodules/TelegramUI/TelegramUI/ICloudResources.swift index c69e5891a4..b9553f4e4c 100644 --- a/submodules/TelegramUI/TelegramUI/ICloudResources.swift +++ b/submodules/TelegramUI/TelegramUI/ICloudResources.swift @@ -209,7 +209,7 @@ func fetchICloudFileResource(resource: ICloudFileResource) -> Signal UIImage? { - guard let document = CGPDFDocument(url as CFURL) else { return nil } + guard let data = try? Data(contentsOf: url, options: .mappedIfSafe) else { return nil } + return generatePdfPreviewImage(data: data, size: size) +} + +func generatePdfPreviewImage(data: Data, size: CGSize) -> UIImage? { + guard let provider = CGDataProvider(data: data as CFData) else { return nil } + guard let document = CGPDFDocument(provider) else { return nil } guard let firstPage = document.page(at: 1) else { return nil } let context = DrawingContext(size: size) diff --git a/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift b/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift index 3d57e67baa..6ed084b7dc 100644 --- a/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift +++ b/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift @@ -222,27 +222,25 @@ public class ShareRootControllerImpl { let requestUserInteraction: ([UnpreparedShareItemContent]) -> Signal<[PreparedShareItemContent], NoError> = { content in return Signal { [weak self] subscriber in switch content[0] { - case let .contact(data): - let controller = deviceContactInfoController(context: context, subject: .filter(peer: nil, contactId: nil, contactData: data, completion: { peer, contactData in - let phone = contactData.basicData.phoneNumbers[0].value - if let vCardData = contactData.serializedVCard() { - subscriber.putNext([.media(.media(.standalone(media: TelegramMediaContact(firstName: contactData.basicData.firstName, lastName: contactData.basicData.lastName, phoneNumber: phone, peerId: nil, vCardData: vCardData))))]) + case let .contact(data): + let controller = deviceContactInfoController(context: context, subject: .filter(peer: nil, contactId: nil, contactData: data, completion: { peer, contactData in + let phone = contactData.basicData.phoneNumbers[0].value + if let vCardData = contactData.serializedVCard() { + subscriber.putNext([.media(.media(.standalone(media: TelegramMediaContact(firstName: contactData.basicData.firstName, lastName: contactData.basicData.lastName, phoneNumber: phone, peerId: nil, vCardData: vCardData))))]) + } + subscriber.putCompletion() + }), cancelled: { + cancelImpl?() + }) + + if let strongSelf = self, let window = strongSelf.mainWindow { + controller.presentationArguments = ViewControllerPresentationArguments(presentationAnimation: .modalSheet) + window.present(controller, on: .root) } - subscriber.putCompletion() - }), cancelled: { - cancelImpl?() - }) - - if let strongSelf = self, let window = strongSelf.mainWindow { - controller.presentationArguments = ViewControllerPresentationArguments(presentationAnimation: .modalSheet) - window.present(controller, on: .root) - } - break + break } - - return ActionDisposable { - } - } |> runOn(Queue.mainQueue()) + return EmptyDisposable + } |> runOn(Queue.mainQueue()) } let sentItems: ([PeerId], [PreparedShareItemContent], Account) -> Signal = { peerIds, contents, account in @@ -271,17 +269,17 @@ public class ShareRootControllerImpl { return .single(.done) } switch state { - case .preparing: - return .single(.preparing) - case let .progress(value): - return .single(.progress(value)) - case let .userInteractionRequired(value): - return requestUserInteraction(value) + case .preparing: + return .single(.preparing) + case let .progress(value): + return .single(.progress(value)) + case let .userInteractionRequired(value): + return requestUserInteraction(value) |> mapToSignal { contents -> Signal in return sentItems(peerIds, contents, account) - } - case let .done(contents): - return sentItems(peerIds, contents, account) + } + case let .done(contents): + return sentItems(peerIds, contents, account) } } } else { @@ -338,7 +336,7 @@ public class ShareRootControllerImpl { self?.getExtensionContext()?.completeRequest(returningItems: nil, completionHandler: nil) })]) strongSelf.mainWindow?.present(controller, on: .root) - }, completed: {})) + }, completed: {})) } } } diff --git a/submodules/TelegramUI/TelegramUI/ShareItems.swift b/submodules/TelegramUI/TelegramUI/ShareItems.swift index 7879f80f0c..da2c87cf6f 100644 --- a/submodules/TelegramUI/TelegramUI/ShareItems.swift +++ b/submodules/TelegramUI/TelegramUI/ShareItems.swift @@ -178,7 +178,12 @@ private func preparedShareItem(account: Account, to peerId: PeerId, value: [Stri } } } else { - return standaloneUploadedFile(account: account, peerId: peerId, text: "", source: .data(data), mimeType: mimeType, attributes: [.FileName(fileName: fileName ?? "file")], hintFileIsLarge: data.count > 5 * 1024 * 1024) + var thumbnailData: Data? + if mimeType == "application/pdf", let image = generatePdfPreviewImage(data: data, size: CGSize(width: 256.0, height: 256.0)), let jpegData = UIImageJPEGRepresentation(image, 0.5) { + thumbnailData = jpegData + } + + return standaloneUploadedFile(account: account, peerId: peerId, text: "", source: .data(data), thumbnailData: thumbnailData, mimeType: mimeType, attributes: [.FileName(fileName: fileName ?? "file")], hintFileIsLarge: data.count > 5 * 1024 * 1024) |> mapError { _ -> Void in return Void() } |> mapToSignal { event -> Signal in switch event { diff --git a/submodules/TelegramUI/TelegramUI/TGItemProviderSignals.m b/submodules/TelegramUI/TelegramUI/TGItemProviderSignals.m index 5901b34885..c3aa6b2d96 100644 --- a/submodules/TelegramUI/TelegramUI/TGItemProviderSignals.m +++ b/submodules/TelegramUI/TelegramUI/TGItemProviderSignals.m @@ -553,7 +553,7 @@ static void set_bits(uint8_t *bytes, int32_t bitOffset, int32_t numBits, int32_t // add output reader to reader [iPodAssetReader addOutput: readerOutput]; - if (! [iPodAssetReader startReading]) { + if (![iPodAssetReader startReading]) { NSLog(@"Unable to start reading!"); return nil; } @@ -563,7 +563,6 @@ static void set_bits(uint8_t *bytes, int32_t bitOffset, int32_t numBits, int32_t int _waveformPeakCount = 0; while (iPodAssetReader.status == AVAssetReaderStatusReading) { - // Check if the available buffer space is enough to hold at least one cycle of the sample data CMSampleBufferRef nextBuffer = [readerOutput copyNextSampleBuffer]; if (nextBuffer) {