Move shared account settings to AccountManager

This commit is contained in:
Peter Iakovlev 2019-01-29 14:03:14 +04:00
parent a6c4acc378
commit 84231fb6fc
12 changed files with 223 additions and 150 deletions

View File

@ -196,15 +196,21 @@ public class UnauthorizedAccount {
}) })
} }
public func changedMasterDatacenterId(_ masterDatacenterId: Int32) -> Signal<UnauthorizedAccount, NoError> { public func changedMasterDatacenterId(accountManager: AccountManager, masterDatacenterId: Int32) -> Signal<UnauthorizedAccount, NoError> {
if masterDatacenterId == Int32(self.network.mtProto.datacenterId) { if masterDatacenterId == Int32(self.network.mtProto.datacenterId) {
return .single(self) return .single(self)
} else { } else {
let keychain = makeExclusiveKeychain(id: self.id, postbox: self.postbox) let keychain = makeExclusiveKeychain(id: self.id, postbox: self.postbox)
return accountManager.transaction { transaction -> (LocalizationSettings?, ProxySettings?) in
return (transaction.getSharedData(SharedDataKeys.localizationSettings) as? LocalizationSettings, transaction.getSharedData(SharedDataKeys.proxySettings) as? ProxySettings)
}
|> mapToSignal { localizationSettings, proxySettings -> Signal<(LocalizationSettings?, ProxySettings?, NetworkSettings?), NoError> in
return self.postbox.transaction { transaction -> (LocalizationSettings?, ProxySettings?, NetworkSettings?) in return self.postbox.transaction { transaction -> (LocalizationSettings?, ProxySettings?, NetworkSettings?) in
return (transaction.getPreferencesEntry(key: PreferencesKeys.localizationSettings) as? LocalizationSettings, transaction.getPreferencesEntry(key: PreferencesKeys.proxySettings) as? ProxySettings, transaction.getPreferencesEntry(key: PreferencesKeys.networkSettings) as? NetworkSettings) return (localizationSettings, proxySettings, transaction.getPreferencesEntry(key: PreferencesKeys.networkSettings) as? NetworkSettings)
} |> mapToSignal { (localizationSettings, proxySettings, networkSettings) -> Signal<UnauthorizedAccount, NoError> in }
}
|> mapToSignal { (localizationSettings, proxySettings, networkSettings) -> Signal<UnauthorizedAccount, NoError> in
return initializedNetwork(arguments: self.networkArguments, supplementary: false, datacenterId: Int(masterDatacenterId), keychain: keychain, basePath: self.basePath, testingEnvironment: self.testingEnvironment, languageCode: localizationSettings?.primaryComponent.languageCode, proxySettings: proxySettings, networkSettings: networkSettings, phoneNumber: nil) return initializedNetwork(arguments: self.networkArguments, supplementary: false, datacenterId: Int(masterDatacenterId), keychain: keychain, basePath: self.basePath, testingEnvironment: self.testingEnvironment, languageCode: localizationSettings?.primaryComponent.languageCode, proxySettings: proxySettings, networkSettings: networkSettings, phoneNumber: nil)
|> map { network in |> map { network in
let updated = UnauthorizedAccount(networkArguments: self.networkArguments, id: self.id, rootPath: self.rootPath, basePath: self.basePath, testingEnvironment: self.testingEnvironment, postbox: self.postbox, network: network) let updated = UnauthorizedAccount(networkArguments: self.networkArguments, id: self.id, rootPath: self.rootPath, basePath: self.basePath, testingEnvironment: self.testingEnvironment, postbox: self.postbox, network: network)
@ -254,7 +260,7 @@ let telegramPostboxSeedConfiguration: SeedConfiguration = {
}, additionalChatListIndexNamespace: Namespaces.Message.Cloud) }, additionalChatListIndexNamespace: Namespaces.Message.Cloud)
}() }()
public func accountWithId(networkArguments: NetworkInitializationArguments, id: AccountRecordId, supplementary: Bool, rootPath: String, beginWithTestingEnvironment: Bool, auxiliaryMethods: AccountAuxiliaryMethods, shouldKeepAutoConnection: Bool = true) -> Signal<AccountResult, NoError> { public func accountWithId(accountManager: AccountManager, networkArguments: NetworkInitializationArguments, id: AccountRecordId, supplementary: Bool, rootPath: String, beginWithTestingEnvironment: Bool, auxiliaryMethods: AccountAuxiliaryMethods, shouldKeepAutoConnection: Bool = true) -> Signal<AccountResult, NoError> {
let path = "\(rootPath)/\(accountRecordIdPathName(id))" let path = "\(rootPath)/\(accountRecordIdPathName(id))"
let postbox = openPostbox(basePath: path + "/postbox", globalMessageIdsNamespace: Namespaces.Message.Cloud, seedConfiguration: telegramPostboxSeedConfiguration) let postbox = openPostbox(basePath: path + "/postbox", globalMessageIdsNamespace: Namespaces.Message.Cloud, seedConfiguration: telegramPostboxSeedConfiguration)
@ -265,15 +271,14 @@ public func accountWithId(networkArguments: NetworkInitializationArguments, id:
case .upgrading: case .upgrading:
return .single(.upgrading) return .single(.upgrading)
case let .postbox(postbox): case let .postbox(postbox):
return postbox.stateView() return accountManager.transaction { transaction -> (LocalizationSettings?, ProxySettings?) in
|> take(1) return (transaction.getSharedData(SharedDataKeys.localizationSettings) as? LocalizationSettings, transaction.getSharedData(SharedDataKeys.proxySettings) as? ProxySettings)
|> mapToSignal { view -> Signal<AccountResult, NoError> in
return postbox.transaction { transaction -> (LocalizationSettings?, ProxySettings?, NetworkSettings?) in
return (transaction.getPreferencesEntry(key: PreferencesKeys.localizationSettings) as? LocalizationSettings, transaction.getPreferencesEntry(key: PreferencesKeys.proxySettings) as? ProxySettings, transaction.getPreferencesEntry(key: PreferencesKeys.networkSettings) as? NetworkSettings)
} }
|> mapToSignal { (localizationSettings, proxySettings, networkSettings) -> Signal<AccountResult, NoError> in |> mapToSignal { localizationSettings, proxySettings -> Signal<AccountResult, NoError> in
let accountState = view.state return postbox.transaction { transaction -> (PostboxCoding?, LocalizationSettings?, ProxySettings?, NetworkSettings?) in
return (transaction.getState(), localizationSettings, proxySettings, transaction.getPreferencesEntry(key: PreferencesKeys.networkSettings) as? NetworkSettings)
}
|> mapToSignal { (accountState, localizationSettings, proxySettings, networkSettings) -> Signal<AccountResult, NoError> in
let keychain = makeExclusiveKeychain(id: id, postbox: postbox) let keychain = makeExclusiveKeychain(id: id, postbox: postbox)
if let accountState = accountState { if let accountState = accountState {
@ -290,7 +295,7 @@ public func accountWithId(networkArguments: NetworkInitializationArguments, id:
|> mapToSignal { phoneNumber in |> mapToSignal { phoneNumber in
return initializedNetwork(arguments: networkArguments, supplementary: supplementary, datacenterId: Int(authorizedState.masterDatacenterId), keychain: keychain, basePath: path, testingEnvironment: authorizedState.isTestingEnvironment, languageCode: localizationSettings?.primaryComponent.languageCode, proxySettings: proxySettings, networkSettings: networkSettings, phoneNumber: phoneNumber) return initializedNetwork(arguments: networkArguments, supplementary: supplementary, datacenterId: Int(authorizedState.masterDatacenterId), keychain: keychain, basePath: path, testingEnvironment: authorizedState.isTestingEnvironment, languageCode: localizationSettings?.primaryComponent.languageCode, proxySettings: proxySettings, networkSettings: networkSettings, phoneNumber: phoneNumber)
|> map { network -> AccountResult in |> map { network -> AccountResult in
return .authorized(Account(id: id, basePath: path, testingEnvironment: authorizedState.isTestingEnvironment, postbox: postbox, network: network, networkArguments: networkArguments, peerId: authorizedState.peerId, auxiliaryMethods: auxiliaryMethods)) return .authorized(Account(accountManager: accountManager, id: id, basePath: path, testingEnvironment: authorizedState.isTestingEnvironment, postbox: postbox, network: network, networkArguments: networkArguments, peerId: authorizedState.peerId, auxiliaryMethods: auxiliaryMethods))
} }
} }
case _: case _:
@ -733,6 +738,21 @@ struct MasterNotificationKey: Codable {
let data: Data let data: Data
} }
private struct AccountDatacenterKey: Codable {
let id: Int64
let data: Data
}
private struct AccountDatacenterInfo: Codable {
let masterKey: AccountDatacenterKey
}
private struct StoredAccountInfo: Codable {
let primaryId: Int32
let isTestingEnvironment: Bool
let datacenters: [Int32: AccountDatacenterInfo]
}
func masterNotificationsKey(account: Account, ignoreDisabled: Bool) -> Signal<MasterNotificationKey, NoError> { func masterNotificationsKey(account: Account, ignoreDisabled: Bool) -> Signal<MasterNotificationKey, NoError> {
return masterNotificationsKey(masterNotificationKeyValue: account.masterNotificationKey, postbox: account.postbox, ignoreDisabled: ignoreDisabled) return masterNotificationsKey(masterNotificationKeyValue: account.masterNotificationKey, postbox: account.postbox, ignoreDisabled: ignoreDisabled)
} }
@ -871,7 +891,7 @@ public class Account {
var transformOutgoingMessageMedia: TransformOutgoingMessageMedia? var transformOutgoingMessageMedia: TransformOutgoingMessageMedia?
public init(id: AccountRecordId, basePath: String, testingEnvironment: Bool, postbox: Postbox, network: Network, networkArguments: NetworkInitializationArguments, peerId: PeerId, auxiliaryMethods: AccountAuxiliaryMethods) { public init(accountManager: AccountManager, id: AccountRecordId, basePath: String, testingEnvironment: Bool, postbox: Postbox, network: Network, networkArguments: NetworkInitializationArguments, peerId: PeerId, auxiliaryMethods: AccountAuxiliaryMethods) {
self.id = id self.id = id
self.basePath = basePath self.basePath = basePath
self.testingEnvironment = testingEnvironment self.testingEnvironment = testingEnvironment
@ -886,7 +906,7 @@ public class Account {
self.callSessionManager = CallSessionManager(postbox: postbox, network: network, maxLayer: networkArguments.voipMaxLayer, addUpdates: { [weak self] updates in self.callSessionManager = CallSessionManager(postbox: postbox, network: network, maxLayer: networkArguments.voipMaxLayer, addUpdates: { [weak self] updates in
self?.stateManager?.addUpdates(updates) self?.stateManager?.addUpdates(updates)
}) })
self.stateManager = AccountStateManager(accountPeerId: self.peerId, postbox: self.postbox, network: self.network, callSessionManager: self.callSessionManager, addIsContactUpdates: { [weak self] updates in self.stateManager = AccountStateManager(accountPeerId: self.peerId, accountManager: accountManager, postbox: self.postbox, network: self.network, callSessionManager: self.callSessionManager, addIsContactUpdates: { [weak self] updates in
self?.contactSyncManager?.addIsContactUpdates(updates) self?.contactSyncManager?.addIsContactUpdates(updates)
}, shouldKeepOnlinePresence: self.shouldKeepOnlinePresence.get(), peerInputActivityManager: self.peerInputActivityManager, auxiliaryMethods: auxiliaryMethods) }, shouldKeepOnlinePresence: self.shouldKeepOnlinePresence.get(), peerInputActivityManager: self.peerInputActivityManager, auxiliaryMethods: auxiliaryMethods)
self.contactSyncManager = ContactSyncManager(postbox: postbox, network: network, accountPeerId: peerId, stateManager: self.stateManager) self.contactSyncManager = ContactSyncManager(postbox: postbox, network: network, accountPeerId: peerId, stateManager: self.stateManager)
@ -897,11 +917,8 @@ public class Account {
}).start() }).start()
self.notificationAutolockReportManager = NotificationAutolockReportManager(deadline: self.autolockReportDeadline.get(), network: network) self.notificationAutolockReportManager = NotificationAutolockReportManager(deadline: self.autolockReportDeadline.get(), network: network)
self.autolockReportDeadline.set( self.autolockReportDeadline.set(
postbox.combinedView(keys: [.accessChallengeData]) accountManager.accessChallengeData()
|> map { view -> Int32? in |> map { dataView -> Int32? in
guard let dataView = view.views[.accessChallengeData] as? AccessChallengeDataView else {
return nil
}
guard let autolockDeadline = dataView.data.autolockDeadline else { guard let autolockDeadline = dataView.data.autolockDeadline else {
return nil return nil
} }
@ -1078,23 +1095,50 @@ public class Account {
strongSelf._importantTasksRunning.set(value) strongSelf._importantTasksRunning.set(value)
} }
})) }))
self.managedOperationsDisposable.add(managedConfigurationUpdates(postbox: self.postbox, network: self.network).start()) self.managedOperationsDisposable.add((accountManager.sharedData(keys: [SharedDataKeys.proxySettings])
|> map { sharedData -> ProxyServerSettings? in
if let settings = sharedData.entries[SharedDataKeys.proxySettings] as? ProxySettings {
return settings.effectiveActiveServer
} else {
return nil
}
}
|> distinctUntilChanged).start(next: { activeServer in
let updated = activeServer.flatMap { activeServer -> MTSocksProxySettings? in
return activeServer.mtProxySettings
}
network.context.updateApiEnvironment { environment in
let current = environment?.socksProxySettings
let updateNetwork: Bool
if let current = current, let updated = updated {
updateNetwork = !current.isEqual(updated)
} else {
updateNetwork = (current != nil) != (updated != nil)
}
if updateNetwork {
network.dropConnectionStatus()
return environment?.withUpdatedSocksProxySettings(updated)
} else {
return nil
}
}
}))
self.managedOperationsDisposable.add(managedConfigurationUpdates(accountManager: accountManager, postbox: self.postbox, network: self.network).start())
self.managedOperationsDisposable.add(managedVoipConfigurationUpdates(postbox: self.postbox, network: self.network).start()) self.managedOperationsDisposable.add(managedVoipConfigurationUpdates(postbox: self.postbox, network: self.network).start())
self.managedOperationsDisposable.add(managedAppConfigurationUpdates(postbox: self.postbox, network: self.network).start()) self.managedOperationsDisposable.add(managedAppConfigurationUpdates(postbox: self.postbox, network: self.network).start())
self.managedOperationsDisposable.add(managedTermsOfServiceUpdates(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start()) self.managedOperationsDisposable.add(managedTermsOfServiceUpdates(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start())
self.managedOperationsDisposable.add(managedAppChangelog(postbox: self.postbox, network: self.network, stateManager: self.stateManager, appVersion: self.networkArguments.appVersion).start()) self.managedOperationsDisposable.add(managedAppChangelog(postbox: self.postbox, network: self.network, stateManager: self.stateManager, appVersion: self.networkArguments.appVersion).start())
self.managedOperationsDisposable.add(managedProxyInfoUpdates(postbox: self.postbox, network: self.network, viewTracker: self.viewTracker).start()) self.managedOperationsDisposable.add(managedProxyInfoUpdates(postbox: self.postbox, network: self.network, viewTracker: self.viewTracker).start())
self.managedOperationsDisposable.add(managedLocalizationUpdatesOperations(postbox: self.postbox, network: self.network).start()) self.managedOperationsDisposable.add(managedLocalizationUpdatesOperations(accountManager: accountManager, postbox: self.postbox, network: self.network).start())
self.managedOperationsDisposable.add(managedPendingPeerNotificationSettings(postbox: self.postbox, network: self.network).start()) self.managedOperationsDisposable.add(managedPendingPeerNotificationSettings(postbox: self.postbox, network: self.network).start())
self.managedOperationsDisposable.add(managedSynchronizeAppLogEventsOperations(postbox: self.postbox, network: self.network).start()) self.managedOperationsDisposable.add(managedSynchronizeAppLogEventsOperations(postbox: self.postbox, network: self.network).start())
let storagePreferencesKey: PostboxViewKey = .preferences(keys: Set([PreferencesKeys.cacheStorageSettings]))
let mediaBox = postbox.mediaBox let mediaBox = postbox.mediaBox
self.storageSettingsDisposable = self.postbox.combinedView(keys: [storagePreferencesKey]).start(next: { [weak mediaBox] view in self.storageSettingsDisposable = accountManager.sharedData(keys: [SharedDataKeys.cacheStorageSettings]).start(next: { [weak mediaBox] sharedData in
guard let mediaBox = mediaBox else { guard let mediaBox = mediaBox else {
return return
} }
let settings: CacheStorageSettings = ((view.views[storagePreferencesKey] as? PreferencesView)?.values[PreferencesKeys.cacheStorageSettings] as? CacheStorageSettings) ?? CacheStorageSettings.defaultSettings let settings: CacheStorageSettings = sharedData.entries[SharedDataKeys.cacheStorageSettings] as? CacheStorageSettings ?? CacheStorageSettings.defaultSettings
mediaBox.setMaxStoreTime(settings.defaultCacheStorageTimeout) mediaBox.setMaxStoreTime(settings.defaultCacheStorageTimeout)
}) })
@ -1104,6 +1148,24 @@ public class Account {
let _ = try? data.write(to: URL(fileURLWithPath: "\(basePath)/notificationsKey")) let _ = try? data.write(to: URL(fileURLWithPath: "\(basePath)/notificationsKey"))
} }
}) })
let primaryDatacenterId = Int32(network.datacenterId)
let context = network.context
context.performBatchUpdates {
var datacenters: [Int32: AccountDatacenterInfo] = [:]
for nId in context.knownDatacenterIds() {
if let id = nId as? Int {
if let authInfo = context.authInfoForDatacenter(withId: id), let authKey = authInfo.authKey {
datacenters[Int32(id)] = AccountDatacenterInfo(masterKey: AccountDatacenterKey(id: authInfo.authKeyId, data: authKey))
}
}
}
let storedInfo = StoredAccountInfo(primaryId: primaryDatacenterId, isTestingEnvironment: testingEnvironment, datacenters: datacenters)
let encoder = JSONEncoder()
if let data = try? encoder.encode(storedInfo) {
let _ = try? data.write(to: URL(fileURLWithPath: "\(basePath)/storedInfo"))
}
}
} }
deinit { deinit {

View File

@ -209,7 +209,7 @@ public func currentAccount(allocateIfNotExists: Bool, networkArguments: NetworkI
return false return false
} }
}) })
return accountWithId(networkArguments: networkArguments, id: record.0, supplementary: supplementary, rootPath: rootPath, beginWithTestingEnvironment: beginWithTestingEnvironment, auxiliaryMethods: auxiliaryMethods) return accountWithId(accountManager: manager, networkArguments: networkArguments, id: record.0, supplementary: supplementary, rootPath: rootPath, beginWithTestingEnvironment: beginWithTestingEnvironment, auxiliaryMethods: auxiliaryMethods)
|> mapToSignal { accountResult -> Signal<AccountResult?, NoError> in |> mapToSignal { accountResult -> Signal<AccountResult?, NoError> in
let postbox: Postbox let postbox: Postbox
let initialKind: AccountKind let initialKind: AccountKind
@ -377,7 +377,7 @@ private func cleanupAccount(networkArguments: NetworkInitializationArguments, ac
return false return false
} }
}) })
return accountWithId(networkArguments: networkArguments, id: id, supplementary: true, rootPath: rootPath, beginWithTestingEnvironment: beginWithTestingEnvironment, auxiliaryMethods: auxiliaryMethods) return accountWithId(accountManager: accountManager, networkArguments: networkArguments, id: id, supplementary: true, rootPath: rootPath, beginWithTestingEnvironment: beginWithTestingEnvironment, auxiliaryMethods: auxiliaryMethods)
|> mapToSignal { account -> Signal<Void, NoError> in |> mapToSignal { account -> Signal<Void, NoError> in
switch account { switch account {
case .upgrading: case .upgrading:

View File

@ -1933,7 +1933,7 @@ private func recordPeerActivityTimestamp(peerId: PeerId, timestamp: Int32, into
} }
} }
func replayFinalState(accountPeerId: PeerId, mediaBox: MediaBox, transaction: Transaction, auxiliaryMethods: AccountAuxiliaryMethods, finalState: AccountFinalState) -> AccountReplayedFinalState? { func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountPeerId: PeerId, mediaBox: MediaBox, transaction: Transaction, auxiliaryMethods: AccountAuxiliaryMethods, finalState: AccountFinalState) -> AccountReplayedFinalState? {
let verified = verifyTransaction(transaction, finalState: finalState.state) let verified = verifyTransaction(transaction, finalState: finalState.state)
if !verified { if !verified {
Logger.shared.log("State", "failed to verify final state") Logger.shared.log("State", "failed to verify final state")
@ -2583,6 +2583,7 @@ func replayFinalState(accountPeerId: PeerId, mediaBox: MediaBox, transaction: Tr
if !pollLangPacks.isEmpty { if !pollLangPacks.isEmpty {
addSynchronizeLocalizationUpdatesOperation(transaction: transaction) addSynchronizeLocalizationUpdatesOperation(transaction: transaction)
} else { } else {
let _ = (accountManager.transaction { transaction -> Void in
outer: for (langCode, langPackDifference) in langPackDifferences { outer: for (langCode, langPackDifference) in langPackDifferences {
if !langPackDifference.isEmpty { if !langPackDifference.isEmpty {
let sortedLangPackDifference = langPackDifference.sorted(by: { lhs, rhs in let sortedLangPackDifference = langPackDifference.sorted(by: { lhs, rhs in
@ -2601,12 +2602,15 @@ func replayFinalState(accountPeerId: PeerId, mediaBox: MediaBox, transaction: Tr
for difference in sortedLangPackDifference { for difference in sortedLangPackDifference {
if !tryApplyingLanguageDifference(transaction: transaction, langCode: langCode, difference: difference) { if !tryApplyingLanguageDifference(transaction: transaction, langCode: langCode, difference: difference) {
let _ = (postbox.transaction { transaction -> Void in
addSynchronizeLocalizationUpdatesOperation(transaction: transaction) addSynchronizeLocalizationUpdatesOperation(transaction: transaction)
}).start()
break outer break outer
} }
} }
} }
} }
}).start()
} }
addedIncomingMessageIds.append(contentsOf: addedSecretMessageIds) addedIncomingMessageIds.append(contentsOf: addedSecretMessageIds)

View File

@ -52,6 +52,7 @@ private final class UpdatedWebpageSubscriberContext {
public final class AccountStateManager { public final class AccountStateManager {
private let queue = Queue() private let queue = Queue()
private let accountPeerId: PeerId private let accountPeerId: PeerId
private let accountManager: AccountManager
private let postbox: Postbox private let postbox: Postbox
private let network: Network private let network: Network
private let callSessionManager: CallSessionManager private let callSessionManager: CallSessionManager
@ -129,8 +130,9 @@ public final class AccountStateManager {
private let appliedQtsPromise = Promise<Int32?>(nil) private let appliedQtsPromise = Promise<Int32?>(nil)
private let appliedQtsDisposable = MetaDisposable() private let appliedQtsDisposable = MetaDisposable()
init(accountPeerId: PeerId, postbox: Postbox, network: Network, callSessionManager: CallSessionManager, addIsContactUpdates: @escaping ([(PeerId, Bool)]) -> Void, shouldKeepOnlinePresence: Signal<Bool, NoError>, peerInputActivityManager: PeerInputActivityManager, auxiliaryMethods: AccountAuxiliaryMethods) { init(accountPeerId: PeerId, accountManager: AccountManager, postbox: Postbox, network: Network, callSessionManager: CallSessionManager, addIsContactUpdates: @escaping ([(PeerId, Bool)]) -> Void, shouldKeepOnlinePresence: Signal<Bool, NoError>, peerInputActivityManager: PeerInputActivityManager, auxiliaryMethods: AccountAuxiliaryMethods) {
self.accountPeerId = accountPeerId self.accountPeerId = accountPeerId
self.accountManager = accountManager
self.postbox = postbox self.postbox = postbox
self.network = network self.network = network
self.callSessionManager = callSessionManager self.callSessionManager = callSessionManager
@ -353,6 +355,7 @@ public final class AccountStateManager {
case let .pollDifference(currentEvents): case let .pollDifference(currentEvents):
self.operationTimer?.invalidate() self.operationTimer?.invalidate()
self.currentIsUpdatingValue = true self.currentIsUpdatingValue = true
let accountManager = self.accountManager
let postbox = self.postbox let postbox = self.postbox
let network = self.network let network = self.network
let mediaBox = postbox.mediaBox let mediaBox = postbox.mediaBox
@ -401,7 +404,7 @@ public final class AccountStateManager {
} }
return postbox.transaction { transaction -> (Api.updates.Difference?, AccountReplayedFinalState?) in return postbox.transaction { transaction -> (Api.updates.Difference?, AccountReplayedFinalState?) in
let startTime = CFAbsoluteTimeGetCurrent() let startTime = CFAbsoluteTimeGetCurrent()
let replayedState = replayFinalState(accountPeerId: accountPeerId, mediaBox: mediaBox, transaction: transaction, auxiliaryMethods: auxiliaryMethods, finalState: finalState) let replayedState = replayFinalState(accountManager: accountManager, postbox: postbox, accountPeerId: accountPeerId, mediaBox: mediaBox, transaction: transaction, auxiliaryMethods: auxiliaryMethods, finalState: finalState)
let deltaTime = CFAbsoluteTimeGetCurrent() - startTime let deltaTime = CFAbsoluteTimeGetCurrent() - startTime
if deltaTime > 1.0 { if deltaTime > 1.0 {
Logger.shared.log("State", "replayFinalState took \(deltaTime)s") Logger.shared.log("State", "replayFinalState took \(deltaTime)s")
@ -493,6 +496,7 @@ public final class AccountStateManager {
operationTimer.start() operationTimer.start()
case let .processUpdateGroups(groups): case let .processUpdateGroups(groups):
self.operationTimer?.invalidate() self.operationTimer?.invalidate()
let accountManager = self.accountManager
let postbox = self.postbox let postbox = self.postbox
let network = self.network let network = self.network
let auxiliaryMethods = self.auxiliaryMethods let auxiliaryMethods = self.auxiliaryMethods
@ -511,7 +515,7 @@ public final class AccountStateManager {
return postbox.transaction { transaction -> AccountReplayedFinalState? in return postbox.transaction { transaction -> AccountReplayedFinalState? in
let startTime = CFAbsoluteTimeGetCurrent() let startTime = CFAbsoluteTimeGetCurrent()
let result = replayFinalState(accountPeerId: accountPeerId, mediaBox: mediaBox, transaction: transaction, auxiliaryMethods: auxiliaryMethods, finalState: finalState) let result = replayFinalState(accountManager: accountManager, postbox: postbox, accountPeerId: accountPeerId, mediaBox: mediaBox, transaction: transaction, auxiliaryMethods: auxiliaryMethods, finalState: finalState)
let deltaTime = CFAbsoluteTimeGetCurrent() - startTime let deltaTime = CFAbsoluteTimeGetCurrent() - startTime
if deltaTime > 1.0 { if deltaTime > 1.0 {
Logger.shared.log("State", "replayFinalState took \(deltaTime)s") Logger.shared.log("State", "replayFinalState took \(deltaTime)s")
@ -688,11 +692,13 @@ public final class AccountStateManager {
} }
let accountPeerId = self.accountPeerId let accountPeerId = self.accountPeerId
let accountManager = self.accountManager
let postbox = self.postbox
let mediaBox = self.postbox.mediaBox let mediaBox = self.postbox.mediaBox
let auxiliaryMethods = self.auxiliaryMethods let auxiliaryMethods = self.auxiliaryMethods
let signal = self.postbox.transaction { transaction -> AccountReplayedFinalState? in let signal = self.postbox.transaction { transaction -> AccountReplayedFinalState? in
let startTime = CFAbsoluteTimeGetCurrent() let startTime = CFAbsoluteTimeGetCurrent()
let result = replayFinalState(accountPeerId: accountPeerId, mediaBox: mediaBox, transaction: transaction, auxiliaryMethods: auxiliaryMethods, finalState: finalState) let result = replayFinalState(accountManager: accountManager, postbox: postbox, accountPeerId: accountPeerId, mediaBox: mediaBox, transaction: transaction, auxiliaryMethods: auxiliaryMethods, finalState: finalState)
let deltaTime = CFAbsoluteTimeGetCurrent() - startTime let deltaTime = CFAbsoluteTimeGetCurrent() - startTime
if deltaTime > 1.0 { if deltaTime > 1.0 {
Logger.shared.log("State", "replayFinalState took \(deltaTime)s") Logger.shared.log("State", "replayFinalState took \(deltaTime)s")

View File

@ -26,7 +26,7 @@ private func switchToAuthorizedAccount(transaction: AccountManagerModifier, acco
transaction.removeAuth() transaction.removeAuth()
} }
public func sendAuthorizationCode(account: UnauthorizedAccount, phoneNumber: String, apiId: Int32, apiHash: String) -> Signal<UnauthorizedAccount, AuthorizationCodeRequestError> { public func sendAuthorizationCode(accountManager: AccountManager, account: UnauthorizedAccount, phoneNumber: String, apiId: Int32, apiHash: String) -> Signal<UnauthorizedAccount, AuthorizationCodeRequestError> {
let sendCode = Api.functions.auth.sendCode(flags: 0, phoneNumber: phoneNumber, currentNumber: nil, apiId: apiId, apiHash: apiHash) let sendCode = Api.functions.auth.sendCode(flags: 0, phoneNumber: phoneNumber, currentNumber: nil, apiId: apiId, apiHash: apiHash)
let codeAndAccount = account.network.request(sendCode, automaticFloodWait: false) let codeAndAccount = account.network.request(sendCode, automaticFloodWait: false)
@ -38,7 +38,7 @@ public func sendAuthorizationCode(account: UnauthorizedAccount, phoneNumber: Str
case Regex("(PHONE_|USER_|NETWORK_)MIGRATE_(\\d+)"): case Regex("(PHONE_|USER_|NETWORK_)MIGRATE_(\\d+)"):
let range = error.errorDescription.range(of: "MIGRATE_")! let range = error.errorDescription.range(of: "MIGRATE_")!
let updatedMasterDatacenterId = Int32(error.errorDescription[range.upperBound ..< error.errorDescription.endIndex])! let updatedMasterDatacenterId = Int32(error.errorDescription[range.upperBound ..< error.errorDescription.endIndex])!
let updatedAccount = account.changedMasterDatacenterId(updatedMasterDatacenterId) let updatedAccount = account.changedMasterDatacenterId(accountManager: accountManager, masterDatacenterId: updatedMasterDatacenterId)
return updatedAccount return updatedAccount
|> mapToSignalPromotingError { updatedAccount -> Signal<(Api.auth.SentCode, UnauthorizedAccount), MTRpcError> in |> mapToSignalPromotingError { updatedAccount -> Signal<(Api.auth.SentCode, UnauthorizedAccount), MTRpcError> in
return updatedAccount.network.request(sendCode, automaticFloodWait: false) return updatedAccount.network.request(sendCode, automaticFloodWait: false)

View File

@ -43,9 +43,9 @@ public struct CacheStorageSettings: PreferencesEntry, Equatable {
} }
} }
public func updateCacheStorageSettingsInteractively(postbox: Postbox, _ f: @escaping (CacheStorageSettings) -> CacheStorageSettings) -> Signal<Void, NoError> { public func updateCacheStorageSettingsInteractively(accountManager: AccountManager, _ f: @escaping (CacheStorageSettings) -> CacheStorageSettings) -> Signal<Void, NoError> {
return postbox.transaction { transaction -> Void in return accountManager.transaction { transaction -> Void in
transaction.updatePreferencesEntry(key: PreferencesKeys.cacheStorageSettings, { entry in transaction.updateSharedData(SharedDataKeys.cacheStorageSettings, { entry in
let currentSettings: CacheStorageSettings let currentSettings: CacheStorageSettings
if let entry = entry as? CacheStorageSettings { if let entry = entry as? CacheStorageSettings {
currentSettings = entry currentSettings = entry

View File

@ -118,7 +118,7 @@ public enum DownloadAndApplyLocalizationError {
case generic case generic
} }
public func downloadAndApplyLocalization(postbox: Postbox, network: Network, languageCode: String) -> Signal<Void, DownloadAndApplyLocalizationError> { public func downloadAndApplyLocalization(accountManager: AccountManager, postbox: Postbox, network: Network, languageCode: String) -> Signal<Void, DownloadAndApplyLocalizationError> {
return requestLocalizationPreview(network: network, identifier: languageCode) return requestLocalizationPreview(network: network, identifier: languageCode)
|> mapError { _ -> DownloadAndApplyLocalizationError in |> mapError { _ -> DownloadAndApplyLocalizationError in
return .generic return .generic
@ -141,11 +141,12 @@ public func downloadAndApplyLocalization(postbox: Postbox, network: Network, lan
if let secondaryCode = preview.baseLanguageCode, components.count > 1 { if let secondaryCode = preview.baseLanguageCode, components.count > 1 {
secondaryComponent = LocalizationComponent(languageCode: secondaryCode, localizedName: "", localization: components[1], customPluralizationCode: nil) secondaryComponent = LocalizationComponent(languageCode: secondaryCode, localizedName: "", localization: components[1], customPluralizationCode: nil)
} }
return postbox.transaction { transaction -> Signal<Void, DownloadAndApplyLocalizationError> in return accountManager.transaction { transaction -> Signal<Void, DownloadAndApplyLocalizationError> in
transaction.updatePreferencesEntry(key: PreferencesKeys.localizationSettings, { _ in transaction.updateSharedData(SharedDataKeys.localizationSettings, { _ in
return LocalizationSettings(primaryComponent: LocalizationComponent(languageCode: preview.languageCode, localizedName: preview.localizedTitle, localization: primaryLocalization, customPluralizationCode: preview.customPluralizationCode), secondaryComponent: secondaryComponent) return LocalizationSettings(primaryComponent: LocalizationComponent(languageCode: preview.languageCode, localizedName: preview.localizedTitle, localization: primaryLocalization, customPluralizationCode: preview.customPluralizationCode), secondaryComponent: secondaryComponent)
}) })
return postbox.transaction { transaction -> Signal<Void, DownloadAndApplyLocalizationError> in
updateLocalizationListStateInteractively(transaction: transaction, { state in updateLocalizationListStateInteractively(transaction: transaction, { state in
var state = state var state = state
for i in 0 ..< state.availableSavedLocalizations.count { for i in 0 ..< state.availableSavedLocalizations.count {
@ -174,5 +175,8 @@ public func downloadAndApplyLocalization(postbox: Postbox, network: Network, lan
|> introduceError(DownloadAndApplyLocalizationError.self) |> introduceError(DownloadAndApplyLocalizationError.self)
|> switchToLatest |> switchToLatest
} }
|> introduceError(DownloadAndApplyLocalizationError.self)
|> switchToLatest
}
} }
} }

View File

@ -9,7 +9,7 @@ import Foundation
import MtProtoKitDynamic import MtProtoKitDynamic
#endif #endif
public final class LoggingSettings: AccountSharedData, Equatable { public final class LoggingSettings: PreferencesEntry, Equatable {
public let logToFile: Bool public let logToFile: Bool
public let logToConsole: Bool public let logToConsole: Bool
public let redactSensitiveData: Bool public let redactSensitiveData: Bool
@ -63,7 +63,7 @@ public final class LoggingSettings: AccountSharedData, Equatable {
return true return true
} }
public func isEqual(to: AccountSharedData) -> Bool { public func isEqual(to: PreferencesEntry) -> Bool {
guard let to = to as? LoggingSettings else { guard let to = to as? LoggingSettings else {
return false return false
} }

View File

@ -9,10 +9,10 @@ import Foundation
import MtProtoKitDynamic import MtProtoKitDynamic
#endif #endif
func managedConfigurationUpdates(postbox: Postbox, network: Network) -> Signal<Void, NoError> { func managedConfigurationUpdates(accountManager: AccountManager, postbox: Postbox, network: Network) -> Signal<Void, NoError> {
let poll = Signal<Void, NoError> { subscriber in let poll = Signal<Void, NoError> { subscriber in
return (network.request(Api.functions.help.getConfig()) |> retryRequest |> mapToSignal { result -> Signal<Void, NoError> in return (network.request(Api.functions.help.getConfig()) |> retryRequest |> mapToSignal { result -> Signal<Void, NoError> in
return postbox.transaction { transaction -> Void in return postbox.transaction { transaction -> Signal<Void, NoError> in
switch result { switch result {
case let .config(config): case let .config(config):
var addressList: [Int: [MTDatacenterAddress]] = [:] var addressList: [Int: [MTDatacenterAddress]] = [:]
@ -64,6 +64,7 @@ func managedConfigurationUpdates(postbox: Postbox, network: Network) -> Signal<V
updateSearchBotsConfiguration(transaction: transaction, configuration: SearchBotsConfiguration(imageBotUsername: config.imgSearchUsername, gifBotUsername: config.gifSearchUsername, venueBotUsername: config.venueSearchUsername)) updateSearchBotsConfiguration(transaction: transaction, configuration: SearchBotsConfiguration(imageBotUsername: config.imgSearchUsername, gifBotUsername: config.gifSearchUsername, venueBotUsername: config.venueSearchUsername))
return accountManager.transaction { transaction -> Signal<Void, NoError> in
let (primary, secondary) = getLocalization(transaction) let (primary, secondary) = getLocalization(transaction)
var invalidateLocalization = false var invalidateLocalization = false
if primary.version != config.langPackVersion { if primary.version != config.langPackVersion {
@ -75,10 +76,17 @@ func managedConfigurationUpdates(postbox: Postbox, network: Network) -> Signal<V
} }
} }
if invalidateLocalization { if invalidateLocalization {
return postbox.transaction { transaction -> Void in
addSynchronizeLocalizationUpdatesOperation(transaction: transaction) addSynchronizeLocalizationUpdatesOperation(transaction: transaction)
} }
} else {
return .complete()
} }
} }
|> switchToLatest
}
}
|> switchToLatest
}).start() }).start()
} }

View File

@ -69,7 +69,7 @@ private func withTakenOperation(postbox: Postbox, peerId: PeerId, tag: PeerOpera
} |> switchToLatest } |> switchToLatest
} }
func managedLocalizationUpdatesOperations(postbox: Postbox, network: Network) -> Signal<Void, NoError> { func managedLocalizationUpdatesOperations(accountManager: AccountManager, postbox: Postbox, network: Network) -> Signal<Void, NoError> {
return Signal { _ in return Signal { _ in
let tag: PeerOperationLogTag = OperationLogTags.SynchronizeLocalizationUpdates let tag: PeerOperationLogTag = OperationLogTags.SynchronizeLocalizationUpdates
@ -88,7 +88,7 @@ func managedLocalizationUpdatesOperations(postbox: Postbox, network: Network) ->
let signal = withTakenOperation(postbox: postbox, peerId: entry.peerId, tag: tag, tagLocalIndex: entry.tagLocalIndex, { transaction, entry -> Signal<Void, NoError> in let signal = withTakenOperation(postbox: postbox, peerId: entry.peerId, tag: tag, tagLocalIndex: entry.tagLocalIndex, { transaction, entry -> Signal<Void, NoError> in
if let entry = entry { if let entry = entry {
if let _ = entry.contents as? SynchronizeLocalizationUpdatesOperation { if let _ = entry.contents as? SynchronizeLocalizationUpdatesOperation {
return synchronizeLocalizationUpdates(transaction: transaction, postbox: postbox, network: network) return synchronizeLocalizationUpdates(accountManager: accountManager, postbox: postbox, network: network)
} else { } else {
assertionFailure() assertionFailure()
} }
@ -120,9 +120,9 @@ private enum SynchronizeLocalizationUpdatesError {
case reset case reset
} }
func getLocalization(_ transaction: Transaction) -> (primary: (code: String, version: Int32, entries: [LocalizationEntry]), secondary: (code: String, version: Int32, entries: [LocalizationEntry])?) { func getLocalization(_ transaction: AccountManagerModifier) -> (primary: (code: String, version: Int32, entries: [LocalizationEntry]), secondary: (code: String, version: Int32, entries: [LocalizationEntry])?) {
let localizationSettings: LocalizationSettings? let localizationSettings: LocalizationSettings?
if let current = transaction.getPreferencesEntry(key: PreferencesKeys.localizationSettings) as? LocalizationSettings { if let current = transaction.getSharedData(SharedDataKeys.localizationSettings) as? LocalizationSettings {
localizationSettings = current localizationSettings = current
} else { } else {
localizationSettings = nil localizationSettings = nil
@ -152,8 +152,8 @@ private func parseLangPackDifference(_ difference: Api.LangPackDifference) -> (c
} }
} }
private func synchronizeLocalizationUpdates(transaction: Transaction, postbox: Postbox, network: Network) -> Signal<Void, NoError> { private func synchronizeLocalizationUpdates(accountManager: AccountManager, postbox: Postbox, network: Network) -> Signal<Void, NoError> {
let currentLanguageAndVersion = postbox.transaction { transaction -> (primary: (code: String, version: Int32), secondary: (code: String, version: Int32)?) in let currentLanguageAndVersion = accountManager.transaction { transaction -> (primary: (code: String, version: Int32), secondary: (code: String, version: Int32)?) in
let (primary, secondary) = getLocalization(transaction) let (primary, secondary) = getLocalization(transaction)
return ((primary.code, primary.version), secondary.flatMap({ ($0.code, $0.version) })) return ((primary.code, primary.version), secondary.flatMap({ ($0.code, $0.version) }))
} }
@ -171,10 +171,10 @@ private func synchronizeLocalizationUpdates(transaction: Transaction, postbox: P
|> mapError { _ -> SynchronizeLocalizationUpdatesError in return .reset } |> mapError { _ -> SynchronizeLocalizationUpdatesError in return .reset }
|> mapToSignal { differences -> Signal<Void, SynchronizeLocalizationUpdatesError> in |> mapToSignal { differences -> Signal<Void, SynchronizeLocalizationUpdatesError> in
let parsedDifferences = differences.map(parseLangPackDifference) let parsedDifferences = differences.map(parseLangPackDifference)
return postbox.transaction { transaction -> Signal<Void, SynchronizeLocalizationUpdatesError> in return accountManager.transaction { transaction -> Signal<Void, SynchronizeLocalizationUpdatesError> in
let (primary, secondary) = getLocalization(transaction) let (primary, secondary) = getLocalization(transaction)
var currentSettings = transaction.getPreferencesEntry(key: PreferencesKeys.localizationSettings) as? LocalizationSettings ?? LocalizationSettings(primaryComponent: LocalizationComponent(languageCode: "en", localizedName: "English", localization: Localization(version: 0, entries: []), customPluralizationCode: nil), secondaryComponent: nil) var currentSettings = transaction.getSharedData(SharedDataKeys.localizationSettings) as? LocalizationSettings ?? LocalizationSettings(primaryComponent: LocalizationComponent(languageCode: "en", localizedName: "English", localization: Localization(version: 0, entries: []), customPluralizationCode: nil), secondaryComponent: nil)
for difference in parsedDifferences { for difference in parsedDifferences {
let current: (isPrimary: Bool, entries: [LocalizationEntry]) let current: (isPrimary: Bool, entries: [LocalizationEntry])
@ -211,7 +211,9 @@ private func synchronizeLocalizationUpdates(transaction: Transaction, postbox: P
} }
} }
transaction.setPreferencesEntry(key: PreferencesKeys.localizationSettings, value: currentSettings) transaction.updateSharedData(SharedDataKeys.localizationSettings, { _ in
return currentSettings
})
return .fail(.done) return .fail(.done)
} }
|> mapError { _ -> SynchronizeLocalizationUpdatesError in |> mapError { _ -> SynchronizeLocalizationUpdatesError in
@ -227,9 +229,9 @@ private func synchronizeLocalizationUpdates(transaction: Transaction, postbox: P
case .done: case .done:
return .fail(Void()) return .fail(Void())
case .reset: case .reset:
return postbox.transaction { transaction -> Signal<Void, Void> in return accountManager.transaction { transaction -> Signal<Void, Void> in
let (primary, _) = getLocalization(transaction) let (primary, _) = getLocalization(transaction)
return downloadAndApplyLocalization(postbox: postbox, network: network, languageCode: primary.code) return downloadAndApplyLocalization(accountManager: accountManager, postbox: postbox, network: network, languageCode: primary.code)
|> mapError { _ -> Void in |> mapError { _ -> Void in
return Void() return Void()
} }
@ -242,7 +244,7 @@ private func synchronizeLocalizationUpdates(transaction: Transaction, postbox: P
} }
} }
func tryApplyingLanguageDifference(transaction: Transaction, langCode: String, difference: Api.LangPackDifference) -> Bool { func tryApplyingLanguageDifference(transaction: AccountManagerModifier, langCode: String, difference: Api.LangPackDifference) -> Bool {
let (primary, secondary) = getLocalization(transaction) let (primary, secondary) = getLocalization(transaction)
switch difference { switch difference {
case let .langPackDifference(updatedCode, fromVersion, updatedVersion, strings): case let .langPackDifference(updatedCode, fromVersion, updatedVersion, strings):
@ -284,7 +286,7 @@ func tryApplyingLanguageDifference(transaction: Transaction, langCode: String, d
} }
mergedEntries.append(contentsOf: updatedEntries) mergedEntries.append(contentsOf: updatedEntries)
let currentSettings = transaction.getPreferencesEntry(key: PreferencesKeys.localizationSettings) as? LocalizationSettings ?? LocalizationSettings(primaryComponent: LocalizationComponent(languageCode: "en", localizedName: "English", localization: Localization(version: 0, entries: []), customPluralizationCode: nil), secondaryComponent: nil) let currentSettings = transaction.getSharedData(SharedDataKeys.localizationSettings) as? LocalizationSettings ?? LocalizationSettings(primaryComponent: LocalizationComponent(languageCode: "en", localizedName: "English", localization: Localization(version: 0, entries: []), customPluralizationCode: nil), secondaryComponent: nil)
var updatedSettings: LocalizationSettings var updatedSettings: LocalizationSettings
if isPrimary { if isPrimary {
@ -296,7 +298,9 @@ func tryApplyingLanguageDifference(transaction: Transaction, langCode: String, d
return false return false
} }
transaction.setPreferencesEntry(key: PreferencesKeys.localizationSettings, value: updatedSettings) transaction.updateSharedData(SharedDataKeys.localizationSettings, { _ in
return updatedSettings
})
return true return true
} }

View File

@ -140,11 +140,8 @@ public extension PeerSummaryCounterTags {
private enum PreferencesKeyValues: Int32 { private enum PreferencesKeyValues: Int32 {
case globalNotifications = 0 case globalNotifications = 0
case cacheStorageSettings = 1
case localizationSettings = 2
case suggestedLocalization = 3 case suggestedLocalization = 3
case limitsConfiguration = 4 case limitsConfiguration = 4
case proxySettings = 5
case coreSettings = 7 case coreSettings = 7
case contentPrivacySettings = 8 case contentPrivacySettings = 8
case networkSettings = 9 case networkSettings = 9
@ -175,18 +172,6 @@ public struct PreferencesKeys {
return key return key
}() }()
public static let cacheStorageSettings: ValueBoxKey = {
let key = ValueBoxKey(length: 4)
key.setInt32(0, value: PreferencesKeyValues.cacheStorageSettings.rawValue)
return key
}()
public static let localizationSettings: ValueBoxKey = {
let key = ValueBoxKey(length: 4)
key.setInt32(0, value: PreferencesKeyValues.localizationSettings.rawValue)
return key
}()
public static let suggestedLocalization: ValueBoxKey = { public static let suggestedLocalization: ValueBoxKey = {
let key = ValueBoxKey(length: 4) let key = ValueBoxKey(length: 4)
key.setInt32(0, value: PreferencesKeyValues.suggestedLocalization.rawValue) key.setInt32(0, value: PreferencesKeyValues.suggestedLocalization.rawValue)
@ -199,12 +184,6 @@ public struct PreferencesKeys {
return key return key
}() }()
public static let proxySettings: ValueBoxKey = {
let key = ValueBoxKey(length: 4)
key.setInt32(0, value: PreferencesKeyValues.proxySettings.rawValue)
return key
}()
public static let coreSettings: ValueBoxKey = { public static let coreSettings: ValueBoxKey = {
let key = ValueBoxKey(length: 4) let key = ValueBoxKey(length: 4)
key.setInt32(0, value: PreferencesKeyValues.coreSettings.rawValue) key.setInt32(0, value: PreferencesKeyValues.coreSettings.rawValue)
@ -263,6 +242,9 @@ public struct PreferencesKeys {
private enum SharedDataKeyValues: Int32 { private enum SharedDataKeyValues: Int32 {
case loggingSettings = 0 case loggingSettings = 0
case accountInitializationSettings = 1 case accountInitializationSettings = 1
case cacheStorageSettings = 2
case localizationSettings = 3
case proxySettings = 4
} }
public struct SharedDataKeys { public struct SharedDataKeys {
@ -277,6 +259,24 @@ public struct SharedDataKeys {
key.setInt32(0, value: SharedDataKeyValues.accountInitializationSettings.rawValue) key.setInt32(0, value: SharedDataKeyValues.accountInitializationSettings.rawValue)
return key return key
}() }()
public static let cacheStorageSettings: ValueBoxKey = {
let key = ValueBoxKey(length: 4)
key.setInt32(0, value: SharedDataKeyValues.cacheStorageSettings.rawValue)
return key
}()
public static let localizationSettings: ValueBoxKey = {
let key = ValueBoxKey(length: 4)
key.setInt32(0, value: SharedDataKeyValues.localizationSettings.rawValue)
return key
}()
public static let proxySettings: ValueBoxKey = {
let key = ValueBoxKey(length: 4)
key.setInt32(0, value: SharedDataKeyValues.proxySettings.rawValue)
return key
}()
} }
public func applicationSpecificItemCacheCollectionId(_ value: Int8) -> Int8 { public func applicationSpecificItemCacheCollectionId(_ value: Int8) -> Int8 {

View File

@ -159,9 +159,9 @@ public struct ProxySettings: PreferencesEntry, Equatable {
} }
} }
public func updateProxySettingsInteractively(postbox: Postbox, network: Network, _ f: @escaping (ProxySettings) -> ProxySettings) -> Signal<Void, NoError> { public func updateProxySettingsInteractively(accountManager: AccountManager, _ f: @escaping (ProxySettings) -> ProxySettings) -> Signal<Void, NoError> {
return postbox.transaction { transaction -> Void in return accountManager.transaction { transaction -> Void in
updateProxySettingsInteractively(transaction: transaction, network: network, f) updateProxySettingsInteractively(transaction: transaction, f)
} }
} }
@ -176,25 +176,10 @@ extension ProxyServerSettings {
} }
} }
public func updateProxySettingsInteractively(transaction: Transaction, network: Network, _ f: @escaping (ProxySettings) -> ProxySettings) { public func updateProxySettingsInteractively(transaction: AccountManagerModifier, _ f: @escaping (ProxySettings) -> ProxySettings) {
var updateNetwork = false transaction.updateSharedData(SharedDataKeys.proxySettings, { current in
var updatedSettings: ProxySettings?
transaction.updatePreferencesEntry(key: PreferencesKeys.proxySettings, { current in
let previous = (current as? ProxySettings) ?? ProxySettings.defaultSettings let previous = (current as? ProxySettings) ?? ProxySettings.defaultSettings
let updated = f(previous) let updated = f(previous)
updatedSettings = updated
if updated.effectiveActiveServer != previous.effectiveActiveServer {
updateNetwork = true
}
return updated return updated
}) })
if updateNetwork, let updatedSettings = updatedSettings {
network.context.updateApiEnvironment { current in
return current?.withUpdatedSocksProxySettings(updatedSettings.effectiveActiveServer.flatMap { activeServer -> MTSocksProxySettings? in
return activeServer.mtProxySettings
})
}
network.dropConnectionStatus()
}
} }