Swiftgram/TelegramUI/AccountContext.swift
Peter 112d1ed974 Merge commit '879f684d06d4440b0cfcfa38b2b699577247d044' into voiceover
# Conflicts:
#	TelegramUI.xcodeproj/project.pbxproj
#	TelegramUI/ChatController.swift
#	TelegramUI/ChatControllerNode.swift
#	TelegramUI/ChatMessageInteractiveMediaNode.swift
#	TelegramUI/OpenResolvedUrl.swift
#	TelegramUI/PeerMediaCollectionControllerNode.swift
#	TelegramUI/PresentationData.swift
#	TelegramUI/PresentationStrings.swift
#	TelegramUI/PresentationThemeSettings.swift
#	TelegramUI/Resources/PresentationStrings.mapping
#	TelegramUI/SettingsThemeWallpaperNode.swift
#	TelegramUI/TelegramApplicationContext.swift
#	TelegramUI/TelegramInitializeLegacyComponents.swift
#	TelegramUI/TelegramRootController.swift
#	TelegramUI/ThemeColorsGridController.swift
#	TelegramUI/ThemeGridController.swift
#	TelegramUI/ThemeGridControllerItem.swift
#	TelegramUI/ThemeGridControllerNode.swift
#	TelegramUI/ThemeGridSearchContentNode.swift
#	TelegramUI/ThemeSettingsChatPreviewItem.swift
#	TelegramUI/ThemeSettingsController.swift
#	TelegramUI/WallpaperGalleryController.swift
#	TelegramUI/WallpaperGalleryItem.swift
#	TelegramUI/WallpaperListPreviewController.swift
#	TelegramUI/WallpaperListPreviewControllerNode.swift
2019-02-01 21:30:14 +04:00

144 lines
6.7 KiB
Swift

import Foundation
import SwiftSignalKit
import UIKit
import Postbox
import TelegramCore
import Display
public final class TelegramApplicationOpenUrlCompletion {
public let completion: (Bool) -> Void
public init(completion: @escaping (Bool) -> Void) {
self.completion = completion
}
}
public final class TelegramApplicationBindings {
public let isMainApp: Bool
public let containerPath: String
public let appSpecificScheme: String
public let openUrl: (String) -> Void
public let openUniversalUrl: (String, TelegramApplicationOpenUrlCompletion) -> Void
public let canOpenUrl: (String) -> Bool
public let getTopWindow: () -> UIWindow?
public let displayNotification: (String) -> Void
public let applicationInForeground: Signal<Bool, NoError>
public let applicationIsActive: Signal<Bool, NoError>
public let clearMessageNotifications: ([MessageId]) -> Void
public let pushIdleTimerExtension: () -> Disposable
public let openSettings: () -> Void
public let openAppStorePage: () -> Void
public let registerForNotifications: (@escaping (Bool) -> Void) -> Void
public let requestSiriAuthorization: (@escaping (Bool) -> Void) -> Void
public let siriAuthorization: () -> AccessType
public let getWindowHost: () -> WindowHost?
public let presentNativeController: (UIViewController) -> Void
public let dismissNativeController: () -> Void
public init(isMainApp: Bool, containerPath: String, appSpecificScheme: String, openUrl: @escaping (String) -> Void, openUniversalUrl: @escaping (String, TelegramApplicationOpenUrlCompletion) -> Void, canOpenUrl: @escaping (String) -> Bool, getTopWindow: @escaping () -> UIWindow?, displayNotification: @escaping (String) -> Void, applicationInForeground: Signal<Bool, NoError>, applicationIsActive: Signal<Bool, NoError>, clearMessageNotifications: @escaping ([MessageId]) -> Void, pushIdleTimerExtension: @escaping () -> Disposable, openSettings: @escaping () -> Void, openAppStorePage: @escaping () -> Void, registerForNotifications: @escaping (@escaping (Bool) -> Void) -> Void, requestSiriAuthorization: @escaping (@escaping (Bool) -> Void) -> Void, siriAuthorization: @escaping () -> AccessType, getWindowHost: @escaping () -> WindowHost?, presentNativeController: @escaping (UIViewController) -> Void, dismissNativeController: @escaping () -> Void) {
self.isMainApp = isMainApp
self.containerPath = containerPath
self.appSpecificScheme = appSpecificScheme
self.openUrl = openUrl
self.openUniversalUrl = openUniversalUrl
self.canOpenUrl = canOpenUrl
self.getTopWindow = getTopWindow
self.displayNotification = displayNotification
self.applicationInForeground = applicationInForeground
self.applicationIsActive = applicationIsActive
self.clearMessageNotifications = clearMessageNotifications
self.pushIdleTimerExtension = pushIdleTimerExtension
self.openSettings = openSettings
self.openAppStorePage = openAppStorePage
self.registerForNotifications = registerForNotifications
self.requestSiriAuthorization = requestSiriAuthorization
self.siriAuthorization = siriAuthorization
self.presentNativeController = presentNativeController
self.dismissNativeController = dismissNativeController
self.getWindowHost = getWindowHost
}
}
public final class AccountContext {
public let sharedContext: SharedAccountContext
public let account: Account
public let fetchManager: FetchManager
public var keyShortcutsController: KeyShortcutsController?
let downloadedMediaStoreManager: DownloadedMediaStoreManager
public let liveLocationManager: LiveLocationManager?
let wallpaperUploadManager: WallpaperUploadManager?
let peerChannelMemberCategoriesContextsManager = PeerChannelMemberCategoriesContextsManager()
public let currentLimitsConfiguration: Atomic<LimitsConfiguration>
private let _limitsConfiguration = Promise<LimitsConfiguration>()
public var limitsConfiguration: Signal<LimitsConfiguration, NoError> {
return self._limitsConfiguration.get()
}
public var watchManager: WatchManager?
private var storedPassword: (String, CFAbsoluteTime, SwiftSignalKit.Timer)?
public var isCurrent: Bool = false {
didSet {
if !self.isCurrent {
//self.callManager = nil
}
}
}
public init(sharedContext: SharedAccountContext, account: Account, limitsConfiguration: LimitsConfiguration) {
self.sharedContext = sharedContext
self.account = account
self.downloadedMediaStoreManager = DownloadedMediaStoreManager(postbox: account.postbox, accountManager: sharedContext.accountManager)
if let locationManager = self.sharedContext.locationManager {
self.liveLocationManager = LiveLocationManager(postbox: account.postbox, network: account.network, accountPeerId: account.peerId, viewTracker: account.viewTracker, stateManager: account.stateManager, locationManager: locationManager, inForeground: self.sharedContext.applicationBindings.applicationInForeground)
} else {
self.liveLocationManager = nil
}
self.fetchManager = FetchManager(postbox: account.postbox, storeManager: self.downloadedMediaStoreManager)
if sharedContext.applicationBindings.isMainApp {
self.wallpaperUploadManager = WallpaperUploadManager(sharedContext: sharedContext, account: account, presentationData: sharedContext.presentationData)
} else {
self.wallpaperUploadManager = nil
}
self.currentLimitsConfiguration = Atomic(value: limitsConfiguration)
}
deinit {
}
public func attachOverlayMediaController(_ controller: OverlayMediaController) {
self.sharedContext.mediaManager.overlayMediaManager.attachOverlayMediaController(controller)
}
public func storeSecureIdPassword(password: String) {
self.storedPassword?.2.invalidate()
let timer = SwiftSignalKit.Timer(timeout: 1.0 * 60.0 * 60.0, repeat: false, completion: { [weak self] in
self?.storedPassword = nil
}, queue: Queue.mainQueue())
self.storedPassword = (password, CFAbsoluteTimeGetCurrent(), timer)
timer.start()
}
public func getStoredSecureIdPassword() -> String? {
if let (password, timestamp, timer) = self.storedPassword {
if CFAbsoluteTimeGetCurrent() > timestamp + 1.0 * 60.0 * 60.0 {
timer.invalidate()
self.storedPassword = nil
}
return password
} else {
return nil
}
}
}