mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Support audio
This commit is contained in:
parent
26a572f4b8
commit
c954a55d2b
@ -1746,6 +1746,7 @@ ios_extension(
|
|||||||
":SwiftSignalKitFramework",
|
":SwiftSignalKitFramework",
|
||||||
":PostboxFramework",
|
":PostboxFramework",
|
||||||
":TelegramCoreFramework",
|
":TelegramCoreFramework",
|
||||||
|
":TelegramUIFramework",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ swift_library(
|
|||||||
"//submodules/GZip:GZip",
|
"//submodules/GZip:GZip",
|
||||||
"//submodules/PersistentStringHash:PersistentStringHash",
|
"//submodules/PersistentStringHash:PersistentStringHash",
|
||||||
"//submodules/Utils/RangeSet",
|
"//submodules/Utils/RangeSet",
|
||||||
|
"//submodules/Media/ConvertOpusToAAC",
|
||||||
|
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
|
@ -16,6 +16,7 @@ import CallKit
|
|||||||
import AppLockState
|
import AppLockState
|
||||||
import NotificationsPresentationData
|
import NotificationsPresentationData
|
||||||
import RangeSet
|
import RangeSet
|
||||||
|
import ConvertOpusToAAC
|
||||||
|
|
||||||
private let queue = Queue()
|
private let queue = Queue()
|
||||||
|
|
||||||
@ -1249,7 +1250,7 @@ private final class NotificationServiceHandler {
|
|||||||
if let stateManager = strongSelf.stateManager {
|
if let stateManager = strongSelf.stateManager {
|
||||||
let shouldKeepConnection = stateManager.network.shouldKeepConnection
|
let shouldKeepConnection = stateManager.network.shouldKeepConnection
|
||||||
|
|
||||||
let pollCompletion: (NotificationContent) -> Void = { content in
|
let pollCompletion: (NotificationContent, Media?) -> Void = { content, customMedia in
|
||||||
var content = content
|
var content = content
|
||||||
|
|
||||||
queue.async {
|
queue.async {
|
||||||
@ -1260,6 +1261,8 @@ private final class NotificationServiceHandler {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mediaAttachment = mediaAttachment ?? customMedia
|
||||||
|
|
||||||
var fetchMediaSignal: Signal<Data?, NoError> = .single(nil)
|
var fetchMediaSignal: Signal<Data?, NoError> = .single(nil)
|
||||||
if let mediaAttachment = mediaAttachment {
|
if let mediaAttachment = mediaAttachment {
|
||||||
var contentType: MediaResourceUserContentType = .other
|
var contentType: MediaResourceUserContentType = .other
|
||||||
@ -1538,8 +1541,17 @@ private final class NotificationServiceHandler {
|
|||||||
if let mediaData = mediaData {
|
if let mediaData = mediaData {
|
||||||
stateManager.postbox.mediaBox.storeResourceData(file.resource.id, data: mediaData, synchronous: true)
|
stateManager.postbox.mediaBox.storeResourceData(file.resource.id, data: mediaData, synchronous: true)
|
||||||
}
|
}
|
||||||
if let storedPath = stateManager.postbox.mediaBox.completedResourcePath(file.resource, pathExtension: "ogg") {
|
if let storedPath = stateManager.postbox.mediaBox.completedResourcePath(file.resource, pathExtension: nil) {
|
||||||
if let attachment = try? UNNotificationAttachment(identifier: "audio", url: URL(fileURLWithPath: storedPath), options: nil) {
|
let semaphore = DispatchSemaphore(value: 0)
|
||||||
|
let tempFile = TempBox.shared.tempFile(fileName: "audio.m4a")
|
||||||
|
let _ = (convertOpusToAAC(sourcePath: storedPath, allocateTempFile: {
|
||||||
|
return tempFile.path
|
||||||
|
})
|
||||||
|
|> timeout(5.0, queue: .concurrentDefaultQueue(), alternate: .single(nil))).startStandalone(next: { _ in
|
||||||
|
semaphore.signal()
|
||||||
|
})
|
||||||
|
semaphore.wait()
|
||||||
|
if let attachment = try? UNNotificationAttachment(identifier: "audio", url: URL(fileURLWithPath: tempFile.path), options: nil) {
|
||||||
content.attachments.append(attachment)
|
content.attachments.append(attachment)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1601,9 +1613,9 @@ private final class NotificationServiceHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let pollWithUpdatedContent: Signal<NotificationContent, NoError>
|
let pollWithUpdatedContent: Signal<(NotificationContent, Media?), NoError>
|
||||||
if interactionAuthorId != nil || messageId != nil {
|
if interactionAuthorId != nil || messageId != nil {
|
||||||
pollWithUpdatedContent = stateManager.postbox.transaction { transaction -> NotificationContent in
|
pollWithUpdatedContent = stateManager.postbox.transaction { transaction -> (NotificationContent, Media?) in
|
||||||
var content = initialContent
|
var content = initialContent
|
||||||
|
|
||||||
if let interactionAuthorId = interactionAuthorId {
|
if let interactionAuthorId = interactionAuthorId {
|
||||||
@ -1648,22 +1660,37 @@ private final class NotificationServiceHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return content
|
return (content, nil)
|
||||||
}
|
}
|
||||||
|> then(
|
|> then(
|
||||||
pollSignal
|
pollSignal
|
||||||
|> map { _ -> NotificationContent in }
|
|> map { _ -> (NotificationContent, Media?) in }
|
||||||
)
|
)
|
||||||
|
|> takeLast
|
||||||
|
|> mapToSignal { content, _ -> Signal<(NotificationContent, Media?), NoError> in
|
||||||
|
return stateManager.postbox.transaction { transaction -> (NotificationContent, Media?) in
|
||||||
|
var parsedMedia: Media?
|
||||||
|
if let messageId, let message = transaction.getMessage(messageId) {
|
||||||
|
if let media = message.media.first {
|
||||||
|
parsedMedia = media
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (content, parsedMedia)
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
pollWithUpdatedContent = pollSignal
|
pollWithUpdatedContent = pollSignal
|
||||||
|> map { _ -> NotificationContent in }
|
|> map { _ -> (NotificationContent, Media?) in }
|
||||||
}
|
}
|
||||||
|
|
||||||
var updatedContent = initialContent
|
var updatedContent = initialContent
|
||||||
strongSelf.pollDisposable.set(pollWithUpdatedContent.start(next: { content in
|
var updatedMedia: Media?
|
||||||
|
strongSelf.pollDisposable.set(pollWithUpdatedContent.start(next: { content, media in
|
||||||
updatedContent = content
|
updatedContent = content
|
||||||
|
updatedMedia = media
|
||||||
}, completed: {
|
}, completed: {
|
||||||
pollCompletion(updatedContent)
|
pollCompletion(updatedContent, updatedMedia)
|
||||||
}))
|
}))
|
||||||
} else {
|
} else {
|
||||||
completed()
|
completed()
|
||||||
|
@ -28,6 +28,22 @@ public func take<T, E>(_ count: Int) -> (Signal<T, E>) -> Signal<T, E> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func takeLast<T, E>(_ signal: Signal<T, E>) -> Signal<T, E> {
|
||||||
|
return Signal { subscriber in
|
||||||
|
let lastValue = Atomic<T?>(value: nil)
|
||||||
|
return signal.start(next: { next in
|
||||||
|
let _ = lastValue.swap(next)
|
||||||
|
}, error: { error in
|
||||||
|
subscriber.putError(error)
|
||||||
|
}, completed: {
|
||||||
|
if let value = lastValue.with({ $0 }) {
|
||||||
|
subscriber.putNext(value)
|
||||||
|
}
|
||||||
|
subscriber.putCompletion()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public struct SignalTakeAction {
|
public struct SignalTakeAction {
|
||||||
public let passthrough: Bool
|
public let passthrough: Bool
|
||||||
public let complete: Bool
|
public let complete: Bool
|
||||||
|
Loading…
x
Reference in New Issue
Block a user