Conflicts:
	TelegramCore/Account.swift
This commit is contained in:
overtake 2016-12-22 13:20:48 +03:00
commit b95fac4112
7 changed files with 91 additions and 29 deletions

View File

@ -172,6 +172,7 @@ public func generateAccountId() -> AccountId {
public class UnauthorizedAccount {
public let id: AccountId
public let basePath: String
public let postbox: Postbox
public let network: Network
@ -179,8 +180,9 @@ public class UnauthorizedAccount {
return Int32(self.network.mtProto.datacenterId)
}
init(id: AccountId, postbox: Postbox, network: Network) {
init(id: AccountId, basePath: String, postbox: Postbox, network: Network) {
self.id = id
self.basePath = basePath
self.postbox = postbox
self.network = network
}
@ -198,9 +200,9 @@ public class UnauthorizedAccount {
postbox.removeKeychainEntryForKey(key)
})
return initializedNetwork(datacenterId: Int(masterDatacenterId), keychain: keychain)
return initializedNetwork(datacenterId: Int(masterDatacenterId), keychain: keychain, networkUsageInfoPath: accountNetworkUsageInfoPath(basePath: self.basePath))
|> map { network in
return UnauthorizedAccount(id: self.id, postbox: self.postbox, network: network)
return UnauthorizedAccount(id: self.id, basePath: self.basePath, postbox: self.postbox, network: network)
}
}
}
@ -249,8 +251,12 @@ private var declaredEncodables: Void = {
return
}()
func accountNetworkUsageInfoPath(basePath: String) -> String {
return basePath + "/network-usage"
}
public func accountWithId(_ id: AccountId, appGroupPath: String) -> Signal<Either<UnauthorizedAccount, Account>, NoError> {
return Signal<(Postbox, AccountState?), NoError> { subscriber in
return Signal<(String, Postbox, AccountState?), NoError> { subscriber in
let _ = declaredEncodables
let path = "\(appGroupPath)/account\(id.stringValue)"
@ -259,12 +265,12 @@ public func accountWithId(_ id: AccountId, appGroupPath: String) -> Signal<Eithe
let postbox = Postbox(basePath: path + "/postbox", globalMessageIdsNamespace: Namespaces.Message.Cloud, seedConfiguration: seedConfiguration)
return (postbox.state() |> take(1) |> map { accountState in
return (postbox, accountState as? AccountState)
}).start(next: { pair in
subscriber.putNext(pair)
return (path, postbox, accountState as? AccountState)
}).start(next: { args in
subscriber.putNext(args)
subscriber.putCompletion()
})
} |> mapToSignal { (postbox, accountState) -> Signal<Either<UnauthorizedAccount, Account>, NoError> in
} |> mapToSignal { (basePath, postbox, accountState) -> Signal<Either<UnauthorizedAccount, Account>, NoError> in
let keychain = Keychain(get: { key in
return postbox.keychainEntryForKey(key)
}, set: { (key, data) in
@ -276,23 +282,23 @@ public func accountWithId(_ id: AccountId, appGroupPath: String) -> Signal<Eithe
if let accountState = accountState {
switch accountState {
case let unauthorizedState as UnauthorizedAccountState:
return initializedNetwork(datacenterId: Int(unauthorizedState.masterDatacenterId), keychain: keychain)
return initializedNetwork(datacenterId: Int(unauthorizedState.masterDatacenterId), keychain: keychain, networkUsageInfoPath: accountNetworkUsageInfoPath(basePath: basePath))
|> map { network -> Either<UnauthorizedAccount, Account> in
.left(value: UnauthorizedAccount(id: id, postbox: postbox, network: network))
.left(value: UnauthorizedAccount(id: id, basePath: basePath, postbox: postbox, network: network))
}
case let authorizedState as AuthorizedAccountState:
return initializedNetwork(datacenterId: Int(authorizedState.masterDatacenterId), keychain: keychain)
return initializedNetwork(datacenterId: Int(authorizedState.masterDatacenterId), keychain: keychain, networkUsageInfoPath: accountNetworkUsageInfoPath(basePath: basePath))
|> map { network -> Either<UnauthorizedAccount, Account> in
return .right(value: Account(id: id, postbox: postbox, network: network, peerId: authorizedState.peerId))
return .right(value: Account(id: id, basePath: basePath, postbox: postbox, network: network, peerId: authorizedState.peerId))
}
case _:
assertionFailure("Unexpected accountState \(accountState)")
}
}
return initializedNetwork(datacenterId: 2, keychain: keychain)
return initializedNetwork(datacenterId: 2, keychain: keychain, networkUsageInfoPath: accountNetworkUsageInfoPath(basePath: basePath))
|> map { network -> Either<UnauthorizedAccount, Account> in
return .left(value: UnauthorizedAccount(id: id, postbox: postbox, network: network))
return .left(value: UnauthorizedAccount(id: id, basePath: basePath, postbox: postbox, network: network))
}
}
}
@ -349,6 +355,7 @@ public enum AccountServiceTaskMasterMode {
public class Account {
public let id: AccountId
public let basePath: String
public let postbox: Postbox
public let network: Network
public let peerId: PeerId
@ -377,10 +384,9 @@ public class Account {
public let shouldBeServiceTaskMaster = Promise<AccountServiceTaskMasterMode>()
public let shouldKeepOnlinePresence = Promise<Bool>()
public var typing:TMProcessable!
public init(id: AccountId, postbox: Postbox, network: Network, peerId: PeerId) {
public init(id: AccountId, basePath: String, postbox: Postbox, network: Network, peerId: PeerId) {
self.id = id
self.basePath = basePath
self.postbox = postbox
self.network = network
self.peerId = peerId
@ -494,8 +500,6 @@ public class Account {
}
}
self.updatedPresenceDisposable.set(updatedPresence.start())
}
deinit {
@ -505,6 +509,20 @@ public class Account {
self.managedServiceViewsDisposable.dispose()
self.updatedPresenceDisposable.dispose()
}
public func currentNetworkStats() -> Signal<MTNetworkUsageManagerStats, NoError> {
return Signal { subscriber in
let manager = MTNetworkUsageManager(info: MTNetworkUsageCalculationInfo(filePath: accountNetworkUsageInfoPath(basePath: self.basePath)))!
manager.currentStats().start(next: { next in
if let stats = next as? MTNetworkUsageManagerStats {
subscriber.putNext(stats)
}
subscriber.putCompletion()
}, error: nil, completed: nil)
return EmptyDisposable
}
}
}
public func setupAccount(_ account: Account, fetchCachedResourceRepresentation: ((_ account: Account, _ resource: MediaResource, _ resourceData: MediaResourceData, _ representation: CachedMediaResourceRepresentation) -> Signal<CachedMediaResourceRepresentationResult, NoError>)? = nil) {

View File

@ -263,7 +263,7 @@ public final class AccountViewTracker {
public func aroundUnreadMessageHistoryViewForPeerId(_ peerId: PeerId, count: Int, tagMask: MessageTags? = nil) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
if let account = self.account {
let signal = account.postbox.aroundUnreadMessageHistoryViewForPeerId(peerId, count: count, tagMask: tagMask)
let signal = account.postbox.aroundUnreadMessageHistoryViewForPeerId(peerId, count: count, topTaggedMessageIdNamespaces: [Namespaces.Message.Cloud], tagMask: tagMask)
return wrappedMessageHistorySignal(signal)
} else {
return .never()
@ -272,7 +272,7 @@ public final class AccountViewTracker {
public func aroundIdMessageHistoryViewForPeerId(_ peerId: PeerId, count: Int, messageId: MessageId, tagMask: MessageTags? = nil) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
if let account = self.account {
let signal = account.postbox.aroundIdMessageHistoryViewForPeerId(peerId, count: count, messageId: messageId, tagMask: tagMask)
let signal = account.postbox.aroundIdMessageHistoryViewForPeerId(peerId, count: count, messageId: messageId, topTaggedMessageIdNamespaces: [Namespaces.Message.Cloud], tagMask: tagMask)
return wrappedMessageHistorySignal(signal)
} else {
return .never()
@ -281,7 +281,7 @@ public final class AccountViewTracker {
public func aroundMessageHistoryViewForPeerId(_ peerId: PeerId, index: MessageIndex, count: Int, anchorIndex: MessageIndex, fixedCombinedReadState: CombinedPeerReadState?, tagMask: MessageTags? = nil) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
if let account = self.account {
let signal = account.postbox.aroundMessageHistoryViewForPeerId(peerId, index: index, count: count, anchorIndex: anchorIndex, fixedCombinedReadState: fixedCombinedReadState, tagMask: tagMask)
let signal = account.postbox.aroundMessageHistoryViewForPeerId(peerId, index: index, count: count, anchorIndex: anchorIndex, fixedCombinedReadState: fixedCombinedReadState, topTaggedMessageIdNamespaces: [Namespaces.Message.Cloud], tagMask: tagMask)
return wrappedMessageHistorySignal(signal)
} else {
return .never()

View File

@ -19,7 +19,7 @@ class Download {
self.datacenterId = datacenterId
self.context = context
self.mtProto = MTProto(context: self.context, datacenterId: datacenterId)
self.mtProto = MTProto(context: self.context, datacenterId: datacenterId, usageCalculationInfo: nil)
if datacenterId != masterDatacenterId {
self.mtProto.authTokenMasterDatacenterId = masterDatacenterId
self.mtProto.requiredAuthToken = Int(datacenterId) as NSNumber

View File

@ -16,3 +16,37 @@ public extension Message {
}
}
}
public extension Message {
var visibleButtonKeyboardMarkup: ReplyMarkupMessageAttribute? {
for attribute in self.attributes {
if let attribute = attribute as? ReplyMarkupMessageAttribute {
if !attribute.flags.contains(.inline) && !attribute.rows.isEmpty {
if attribute.flags.contains(.personal) {
if !self.flags.contains(.Personal) {
return nil
}
}
return attribute
}
}
}
return nil
}
var requestsSetupReply: Bool {
for attribute in self.attributes {
if let attribute = attribute as? ReplyMarkupMessageAttribute {
if !attribute.flags.contains(.inline) {
if attribute.flags.contains(.personal) {
if !self.flags.contains(.Personal) {
return false
}
}
return attribute.flags.contains(.setupReply)
}
}
}
return false
}
}

View File

@ -94,7 +94,7 @@ private var registeredLoggingFunctions: Void = {
registerLoggingFunctions()
}()
func initializedNetwork(datacenterId: Int, keychain: Keychain) -> Signal<Network, NoError> {
func initializedNetwork(datacenterId: Int, keychain: Keychain, networkUsageInfoPath: String?) -> Signal<Network, NoError> {
return Signal { subscriber in
Queue.concurrentDefaultQueue().async {
let _ = registeredLoggingFunctions
@ -126,7 +126,7 @@ func initializedNetwork(datacenterId: Int, keychain: Keychain) -> Signal<Network
}
context.keychain = keychain
let mtProto = MTProto(context: context, datacenterId: datacenterId)!
let mtProto = MTProto(context: context, datacenterId: datacenterId, usageCalculationInfo: networkUsageInfoPath == nil ? nil : MTNetworkUsageCalculationInfo(filePath: networkUsageInfoPath))!
let connectionStatus = Promise<ConnectionStatus>(.WaitingForNetwork)

View File

@ -165,6 +165,7 @@ public struct ReplyMarkupMessageFlags: OptionSet {
public static let personal = ReplyMarkupMessageFlags(rawValue: 1 << 1)
public static let setupReply = ReplyMarkupMessageFlags(rawValue: 1 << 2)
public static let inline = ReplyMarkupMessageFlags(rawValue: 1 << 3)
public static let fit = ReplyMarkupMessageFlags(rawValue: 1 << 4)
}
public class ReplyMarkupMessageAttribute: MessageAttribute, Equatable {
@ -231,6 +232,9 @@ extension ReplyMarkupMessageAttribute {
switch apiMarkup {
case let .replyKeyboardMarkup(markupFlags, apiRows):
rows = apiRows.map { ReplyMarkupRow(apiRow: $0) }
if (markupFlags & (1 << 0)) != 0 {
flags.insert(.fit)
}
if (markupFlags & (1 << 1)) != 0 {
flags.insert(.once)
}
@ -247,6 +251,7 @@ extension ReplyMarkupMessageAttribute {
if (forceReplyFlags & (1 << 2)) != 0 {
flags.insert(.personal)
}
flags.insert(.setupReply)
case let .replyKeyboardHide(hideFlags):
if (hideFlags & (1 << 2)) != 0 {
flags.insert(.personal)

View File

@ -353,16 +353,21 @@ extension StoreMessage {
attributes.append(TextEntitiesMessageAttribute(entities: messageTextEntitiesFromApiEntities(entities)))
}
var storeFlags = StoreMessageFlags()
if let replyMarkup = replyMarkup {
attributes.append(ReplyMarkupMessageAttribute(apiMarkup: replyMarkup))
let parsedReplyMarkup = ReplyMarkupMessageAttribute(apiMarkup: replyMarkup)
attributes.append(parsedReplyMarkup)
if !parsedReplyMarkup.flags.contains(.inline) {
storeFlags.insert(.TopIndexable)
}
}
var storeFlags = StoreMessageFlags()
if (flags & (1 << 1)) == 0 {
let _ = storeFlags.insert(.Incoming)
storeFlags.insert(.Incoming)
}
if (flags & (1 << 4)) != 0 {
let _ = storeFlags.insert(.Personal)
storeFlags.insert(.Personal)
}
self.init(id: MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: id), timestamp: date, flags: storeFlags, tags: tagsForStoreMessage(medias), forwardInfo: forwardInfo, authorId: authorId, text: messageText, attributes: attributes, media: medias)