session-ios/Session/Notifications/SyncPushTokensJob.swift

108 lines
3.5 KiB
Swift
Raw Normal View History

2017-04-27 21:11:30 +02:00
//
2019-02-25 21:19:41 +01:00
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
2017-04-27 21:11:30 +02:00
//
import PromiseKit
2020-11-11 07:45:50 +01:00
import SignalUtilitiesKit
@objc(OWSSyncPushTokensJob)
2017-04-27 21:11:30 +02:00
class SyncPushTokensJob: NSObject {
@objc public static let PushTokensDidChange = Notification.Name("PushTokensDidChange")
// MARK: Dependencies
let accountManager: AccountManager
let preferences: OWSPreferences
var pushRegistrationManager: PushRegistrationManager {
return PushRegistrationManager.shared
}
2018-05-25 23:17:15 +02:00
@objc var uploadOnlyIfStale = true
2018-05-25 23:17:15 +02:00
@objc
required init(accountManager: AccountManager, preferences: OWSPreferences) {
self.accountManager = accountManager
self.preferences = preferences
}
class func run(accountManager: AccountManager, preferences: OWSPreferences) -> Promise<Void> {
let job = self.init(accountManager: accountManager, preferences: preferences)
return job.run()
}
func run() -> Promise<Void> {
2018-10-13 21:21:46 +02:00
let runPromise = firstly {
return self.pushRegistrationManager.requestPushTokens()
2018-10-13 21:21:46 +02:00
}.then { (pushToken: String, voipToken: String) -> Promise<Void> in
var shouldUploadTokens = false
if self.preferences.getPushToken() != pushToken || self.preferences.getVoipToken() != voipToken {
shouldUploadTokens = true
} else if !self.uploadOnlyIfStale {
shouldUploadTokens = true
}
2018-08-02 21:18:40 +02:00
if AppVersion.sharedInstance().lastAppVersion != AppVersion.sharedInstance().currentAppVersion {
shouldUploadTokens = true
}
guard shouldUploadTokens else {
2018-10-13 21:21:46 +02:00
return Promise.value(())
}
2018-10-13 21:21:46 +02:00
return firstly {
2020-04-17 05:55:24 +02:00
self.accountManager.updatePushTokens(pushToken: pushToken, voipToken: voipToken, isForcedUpdate: shouldUploadTokens)
2018-10-13 21:21:46 +02:00
}.done { _ in
self.recordPushTokensLocally(pushToken: pushToken, voipToken: voipToken)
}
}
runPromise.retainUntilComplete()
return runPromise
}
2018-08-02 21:18:40 +02:00
// MARK: - objc wrappers, since objc can't use swift parameterized types
2018-10-13 21:21:46 +02:00
@objc
class func run(accountManager: AccountManager, preferences: OWSPreferences) -> AnyPromise {
let promise: Promise<Void> = self.run(accountManager: accountManager, preferences: preferences)
return AnyPromise(promise)
}
2018-10-13 21:21:46 +02:00
@objc
func run() -> AnyPromise {
let promise: Promise<Void> = self.run()
return AnyPromise(promise)
}
2018-10-13 21:21:46 +02:00
// MARK:
private func recordPushTokensLocally(pushToken: String, voipToken: String) {
2019-02-25 21:19:41 +01:00
Logger.warn("Recording push tokens locally. pushToken: \(redact(pushToken)), voipToken: \(redact(voipToken))")
var didTokensChange = false
if (pushToken != self.preferences.getPushToken()) {
2018-08-23 16:37:34 +02:00
Logger.info("Recording new plain push token")
2017-04-27 21:11:30 +02:00
self.preferences.setPushToken(pushToken)
didTokensChange = true
}
if (voipToken != self.preferences.getVoipToken()) {
2018-08-23 16:37:34 +02:00
Logger.info("Recording new voip token")
2017-04-27 21:11:30 +02:00
self.preferences.setVoipToken(voipToken)
didTokensChange = true
}
if (didTokensChange) {
2018-03-21 18:25:39 +01:00
NotificationCenter.default.postNotificationNameAsync(SyncPushTokensJob.PushTokensDidChange, object: nil)
}
}
}
2019-02-25 21:19:41 +01:00
private func redact(_ string: String) -> String {
return OWSIsDebugBuild() ? string : "[ READACTED \(string.prefix(2))...\(string.suffix(2)) ]"
}