mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
Keep the device awake when sending messages
This commit is contained in:
@@ -904,7 +904,9 @@ private func extractAccountManagerState(records: AccountRecordsView<TelegramAcco
|
|||||||
return .single(nil)
|
return .single(nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let wakeupManager = SharedWakeupManager(beginBackgroundTask: { name, expiration in application.beginBackgroundTask(withName: name, expirationHandler: expiration) }, endBackgroundTask: { id in application.endBackgroundTask(id) }, backgroundTimeRemaining: { application.backgroundTimeRemaining }, activeAccounts: sharedContext.activeAccountContexts |> map { ($0.0?.account, $0.1.map { ($0.0, $0.1.account) }) }, liveLocationPolling: liveLocationPolling, watchTasks: watchTasks, inForeground: applicationBindings.applicationInForeground, hasActiveAudioSession: self.hasActiveAudioSession.get(), notificationManager: notificationManager, mediaManager: sharedContext.mediaManager, callManager: sharedContext.callManager, accountUserInterfaceInUse: { id in
|
let wakeupManager = SharedWakeupManager(beginBackgroundTask: { name, expiration in application.beginBackgroundTask(withName: name, expirationHandler: expiration) }, endBackgroundTask: { id in application.endBackgroundTask(id) }, backgroundTimeRemaining: { application.backgroundTimeRemaining }, acquireIdleExtension: {
|
||||||
|
return applicationBindings.pushIdleTimerExtension()
|
||||||
|
}, activeAccounts: sharedContext.activeAccountContexts |> map { ($0.0?.account, $0.1.map { ($0.0, $0.1.account) }) }, liveLocationPolling: liveLocationPolling, watchTasks: watchTasks, inForeground: applicationBindings.applicationInForeground, hasActiveAudioSession: self.hasActiveAudioSession.get(), notificationManager: notificationManager, mediaManager: sharedContext.mediaManager, callManager: sharedContext.callManager, accountUserInterfaceInUse: { id in
|
||||||
return sharedContext.accountUserInterfaceInUse(id)
|
return sharedContext.accountUserInterfaceInUse(id)
|
||||||
})
|
})
|
||||||
let sharedApplicationContext = SharedApplicationContext(sharedContext: sharedContext, notificationManager: notificationManager, wakeupManager: wakeupManager)
|
let sharedApplicationContext = SharedApplicationContext(sharedContext: sharedContext, notificationManager: notificationManager, wakeupManager: wakeupManager)
|
||||||
|
|||||||
@@ -33,7 +33,9 @@ private final class InternalContext {
|
|||||||
|
|
||||||
init(sharedContext: SharedAccountContextImpl) {
|
init(sharedContext: SharedAccountContextImpl) {
|
||||||
self.sharedContext = sharedContext
|
self.sharedContext = sharedContext
|
||||||
self.wakeupManager = SharedWakeupManager(beginBackgroundTask: { _, _ in nil }, endBackgroundTask: { _ in }, backgroundTimeRemaining: { 0.0 }, activeAccounts: sharedContext.activeAccountContexts |> map { ($0.0?.account, $0.1.map { ($0.0, $0.1.account) }) }, liveLocationPolling: .single(nil), watchTasks: .single(nil), inForeground: inForeground.get(), hasActiveAudioSession: .single(false), notificationManager: nil, mediaManager: sharedContext.mediaManager, callManager: sharedContext.callManager, accountUserInterfaceInUse: { id in
|
self.wakeupManager = SharedWakeupManager(beginBackgroundTask: { _, _ in nil }, endBackgroundTask: { _ in }, backgroundTimeRemaining: { 0.0 }, acquireIdleExtension: {
|
||||||
|
return nil
|
||||||
|
}, activeAccounts: sharedContext.activeAccountContexts |> map { ($0.0?.account, $0.1.map { ($0.0, $0.1.account) }) }, liveLocationPolling: .single(nil), watchTasks: .single(nil), inForeground: inForeground.get(), hasActiveAudioSession: .single(false), notificationManager: nil, mediaManager: sharedContext.mediaManager, callManager: sharedContext.callManager, accountUserInterfaceInUse: { id in
|
||||||
return sharedContext.accountUserInterfaceInUse(id)
|
return sharedContext.accountUserInterfaceInUse(id)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ public final class SharedWakeupManager {
|
|||||||
private let beginBackgroundTask: (String, @escaping () -> Void) -> UIBackgroundTaskIdentifier?
|
private let beginBackgroundTask: (String, @escaping () -> Void) -> UIBackgroundTaskIdentifier?
|
||||||
private let endBackgroundTask: (UIBackgroundTaskIdentifier) -> Void
|
private let endBackgroundTask: (UIBackgroundTaskIdentifier) -> Void
|
||||||
private let backgroundTimeRemaining: () -> Double
|
private let backgroundTimeRemaining: () -> Double
|
||||||
|
private let acquireIdleExtension: () -> Disposable?
|
||||||
|
|
||||||
private var inForeground: Bool = false
|
private var inForeground: Bool = false
|
||||||
private var hasActiveAudioSession: Bool = false
|
private var hasActiveAudioSession: Bool = false
|
||||||
@@ -65,15 +66,17 @@ public final class SharedWakeupManager {
|
|||||||
private var currentExternalCompletionValidationTimer: SwiftSignalKit.Timer?
|
private var currentExternalCompletionValidationTimer: SwiftSignalKit.Timer?
|
||||||
|
|
||||||
private var managedPausedInBackgroundPlayer: Disposable?
|
private var managedPausedInBackgroundPlayer: Disposable?
|
||||||
|
private var keepIdleDisposable: Disposable?
|
||||||
|
|
||||||
private var accountsAndTasks: [(Account, Bool, AccountTasks)] = []
|
private var accountsAndTasks: [(Account, Bool, AccountTasks)] = []
|
||||||
|
|
||||||
public init(beginBackgroundTask: @escaping (String, @escaping () -> Void) -> UIBackgroundTaskIdentifier?, endBackgroundTask: @escaping (UIBackgroundTaskIdentifier) -> Void, backgroundTimeRemaining: @escaping () -> Double, activeAccounts: Signal<(primary: Account?, accounts: [(AccountRecordId, Account)]), NoError>, liveLocationPolling: Signal<AccountRecordId?, NoError>, watchTasks: Signal<AccountRecordId?, NoError>, inForeground: Signal<Bool, NoError>, hasActiveAudioSession: Signal<Bool, NoError>, notificationManager: SharedNotificationManager?, mediaManager: MediaManager, callManager: PresentationCallManager?, accountUserInterfaceInUse: @escaping (AccountRecordId) -> Signal<Bool, NoError>) {
|
public init(beginBackgroundTask: @escaping (String, @escaping () -> Void) -> UIBackgroundTaskIdentifier?, endBackgroundTask: @escaping (UIBackgroundTaskIdentifier) -> Void, backgroundTimeRemaining: @escaping () -> Double, acquireIdleExtension: @escaping () -> Disposable?, activeAccounts: Signal<(primary: Account?, accounts: [(AccountRecordId, Account)]), NoError>, liveLocationPolling: Signal<AccountRecordId?, NoError>, watchTasks: Signal<AccountRecordId?, NoError>, inForeground: Signal<Bool, NoError>, hasActiveAudioSession: Signal<Bool, NoError>, notificationManager: SharedNotificationManager?, mediaManager: MediaManager, callManager: PresentationCallManager?, accountUserInterfaceInUse: @escaping (AccountRecordId) -> Signal<Bool, NoError>) {
|
||||||
assert(Queue.mainQueue().isCurrent())
|
assert(Queue.mainQueue().isCurrent())
|
||||||
|
|
||||||
self.beginBackgroundTask = beginBackgroundTask
|
self.beginBackgroundTask = beginBackgroundTask
|
||||||
self.endBackgroundTask = endBackgroundTask
|
self.endBackgroundTask = endBackgroundTask
|
||||||
self.backgroundTimeRemaining = backgroundTimeRemaining
|
self.backgroundTimeRemaining = backgroundTimeRemaining
|
||||||
|
self.acquireIdleExtension = acquireIdleExtension
|
||||||
|
|
||||||
self.inForegroundDisposable = (inForeground
|
self.inForegroundDisposable = (inForeground
|
||||||
|> deliverOnMainQueue).start(next: { [weak self] value in
|
|> deliverOnMainQueue).start(next: { [weak self] value in
|
||||||
@@ -186,6 +189,7 @@ public final class SharedWakeupManager {
|
|||||||
self.hasActiveAudioSessionDisposable?.dispose()
|
self.hasActiveAudioSessionDisposable?.dispose()
|
||||||
self.tasksDisposable?.dispose()
|
self.tasksDisposable?.dispose()
|
||||||
self.managedPausedInBackgroundPlayer?.dispose()
|
self.managedPausedInBackgroundPlayer?.dispose()
|
||||||
|
self.keepIdleDisposable?.dispose()
|
||||||
if let (taskId, _, timer) = self.currentTask {
|
if let (taskId, _, timer) = self.currentTask {
|
||||||
timer.invalidate()
|
timer.invalidate()
|
||||||
self.endBackgroundTask(taskId)
|
self.endBackgroundTask(taskId)
|
||||||
@@ -265,11 +269,15 @@ public final class SharedWakeupManager {
|
|||||||
var hasTasksForBackgroundExtension = false
|
var hasTasksForBackgroundExtension = false
|
||||||
|
|
||||||
var hasActiveCalls = false
|
var hasActiveCalls = false
|
||||||
|
var hasPendingMessages = false
|
||||||
for (_, _, tasks) in self.accountsAndTasks {
|
for (_, _, tasks) in self.accountsAndTasks {
|
||||||
if tasks.activeCalls {
|
if tasks.activeCalls {
|
||||||
hasActiveCalls = true
|
hasActiveCalls = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
if tasks.importantTasks.contains(.pendingMessages) {
|
||||||
|
hasPendingMessages = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.inForeground || self.hasActiveAudioSession || hasActiveCalls {
|
if self.inForeground || self.hasActiveAudioSession || hasActiveCalls {
|
||||||
@@ -350,6 +358,17 @@ public final class SharedWakeupManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.updateAccounts(hasTasks: hasTasksForBackgroundExtension)
|
self.updateAccounts(hasTasks: hasTasksForBackgroundExtension)
|
||||||
|
|
||||||
|
if hasPendingMessages {
|
||||||
|
if self.keepIdleDisposable == nil {
|
||||||
|
self.keepIdleDisposable = self.acquireIdleExtension()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if let keepIdleDisposable = self.keepIdleDisposable {
|
||||||
|
self.keepIdleDisposable = nil
|
||||||
|
keepIdleDisposable.dispose()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func updateAccounts(hasTasks: Bool) {
|
private func updateAccounts(hasTasks: Bool) {
|
||||||
|
|||||||
Reference in New Issue
Block a user