Skip to content

Commit ad30eb2

Browse files
author
Isaac
committed
Update
1 parent 3ad1668 commit ad30eb2

File tree

7 files changed

+478
-20
lines changed

7 files changed

+478
-20
lines changed

‎Telegram/BUILD‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,12 @@ store_signin_fragment = """
549549
"""
550550
signin_fragment = store_signin_fragment if telegram_bundle_id in store_bundle_ids else ""
551551

552+
official_background_gpu_fragment = """
553+
<key>com.apple.developer.background-tasks.continued-processing.gpu</key>
554+
<true/>
555+
"""
556+
background_gpu_fragment = official_background_gpu_fragment if telegram_bundle_id == "ph.telegra.Telegraph" else ""
557+
552558
plist_fragment(
553559
name = "TelegramEntitlements",
554560
extension = "entitlements",
@@ -564,6 +570,7 @@ plist_fragment(
564570
communication_notifications_fragment,
565571
notification_filtering_fragment,
566572
signin_fragment,
573+
background_gpu_fragment,
567574
])
568575
)
569576

‎submodules/TelegramCore/Sources/PendingMessages/PendingMessageUploadedContent.swift‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,19 @@ struct PendingMessageUploadedContentAndReuploadInfo {
2424
}
2525

2626
struct PendingMessageUploadedContentProgress {
27+
enum Phase {
28+
case processing
29+
case uploading
30+
}
31+
2732
let progress: Float
2833
let mediaProgress: [MediaId: Float]
34+
let phase: Phase
2935

30-
init(progress: Float, mediaProgress: [MediaId: Float] = [:]) {
36+
init(progress: Float, mediaProgress: [MediaId: Float] = [:], phase: Phase = .uploading) {
3137
self.progress = progress
3238
self.mediaProgress = mediaProgress
39+
self.phase = phase
3340
}
3441
}
3542

@@ -1138,7 +1145,7 @@ private func uploadedMediaFileContent(network: Network, postbox: Postbox, auxili
11381145
|> mapToSignal { content, fileAndThumbnailResult, resourceStatus -> Signal<PendingMessageUploadedContentResult, PendingMessageUploadError> in
11391146
guard let content = content else {
11401147
if let resourceStatus = resourceStatus, case let .Fetching(_, progress) = resourceStatus {
1141-
return .single(.progress(PendingMessageUploadedContentProgress(progress: progress * 0.33)))
1148+
return .single(.progress(PendingMessageUploadedContentProgress(progress: progress * 0.33, phase: .processing)))
11421149
}
11431150
return .complete()
11441151
}

‎submodules/TelegramCore/Sources/TelegramEngine/Messages/PendingStoryManager.swift‎

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,21 @@ import SwiftSignalKit
33
import Postbox
44
import TelegramApi
55

6+
public enum PendingStoryUploadPhase: Equatable {
7+
case processing
8+
case uploading
9+
}
10+
11+
public struct PendingStoryUploadStatus: Equatable {
12+
public let progress: Float
13+
public let phase: PendingStoryUploadPhase
14+
15+
public init(progress: Float, phase: PendingStoryUploadPhase) {
16+
self.progress = progress
17+
self.phase = phase
18+
}
19+
}
20+
621
public extension Stories {
722
enum PendingTarget: Codable {
823
private enum CodingKeys: String, CodingKey {
@@ -280,6 +295,7 @@ final class PendingStoryManager {
280295
let updated: () -> Void
281296

282297
var progress: Float = 0.0
298+
var phase: PendingStoryUploadPhase = .uploading
283299
var disposable: Disposable?
284300

285301
init(queue: Queue, item: Stories.PendingItem, updated: @escaping () -> Void) {
@@ -306,6 +322,7 @@ final class PendingStoryManager {
306322
var itemsDisposable: Disposable?
307323
var currentPendingItemContext: PendingItemContext?
308324
var queuedPendingItems = Set<PeerId>()
325+
var queuedPendingItemStableIds = Set<Int32>()
309326

310327
var storyObserverContexts: [Int32: Bag<(Float) -> Void>] = [:]
311328

@@ -320,6 +337,18 @@ final class PendingStoryManager {
320337
return self.allStoriesUploadProgressPromise.get()
321338
}
322339

340+
private let pendingStoryUploadsPromise = Promise<[Int32: Float]>([:])
341+
private var pendingStoryUploadsValue: [Int32: Float] = [:]
342+
var pendingStoryUploads: Signal<[Int32: Float], NoError> {
343+
return self.pendingStoryUploadsPromise.get()
344+
}
345+
346+
private let pendingStoryUploadStatusesPromise = Promise<[Int32: PendingStoryUploadStatus]>([:])
347+
private var pendingStoryUploadStatusesValue: [Int32: PendingStoryUploadStatus] = [:]
348+
var pendingStoryUploadStatuses: Signal<[Int32: PendingStoryUploadStatus], NoError> {
349+
return self.pendingStoryUploadStatusesPromise.get()
350+
}
351+
323352
private let hasPendingPromise = ValuePromise<Bool>(false, ignoreRepeated: true)
324353
var hasPending: Signal<Bool, NoError> {
325354
return self.hasPendingPromise.get()
@@ -407,6 +436,7 @@ final class PendingStoryManager {
407436
return nil
408437
}
409438
})
439+
self.queuedPendingItemStableIds = Set(localState.items.map(\.stableId))
410440

411441
if self.currentPendingItemContext == nil, let firstItem = localState.items.first {
412442
let queue = self.queue
@@ -465,9 +495,15 @@ final class PendingStoryManager {
465495
return
466496
}
467497
switch event {
468-
case let .progress(progress):
498+
case let .progress(progress, phase):
469499
if let currentPendingItemContext = self.currentPendingItemContext, currentPendingItemContext.item.stableId == stableId {
470500
currentPendingItemContext.progress = progress
501+
switch phase {
502+
case .processing:
503+
currentPendingItemContext.phase = .processing
504+
case .uploading:
505+
currentPendingItemContext.phase = .uploading
506+
}
471507
currentPendingItemContext.updated()
472508
}
473509
case let .completed(id):
@@ -489,14 +525,20 @@ final class PendingStoryManager {
489525
return
490526
}
491527
switch event {
492-
case let .progress(progress):
528+
case let .progress(progress, phase):
493529
if let currentPendingItemContext = self.currentPendingItemContext, currentPendingItemContext.item.stableId == stableId {
494530
if let uploadInfo = currentPendingItemContext.item.uploadInfo {
495531
let partTotalProgress = 1.0 / Float(uploadInfo.total)
496532
currentPendingItemContext.progress = Float(uploadInfo.index) * partTotalProgress + progress * partTotalProgress
497533
} else {
498534
currentPendingItemContext.progress = progress
499535
}
536+
switch phase {
537+
case .processing:
538+
currentPendingItemContext.phase = .processing
539+
case .uploading:
540+
currentPendingItemContext.phase = .uploading
541+
}
500542
currentPendingItemContext.updated()
501543
}
502544
case let .completed(id):
@@ -529,6 +571,17 @@ final class PendingStoryManager {
529571
}
530572
}
531573

574+
var pendingStoryUploads: [Int32: Float] = [:]
575+
var pendingStoryUploadStatuses: [Int32: PendingStoryUploadStatus] = [:]
576+
for stableId in self.queuedPendingItemStableIds {
577+
pendingStoryUploads[stableId] = 0.0
578+
pendingStoryUploadStatuses[stableId] = PendingStoryUploadStatus(progress: 0.0, phase: .uploading)
579+
}
580+
if let currentPendingItemContext = self.currentPendingItemContext {
581+
pendingStoryUploads[currentPendingItemContext.item.stableId] = currentPendingItemContext.progress
582+
pendingStoryUploadStatuses[currentPendingItemContext.item.stableId] = PendingStoryUploadStatus(progress: currentPendingItemContext.progress, phase: currentPendingItemContext.phase)
583+
}
584+
532585
if self.allStoriesUploadProgressValue != currentProgress {
533586
let previousProgress = self.allStoriesUploadProgressValue
534587
self.allStoriesUploadProgressValue = currentProgress
@@ -550,6 +603,14 @@ final class PendingStoryManager {
550603
self.allStoriesUploadProgressPromise.set(.single(currentProgress))
551604
}
552605
}
606+
if self.pendingStoryUploadsValue != pendingStoryUploads {
607+
self.pendingStoryUploadsValue = pendingStoryUploads
608+
self.pendingStoryUploadsPromise.set(.single(pendingStoryUploads))
609+
}
610+
if self.pendingStoryUploadStatusesValue != pendingStoryUploadStatuses {
611+
self.pendingStoryUploadStatusesValue = pendingStoryUploadStatuses
612+
self.pendingStoryUploadStatusesPromise.set(.single(pendingStoryUploadStatuses))
613+
}
553614

554615
self.hasPendingPromise.set(self.currentPendingItemContext != nil)
555616
}
@@ -565,6 +626,18 @@ final class PendingStoryManager {
565626
}
566627
}
567628

629+
public var pendingStoryUploads: Signal<[Int32: Float], NoError> {
630+
return self.impl.signalWith { impl, subscriber in
631+
return impl.pendingStoryUploads.start(next: subscriber.putNext)
632+
}
633+
}
634+
635+
public var pendingStoryUploadStatuses: Signal<[Int32: PendingStoryUploadStatus], NoError> {
636+
return self.impl.signalWith { impl, subscriber in
637+
return impl.pendingStoryUploadStatuses.start(next: subscriber.putNext)
638+
}
639+
}
640+
568641
public var hasPending: Signal<Bool, NoError> {
569642
return self.impl.signalWith { impl, subscriber in
570643
return impl.hasPending.start(next: subscriber.putNext)

‎submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift‎

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,16 @@ public enum StoryUploadResult {
874874
case completed(Int32?)
875875
}
876876

877+
enum PendingStoryUploadInternalPhase {
878+
case processing
879+
case uploading
880+
}
881+
882+
enum PendingStoryUploadResult {
883+
case progress(Float, PendingStoryUploadInternalPhase)
884+
case completed(Int32?)
885+
}
886+
877887
private func prepareUploadStoryContent(account: Account, media: EngineStoryInputMedia) -> Media {
878888
switch media {
879889
case let .image(dimensions, data, _):
@@ -1271,7 +1281,7 @@ func _internal_uploadStoryImpl(
12711281
folders: [Int64],
12721282
randomId: Int64,
12731283
forwardInfo: Stories.PendingForwardInfo?
1274-
) -> Signal<StoryUploadResult, NoError> {
1284+
) -> Signal<PendingStoryUploadResult, NoError> {
12751285
return postbox.transaction { transaction -> (Peer, Peer?)? in
12761286
if let peer = transaction.getPeer(toPeerId) {
12771287
if let forwardInfo = forwardInfo {
@@ -1282,7 +1292,7 @@ func _internal_uploadStoryImpl(
12821292
}
12831293
return nil
12841294
}
1285-
|> mapToSignal { inputPeerAndForwardInfoPeer -> Signal<StoryUploadResult, NoError> in
1295+
|> mapToSignal { inputPeerAndForwardInfoPeer -> Signal<PendingStoryUploadResult, NoError> in
12861296
guard let (inputPeer, forwardInfoPeer) = inputPeerAndForwardInfoPeer, let inputPeer = apiInputPeer(inputPeer) else {
12871297
return .single(.completed(nil))
12881298
}
@@ -1295,12 +1305,19 @@ func _internal_uploadStoryImpl(
12951305
let passFetchProgress = media is TelegramMediaFile
12961306
let (contentSignal, originalMedia) = uploadedStoryContent(postbox: postbox, network: network, media: media, mediaReference: mediaReference, embeddedStickers: embeddedStickers, accountPeerId: accountPeerId, messageMediaPreuploadManager: messageMediaPreuploadManager, revalidationContext: revalidationContext, auxiliaryMethods: auxiliaryMethods, passFetchProgress: passFetchProgress)
12971307
return contentSignal
1298-
|> mapToSignal { result -> Signal<StoryUploadResult, NoError> in
1308+
|> mapToSignal { result -> Signal<PendingStoryUploadResult, NoError> in
12991309
switch result {
13001310
case let .progress(progress):
1301-
return .single(.progress(progress.progress))
1311+
let phase: PendingStoryUploadInternalPhase
1312+
switch progress.phase {
1313+
case .processing:
1314+
phase = .processing
1315+
case .uploading:
1316+
phase = .uploading
1317+
}
1318+
return .single(.progress(progress.progress, phase))
13021319
case let .content(content):
1303-
return postbox.transaction { transaction -> Signal<StoryUploadResult, NoError> in
1320+
return postbox.transaction { transaction -> Signal<PendingStoryUploadResult, NoError> in
13041321
let privacyRules = apiInputPrivacyRules(privacy: privacy, transaction: transaction)
13051322
switch content.content {
13061323
case let .media(inputMedia, _):
@@ -1374,8 +1391,8 @@ func _internal_uploadStoryImpl(
13741391
|> `catch` { _ -> Signal<Api.Updates?, NoError> in
13751392
return .single(nil)
13761393
}
1377-
|> mapToSignal { updates -> Signal<StoryUploadResult, NoError> in
1378-
return postbox.transaction { transaction -> StoryUploadResult in
1394+
|> mapToSignal { updates -> Signal<PendingStoryUploadResult, NoError> in
1395+
return postbox.transaction { transaction -> PendingStoryUploadResult in
13791396
var currentState: Stories.LocalState
13801397
if let value = transaction.getLocalStoryState()?.get(Stories.LocalState.self) {
13811398
currentState = value
@@ -1491,42 +1508,49 @@ func _internal_uploadBotPreviewImpl(
14911508
entities: [MessageTextEntity],
14921509
embeddedStickers: [TelegramMediaFile],
14931510
randomId: Int64
1494-
) -> Signal<StoryUploadResult, NoError> {
1511+
) -> Signal<PendingStoryUploadResult, NoError> {
14951512
return postbox.transaction { transaction -> Api.InputUser? in
14961513
if let peer = transaction.getPeer(toPeerId) {
14971514
return apiInputUser(peer)
14981515
}
14991516
return nil
15001517
}
1501-
|> mapToSignal { inputUser -> Signal<StoryUploadResult, NoError> in
1518+
|> mapToSignal { inputUser -> Signal<PendingStoryUploadResult, NoError> in
15021519
guard let inputUser else {
15031520
return .single(.completed(nil))
15041521
}
15051522

15061523
let passFetchProgress = media is TelegramMediaFile
15071524
let (contentSignal, originalMedia) = uploadedStoryContent(postbox: postbox, network: network, media: media, mediaReference: nil, embeddedStickers: embeddedStickers, accountPeerId: accountPeerId, messageMediaPreuploadManager: messageMediaPreuploadManager, revalidationContext: revalidationContext, auxiliaryMethods: auxiliaryMethods, passFetchProgress: passFetchProgress)
15081525
return contentSignal
1509-
|> mapToSignal { result -> Signal<StoryUploadResult, NoError> in
1526+
|> mapToSignal { result -> Signal<PendingStoryUploadResult, NoError> in
15101527
switch result {
15111528
case let .progress(progress):
1512-
return .single(.progress(progress.progress))
1529+
let phase: PendingStoryUploadInternalPhase
1530+
switch progress.phase {
1531+
case .processing:
1532+
phase = .processing
1533+
case .uploading:
1534+
phase = .uploading
1535+
}
1536+
return .single(.progress(progress.progress, phase))
15131537
case let .content(content):
1514-
return postbox.transaction { transaction -> Signal<StoryUploadResult, NoError> in
1538+
return postbox.transaction { transaction -> Signal<PendingStoryUploadResult, NoError> in
15151539
switch content.content {
15161540
case let .media(inputMedia, _):
15171541
return network.request(Api.functions.bots.addPreviewMedia(bot: inputUser, langCode: language ?? "", media: inputMedia))
15181542
|> map(Optional.init)
15191543
|> `catch` { _ -> Signal<Api.BotPreviewMedia?, NoError> in
15201544
return .single(nil)
15211545
}
1522-
|> mapToSignal { resultPreviewMedia -> Signal<StoryUploadResult, NoError> in
1546+
|> mapToSignal { resultPreviewMedia -> Signal<PendingStoryUploadResult, NoError> in
15231547
guard let resultPreviewMedia else {
15241548
return .single(.completed(nil))
15251549
}
15261550
switch resultPreviewMedia {
15271551
case let .botPreviewMedia(botPreviewMediaData):
15281552
let (date, resultMedia) = (botPreviewMediaData.date, botPreviewMediaData.media)
1529-
return postbox.transaction { transaction -> StoryUploadResult in
1553+
return postbox.transaction { transaction -> PendingStoryUploadResult in
15301554
var currentState: Stories.LocalState
15311555
if let value = transaction.getLocalStoryState()?.get(Stories.LocalState.self) {
15321556
currentState = value

‎submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,6 +1450,20 @@ public extension TelegramEngine {
14501450
return pendingStoryManager.allStoriesUploadProgress
14511451
}
14521452

1453+
public func pendingStoryUploads() -> Signal<[Int32: Float], NoError> {
1454+
guard let pendingStoryManager = self.account.pendingStoryManager else {
1455+
return .single([:])
1456+
}
1457+
return pendingStoryManager.pendingStoryUploads
1458+
}
1459+
1460+
public func pendingStoryUploadStatuses() -> Signal<[Int32: PendingStoryUploadStatus], NoError> {
1461+
guard let pendingStoryManager = self.account.pendingStoryManager else {
1462+
return .single([:])
1463+
}
1464+
return pendingStoryManager.pendingStoryUploadStatuses
1465+
}
1466+
14531467
public func storyUploadProgress(stableId: Int32) -> Signal<Float, NoError> {
14541468
guard let pendingStoryManager = self.account.pendingStoryManager else {
14551469
return .single(0.0)

‎submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorVideoExport.swift‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import TelegramCore
66
import Postbox
77
import ImageTransparency
88
import Photos
9+
import BackgroundTasks
910

1011
enum ExportWriterStatus {
1112
case unknown
@@ -278,12 +279,26 @@ public final class MediaEditorVideoExport {
278279
guard let self else {
279280
return
280281
}
282+
if case let .video(_, isStory) = subject, isStory {
283+
if #available(iOS 26.0, *) {
284+
if BGTaskScheduler.supportedResources.contains(.gpu) {
285+
return
286+
}
287+
}
288+
}
281289
self.resume()
282290
})
283291
let _ = NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: nil, using: { [weak self] _ in
284292
guard let self else {
285293
return
286294
}
295+
if case let .video(_, isStory) = subject, isStory {
296+
if #available(iOS 26.0, *) {
297+
if BGTaskScheduler.supportedResources.contains(.gpu) {
298+
return
299+
}
300+
}
301+
}
287302
self.pause()
288303
})
289304
}

0 commit comments

Comments
 (0)