mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2026-01-06 05:02:54 +00:00
Update shared context
This commit is contained in:
@@ -643,11 +643,39 @@ private final class SharedApplicationContext {
|
||||
}
|
||||
}
|
||||
|
||||
let notificationManager = SharedNotificationManager(episodeId: self.episodeId, clearNotificationsManager: clearNotificationsManager, inForeground: applicationBindings.applicationInForeground, accounts: sharedContext.activeAccounts |> map { primary, accounts, _ in Array(accounts.values.map({ ($0, $0.id == primary?.id) })) })
|
||||
let notificationManager = SharedNotificationManager(episodeId: self.episodeId, clearNotificationsManager: clearNotificationsManager, inForeground: applicationBindings.applicationInForeground, accounts: sharedContext.activeAccounts |> map { primary, accounts, _ in Array(accounts.values.map({ ($0, $0.id == primary?.id) })) }, pollLiveLocationOnce: { accountId in
|
||||
let _ = (self.context.get()
|
||||
|> filter {
|
||||
return $0 != nil
|
||||
}
|
||||
|> take(1)
|
||||
|> deliverOnMainQueue).start(next: { context in
|
||||
if let context = context, context.context.account.id == accountId {
|
||||
context.context.liveLocationManager?.pollOnce()
|
||||
}
|
||||
})
|
||||
})
|
||||
setPresentationCall = { call in
|
||||
notificationManager.setNotificationCall(call, strings: sharedContext.currentPresentationData.with({ $0 }).strings)
|
||||
}
|
||||
let wakeupManager = SharedWakeupManager(activeAccounts: sharedContext.activeAccounts |> map { ($0.0, $0.1) }, inForeground: applicationBindings.applicationInForeground, hasActiveAudioSession: hasActiveAudioSession.get(), notificationManager: notificationManager, mediaManager: sharedContext.mediaManager, callManager: sharedContext.callManager)
|
||||
let liveLocationPolling = self.context.get()
|
||||
|> mapToSignal { context -> Signal<AccountRecordId?, NoError> in
|
||||
if let context = context, let liveLocationManager = context.context.liveLocationManager {
|
||||
let accountId = context.context.account.id
|
||||
return liveLocationManager.isPolling
|
||||
|> distinctUntilChanged
|
||||
|> map { value -> AccountRecordId? in
|
||||
if value {
|
||||
return accountId
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return .single(nil)
|
||||
}
|
||||
}
|
||||
let wakeupManager = SharedWakeupManager(activeAccounts: sharedContext.activeAccounts |> map { ($0.0, $0.1) }, liveLocationPolling: liveLocationPolling, inForeground: applicationBindings.applicationInForeground, hasActiveAudioSession: hasActiveAudioSession.get(), notificationManager: notificationManager, mediaManager: sharedContext.mediaManager, callManager: sharedContext.callManager)
|
||||
let sharedApplicationContext = SharedApplicationContext(sharedContext: sharedContext, notificationManager: notificationManager, wakeupManager: wakeupManager)
|
||||
self.sharedContextPromise.set(
|
||||
accountManager.transaction { transaction -> (SharedApplicationContext, LoggingSettings) in
|
||||
|
||||
@@ -23,6 +23,7 @@ final class SharedNotificationManager {
|
||||
private let episodeId: UInt32
|
||||
|
||||
private let clearNotificationsManager: ClearNotificationsManager
|
||||
private let pollLiveLocationOnce: (AccountRecordId) -> Void
|
||||
|
||||
private var inForeground: Bool = false
|
||||
private var inForegroundDisposable: Disposable?
|
||||
@@ -34,11 +35,12 @@ final class SharedNotificationManager {
|
||||
|
||||
private var pollStateContexts: [AccountRecordId: PollStateContext] = [:]
|
||||
|
||||
init(episodeId: UInt32, clearNotificationsManager: ClearNotificationsManager, inForeground: Signal<Bool, NoError>, accounts: Signal<[(Account, Bool)], NoError>) {
|
||||
init(episodeId: UInt32, clearNotificationsManager: ClearNotificationsManager, inForeground: Signal<Bool, NoError>, accounts: Signal<[(Account, Bool)], NoError>, pollLiveLocationOnce: @escaping (AccountRecordId) -> Void) {
|
||||
assert(Queue.mainQueue().isCurrent())
|
||||
|
||||
self.episodeId = episodeId
|
||||
self.clearNotificationsManager = clearNotificationsManager
|
||||
self.pollLiveLocationOnce = pollLiveLocationOnce
|
||||
|
||||
self.inForegroundDisposable = (inForeground
|
||||
|> deliverOnMainQueue).start(next: { [weak self] value in
|
||||
@@ -348,7 +350,9 @@ final class SharedNotificationManager {
|
||||
}
|
||||
}
|
||||
if isLocationPolling {
|
||||
//addedWakeups.insert(.backgroundLocation)
|
||||
if !self.inForeground || !isCurrent {
|
||||
self.pollLiveLocationOnce(account.id)
|
||||
}
|
||||
}
|
||||
|
||||
if let readMessageId = readMessageId {
|
||||
|
||||
@@ -49,7 +49,7 @@ final class SharedWakeupManager {
|
||||
|
||||
private var accountsAndTasks: [(Account, Bool, AccountTasks)] = []
|
||||
|
||||
init(activeAccounts: Signal<(primary: Account?, accounts: [AccountRecordId: Account]), NoError>, inForeground: Signal<Bool, NoError>, hasActiveAudioSession: Signal<Bool, NoError>, notificationManager: SharedNotificationManager, mediaManager: MediaManager, callManager: PresentationCallManager?) {
|
||||
init(activeAccounts: Signal<(primary: Account?, accounts: [AccountRecordId: Account]), NoError>, liveLocationPolling: Signal<AccountRecordId?, NoError>, inForeground: Signal<Bool, NoError>, hasActiveAudioSession: Signal<Bool, NoError>, notificationManager: SharedNotificationManager, mediaManager: MediaManager, callManager: PresentationCallManager?) {
|
||||
assert(Queue.mainQueue().isCurrent())
|
||||
|
||||
self.inForegroundDisposable = (inForeground
|
||||
@@ -102,9 +102,15 @@ final class SharedWakeupManager {
|
||||
}
|
||||
|> distinctUntilChanged
|
||||
|
||||
return combineLatest(queue: .mainQueue(), account.importantTasksRunning, notificationManager.isPollingState(accountId: account.id), hasActiveAudio, hasActiveCalls)
|
||||
|> map { importantTasksRunning, isPollingState, hasActiveAudio, hasActiveCalls -> (Account, Bool, AccountTasks) in
|
||||
return (account, primary?.id == account.id, AccountTasks(stateSynchronization: isPollingState, importantTasks: importantTasksRunning, backgroundLocation: false, backgroundDownloads: false, backgroundAudio: hasActiveAudio, activeCalls: hasActiveCalls))
|
||||
let hasActiveLiveLocationPolling = liveLocationPolling
|
||||
|> map { id in
|
||||
return id == account.id
|
||||
}
|
||||
|> distinctUntilChanged
|
||||
|
||||
return combineLatest(queue: .mainQueue(), account.importantTasksRunning, notificationManager.isPollingState(accountId: account.id), hasActiveAudio, hasActiveCalls, hasActiveLiveLocationPolling)
|
||||
|> map { importantTasksRunning, isPollingState, hasActiveAudio, hasActiveCalls, hasActiveLiveLocationPolling -> (Account, Bool, AccountTasks) in
|
||||
return (account, primary?.id == account.id, AccountTasks(stateSynchronization: isPollingState, importantTasks: importantTasksRunning, backgroundLocation: hasActiveLiveLocationPolling, backgroundDownloads: false, backgroundAudio: hasActiveAudio, activeCalls: hasActiveCalls))
|
||||
}
|
||||
}
|
||||
return combineLatest(signals)
|
||||
|
||||
Reference in New Issue
Block a user