Signal-iOS/Signal/AppLaunch/AppEnvironment.swift
2024-05-16 16:01:15 -05:00

113 lines
4.0 KiB
Swift

//
// Copyright 2018 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import SignalServiceKit
public class AppEnvironment: NSObject {
private static var _shared: AppEnvironment?
static func setSharedEnvironment(_ appEnvironment: AppEnvironment) {
owsAssert(self._shared == nil)
self._shared = appEnvironment
}
@objc
public class var shared: AppEnvironment { _shared! }
let pushRegistrationManagerRef: PushRegistrationManager
var callService: CallService!
let deviceTransferServiceRef: DeviceTransferService
let avatarHistorManagerRef = AvatarHistoryManager()
let cvAudioPlayerRef = CVAudioPlayer()
let speechManagerRef = SpeechManager()
let windowManagerRef = WindowManager()
private(set) var appIconBadgeUpdater: AppIconBadgeUpdater!
private(set) var badgeManager: BadgeManager!
private var usernameValidationObserverRef: UsernameValidationObserver?
init(deviceTransferService: DeviceTransferService) {
self.deviceTransferServiceRef = deviceTransferService
self.pushRegistrationManagerRef = PushRegistrationManager()
super.init()
SwiftSingletons.register(self)
}
func setUp(callService: CallService) {
self.callService = callService
self.badgeManager = BadgeManager(
databaseStorage: databaseStorage,
mainScheduler: DispatchQueue.main,
serialScheduler: DispatchQueue.sharedUtility
)
self.appIconBadgeUpdater = AppIconBadgeUpdater(badgeManager: badgeManager)
self.usernameValidationObserverRef = UsernameValidationObserver(
manager: DependenciesBridge.shared.usernameValidationManager,
database: DependenciesBridge.shared.db
)
AppReadiness.runNowOrWhenAppWillBecomeReady {
self.badgeManager.startObservingChanges(in: self.databaseStorage)
self.appIconBadgeUpdater.startObserving()
}
AppReadiness.runNowOrWhenAppDidBecomeReadyAsync {
let isPrimaryDevice = self.databaseStorage.read { tx -> Bool in
return DependenciesBridge.shared.tsAccountManager.registrationState(tx: tx.asV2Read).isPrimaryDevice ?? true
}
let db = DependenciesBridge.shared.db
let deletedCallRecordCleanupManager = DependenciesBridge.shared.deletedCallRecordCleanupManager
let groupCallRecordRingingCleanupManager = GroupCallRecordRingingCleanupManager.fromGlobals()
let inactiveLinkedDeviceFinder = DependenciesBridge.shared.inactiveLinkedDeviceFinder
let learnMyOwnPniManager = DependenciesBridge.shared.learnMyOwnPniManager
let linkedDevicePniKeyManager = DependenciesBridge.shared.linkedDevicePniKeyManager
let masterKeySyncManager = DependenciesBridge.shared.masterKeySyncManager
let pniHelloWorldManager = DependenciesBridge.shared.pniHelloWorldManager
let schedulers = DependenciesBridge.shared.schedulers
if isPrimaryDevice {
firstly(on: schedulers.sync) { () -> Promise<Void> in
learnMyOwnPniManager.learnMyOwnPniIfNecessary()
}
.done(on: schedulers.global()) {
db.write { tx in
pniHelloWorldManager.sayHelloWorldIfNecessary(tx: tx)
}
}
.cauterize()
} else {
db.read { tx in
linkedDevicePniKeyManager.validateLocalPniIdentityKeyIfNecessary(tx: tx)
}
}
db.asyncWrite { tx in
masterKeySyncManager.runStartupJobs(tx: tx)
}
db.asyncWrite { tx in
groupCallRecordRingingCleanupManager.cleanupRingingCalls(tx: tx)
}
Task {
await inactiveLinkedDeviceFinder.refreshLinkedDeviceStateIfNecessary()
}
deletedCallRecordCleanupManager.startCleanupIfNecessary()
}
}
}