Update API

This commit is contained in:
Ali 2020-03-18 14:10:27 +04:00
parent da4c5a70e5
commit 5d367726c6
11 changed files with 1292 additions and 1270 deletions

View File

@ -5453,3 +5453,5 @@ Any member of this group will be able to see messages in the channel.";
"ChatListFolder.DiscardCancel" = "No"; "ChatListFolder.DiscardCancel" = "No";
"ChatListFolder.IncludeChatsTitle" = "Include Chats"; "ChatListFolder.IncludeChatsTitle" = "Include Chats";
"ChatListFolder.ExcludeChatsTitle" = "Exclude Chats"; "ChatListFolder.ExcludeChatsTitle" = "Exclude Chats";
"ChatListFolderSettings.AddRecommended" = "ADD";

View File

@ -1462,7 +1462,11 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController,
updatedFilter = nil updatedFilter = nil
} }
} }
strongSelf.chatListDisplayNode.containerNode.switchToFilter(id: updatedFilter.flatMap { .filter($0.id) } ?? .all) if strongSelf.chatListDisplayNode.containerNode.currentItemNode.chatListFilter?.id == updatedFilter?.id {
strongSelf.scrollToTop?()
} else {
strongSelf.chatListDisplayNode.containerNode.switchToFilter(id: updatedFilter.flatMap { .filter($0.id) } ?? .all)
}
}) })
} }

View File

@ -742,7 +742,7 @@ func chatListFilterPresetController(context: AccountContext, currentPreset: Chat
let presentationData = context.sharedContext.currentPresentationData.with { $0 } let presentationData = context.sharedContext.currentPresentationData.with { $0 }
var includePeers = ChatListFilterIncludePeers() var includePeers = ChatListFilterIncludePeers()
includePeers.setPeers(state.additionallyIncludePeers) includePeers.setPeers(state.additionallyIncludePeers)
let filter = ChatListFilter(id: currentPreset?.id ?? -1, title: state.name, data: ChatListFilterData(categories: state.includeCategories, excludeMuted: state.excludeMuted, excludeRead: state.excludeRead, excludeArchived: state.excludeArchived, includePeers: includePeers, excludePeers: state.additionallyExcludePeers)) let filter = ChatListFilter(id: currentPreset?.id ?? -1, title: state.name, emoticon: currentPreset?.emoticon, data: ChatListFilterData(categories: state.includeCategories, excludeMuted: state.excludeMuted, excludeRead: state.excludeRead, excludeArchived: state.excludeArchived, includePeers: includePeers, excludePeers: state.additionallyExcludePeers))
switch chatListFilterType(filter) { switch chatListFilterType(filter) {
case .generic: case .generic:
state.name = initialName state.name = initialName
@ -785,7 +785,7 @@ func chatListFilterPresetController(context: AccountContext, currentPreset: Chat
let state = stateValue.with { $0 } let state = stateValue.with { $0 }
var includePeers = ChatListFilterIncludePeers() var includePeers = ChatListFilterIncludePeers()
includePeers.setPeers(state.additionallyIncludePeers) includePeers.setPeers(state.additionallyIncludePeers)
let filter = ChatListFilter(id: currentPreset?.id ?? -1, title: state.name, data: ChatListFilterData(categories: state.includeCategories, excludeMuted: state.excludeMuted, excludeRead: state.excludeRead, excludeArchived: state.excludeArchived, includePeers: includePeers, excludePeers: state.additionallyExcludePeers)) let filter = ChatListFilter(id: currentPreset?.id ?? -1, title: state.name, emoticon: currentPreset?.emoticon, data: ChatListFilterData(categories: state.includeCategories, excludeMuted: state.excludeMuted, excludeRead: state.excludeRead, excludeArchived: state.excludeArchived, includePeers: includePeers, excludePeers: state.additionallyExcludePeers))
let controller = internalChatListFilterAddChatsController(context: context, filter: filter, applyAutomatically: false, updated: { filter in let controller = internalChatListFilterAddChatsController(context: context, filter: filter, applyAutomatically: false, updated: { filter in
skipStateAnimation = true skipStateAnimation = true
@ -803,7 +803,7 @@ func chatListFilterPresetController(context: AccountContext, currentPreset: Chat
let state = stateValue.with { $0 } let state = stateValue.with { $0 }
var includePeers = ChatListFilterIncludePeers() var includePeers = ChatListFilterIncludePeers()
includePeers.setPeers(state.additionallyIncludePeers) includePeers.setPeers(state.additionallyIncludePeers)
let filter = ChatListFilter(id: currentPreset?.id ?? -1, title: state.name, data: ChatListFilterData(categories: state.includeCategories, excludeMuted: state.excludeMuted, excludeRead: state.excludeRead, excludeArchived: state.excludeArchived, includePeers: includePeers, excludePeers: state.additionallyExcludePeers)) let filter = ChatListFilter(id: currentPreset?.id ?? -1, title: state.name, emoticon: currentPreset?.emoticon, data: ChatListFilterData(categories: state.includeCategories, excludeMuted: state.excludeMuted, excludeRead: state.excludeRead, excludeArchived: state.excludeArchived, includePeers: includePeers, excludePeers: state.additionallyExcludePeers))
let controller = internalChatListFilterExcludeChatsController(context: context, filter: filter, applyAutomatically: false, updated: { filter in let controller = internalChatListFilterExcludeChatsController(context: context, filter: filter, applyAutomatically: false, updated: { filter in
skipStateAnimation = true skipStateAnimation = true
@ -927,7 +927,7 @@ func chatListFilterPresetController(context: AccountContext, currentPreset: Chat
let _ = (updateChatListFiltersInteractively(postbox: context.account.postbox, { filters in let _ = (updateChatListFiltersInteractively(postbox: context.account.postbox, { filters in
var includePeers = ChatListFilterIncludePeers() var includePeers = ChatListFilterIncludePeers()
includePeers.setPeers(state.additionallyIncludePeers) includePeers.setPeers(state.additionallyIncludePeers)
var updatedFilter = ChatListFilter(id: currentPreset?.id ?? -1, title: state.name, data: ChatListFilterData(categories: state.includeCategories, excludeMuted: state.excludeMuted, excludeRead: state.excludeRead, excludeArchived: state.excludeArchived, includePeers: includePeers, excludePeers: state.additionallyExcludePeers)) var updatedFilter = ChatListFilter(id: currentPreset?.id ?? -1, title: state.name, emoticon: currentPreset?.emoticon, data: ChatListFilterData(categories: state.includeCategories, excludeMuted: state.excludeMuted, excludeRead: state.excludeRead, excludeArchived: state.excludeArchived, includePeers: includePeers, excludePeers: state.additionallyExcludePeers))
if currentPreset == nil { if currentPreset == nil {
updatedFilter.id = max(2, filters.map({ $0.id + 1 }).max() ?? 2) updatedFilter.id = max(2, filters.map({ $0.id + 1 }).max() ?? 2)
} }
@ -1030,7 +1030,7 @@ func chatListFilterPresetController(context: AccountContext, currentPreset: Chat
var includePeers = ChatListFilterIncludePeers() var includePeers = ChatListFilterIncludePeers()
includePeers.setPeers(state.additionallyIncludePeers) includePeers.setPeers(state.additionallyIncludePeers)
let filter = ChatListFilter(id: currentPreset.id, title: state.name, data: ChatListFilterData(categories: state.includeCategories, excludeMuted: state.excludeMuted, excludeRead: state.excludeRead, excludeArchived: state.excludeArchived, includePeers: includePeers, excludePeers: state.additionallyExcludePeers)) let filter = ChatListFilter(id: currentPreset.id, title: state.name, emoticon: currentPreset.emoticon, data: ChatListFilterData(categories: state.includeCategories, excludeMuted: state.excludeMuted, excludeRead: state.excludeRead, excludeArchived: state.excludeArchived, includePeers: includePeers, excludePeers: state.additionallyExcludePeers))
if currentPresetWithoutPinnerPeers != filter { if currentPresetWithoutPinnerPeers != filter {
displaySaveAlert() displaySaveAlert()
return false return false

View File

@ -250,7 +250,7 @@ public func chatListFilterPresetListController(context: AccountContext, mode: Ch
let _ = (updateChatListFiltersInteractively(postbox: context.account.postbox, { filters in let _ = (updateChatListFiltersInteractively(postbox: context.account.postbox, { filters in
var filters = filters var filters = filters
let id = generateNewChatListFilterId(filters: filters) let id = generateNewChatListFilterId(filters: filters)
filters.insert(ChatListFilter(id: id, title: title, data: data), at: 0) filters.insert(ChatListFilter(id: id, title: title, emoticon: nil, data: data), at: 0)
return filters return filters
}) })
|> deliverOnMainQueue).start(next: { _ in |> deliverOnMainQueue).start(next: { _ in

View File

@ -190,7 +190,7 @@ public class ChatListFilterPresetListSuggestedItemNode: ListViewItemNode, ItemLi
let titleFont = Font.regular(item.presentationData.fontSize.itemListBaseFontSize) let titleFont = Font.regular(item.presentationData.fontSize.itemListBaseFontSize)
let (buttonTitleLayout, buttonTitleApply) = makeButtonTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.presentationData.strings.Stickers_Install, font: Font.semibold(14.0), textColor: item.presentationData.theme.list.itemCheckColors.foregroundColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - params.rightInset - 20.0 - leftInset - rightInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let (buttonTitleLayout, buttonTitleApply) = makeButtonTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.presentationData.strings.ChatListFolderSettings_AddRecommended, font: Font.semibold(14.0), textColor: item.presentationData.theme.list.itemCheckColors.foregroundColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - params.rightInset - 20.0 - leftInset - rightInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
let additionalTextRightInset: CGFloat = buttonTitleLayout.size.width + 14.0 * 2.0 let additionalTextRightInset: CGFloat = buttonTitleLayout.size.width + 14.0 * 2.0

View File

@ -605,7 +605,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-1551583367] = { return Api.ReceivedNotifyMessage.parse_receivedNotifyMessage($0) } dict[-1551583367] = { return Api.ReceivedNotifyMessage.parse_receivedNotifyMessage($0) }
dict[-57668565] = { return Api.ChatParticipants.parse_chatParticipantsForbidden($0) } dict[-57668565] = { return Api.ChatParticipants.parse_chatParticipantsForbidden($0) }
dict[1061556205] = { return Api.ChatParticipants.parse_chatParticipants($0) } dict[1061556205] = { return Api.ChatParticipants.parse_chatParticipants($0) }
dict[-878553771] = { return Api.DialogFilter.parse_dialogFilter($0) } dict[1949890536] = { return Api.DialogFilter.parse_dialogFilter($0) }
dict[-1056001329] = { return Api.InputPaymentCredentials.parse_inputPaymentCredentialsSaved($0) } dict[-1056001329] = { return Api.InputPaymentCredentials.parse_inputPaymentCredentialsSaved($0) }
dict[873977640] = { return Api.InputPaymentCredentials.parse_inputPaymentCredentials($0) } dict[873977640] = { return Api.InputPaymentCredentials.parse_inputPaymentCredentials($0) }
dict[178373535] = { return Api.InputPaymentCredentials.parse_inputPaymentCredentialsApplePay($0) } dict[178373535] = { return Api.InputPaymentCredentials.parse_inputPaymentCredentialsApplePay($0) }

View File

@ -17276,17 +17276,18 @@ public extension Api {
} }
public enum DialogFilter: TypeConstructorDescription { public enum DialogFilter: TypeConstructorDescription {
case dialogFilter(flags: Int32, id: Int32, title: String, pinnedPeers: [Api.InputPeer], includePeers: [Api.InputPeer], excludePeers: [Api.InputPeer]) case dialogFilter(flags: Int32, id: Int32, title: String, emoticon: String?, pinnedPeers: [Api.InputPeer], includePeers: [Api.InputPeer], excludePeers: [Api.InputPeer])
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self { switch self {
case .dialogFilter(let flags, let id, let title, let pinnedPeers, let includePeers, let excludePeers): case .dialogFilter(let flags, let id, let title, let emoticon, let pinnedPeers, let includePeers, let excludePeers):
if boxed { if boxed {
buffer.appendInt32(-878553771) buffer.appendInt32(1949890536)
} }
serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(flags, buffer: buffer, boxed: false)
serializeInt32(id, buffer: buffer, boxed: false) serializeInt32(id, buffer: buffer, boxed: false)
serializeString(title, buffer: buffer, boxed: false) serializeString(title, buffer: buffer, boxed: false)
if Int(flags) & Int(1 << 25) != 0 {serializeString(emoticon!, buffer: buffer, boxed: false)}
buffer.appendInt32(481674261) buffer.appendInt32(481674261)
buffer.appendInt32(Int32(pinnedPeers.count)) buffer.appendInt32(Int32(pinnedPeers.count))
for item in pinnedPeers { for item in pinnedPeers {
@ -17308,8 +17309,8 @@ public extension Api {
public func descriptionFields() -> (String, [(String, Any)]) { public func descriptionFields() -> (String, [(String, Any)]) {
switch self { switch self {
case .dialogFilter(let flags, let id, let title, let pinnedPeers, let includePeers, let excludePeers): case .dialogFilter(let flags, let id, let title, let emoticon, let pinnedPeers, let includePeers, let excludePeers):
return ("dialogFilter", [("flags", flags), ("id", id), ("title", title), ("pinnedPeers", pinnedPeers), ("includePeers", includePeers), ("excludePeers", excludePeers)]) return ("dialogFilter", [("flags", flags), ("id", id), ("title", title), ("emoticon", emoticon), ("pinnedPeers", pinnedPeers), ("includePeers", includePeers), ("excludePeers", excludePeers)])
} }
} }
@ -17320,10 +17321,8 @@ public extension Api {
_2 = reader.readInt32() _2 = reader.readInt32()
var _3: String? var _3: String?
_3 = parseString(reader) _3 = parseString(reader)
var _4: [Api.InputPeer]? var _4: String?
if let _ = reader.readInt32() { if Int(_1!) & Int(1 << 25) != 0 {_4 = parseString(reader) }
_4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.InputPeer.self)
}
var _5: [Api.InputPeer]? var _5: [Api.InputPeer]?
if let _ = reader.readInt32() { if let _ = reader.readInt32() {
_5 = Api.parseVector(reader, elementSignature: 0, elementType: Api.InputPeer.self) _5 = Api.parseVector(reader, elementSignature: 0, elementType: Api.InputPeer.self)
@ -17332,14 +17331,19 @@ public extension Api {
if let _ = reader.readInt32() { if let _ = reader.readInt32() {
_6 = Api.parseVector(reader, elementSignature: 0, elementType: Api.InputPeer.self) _6 = Api.parseVector(reader, elementSignature: 0, elementType: Api.InputPeer.self)
} }
var _7: [Api.InputPeer]?
if let _ = reader.readInt32() {
_7 = Api.parseVector(reader, elementSignature: 0, elementType: Api.InputPeer.self)
}
let _c1 = _1 != nil let _c1 = _1 != nil
let _c2 = _2 != nil let _c2 = _2 != nil
let _c3 = _3 != nil let _c3 = _3 != nil
let _c4 = _4 != nil let _c4 = (Int(_1!) & Int(1 << 25) == 0) || _4 != nil
let _c5 = _5 != nil let _c5 = _5 != nil
let _c6 = _6 != nil let _c6 = _6 != nil
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 { let _c7 = _7 != nil
return Api.DialogFilter.dialogFilter(flags: _1!, id: _2!, title: _3!, pinnedPeers: _4!, includePeers: _5!, excludePeers: _6!) if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 {
return Api.DialogFilter.dialogFilter(flags: _1!, id: _2!, title: _3!, emoticon: _4, pinnedPeers: _5!, includePeers: _6!, excludePeers: _7!)
} }
else { else {
return nil return nil

View File

@ -181,21 +181,25 @@ public struct ChatListFilterData: Equatable, Hashable {
public struct ChatListFilter: PostboxCoding, Equatable { public struct ChatListFilter: PostboxCoding, Equatable {
public var id: Int32 public var id: Int32
public var title: String public var title: String
public var emoticon: String?
public var data: ChatListFilterData public var data: ChatListFilterData
public init( public init(
id: Int32, id: Int32,
title: String, title: String,
emoticon: String?,
data: ChatListFilterData data: ChatListFilterData
) { ) {
self.id = id self.id = id
self.title = title self.title = title
self.emoticon = emoticon
self.data = data self.data = data
} }
public init(decoder: PostboxDecoder) { public init(decoder: PostboxDecoder) {
self.id = decoder.decodeInt32ForKey("id", orElse: 0) self.id = decoder.decodeInt32ForKey("id", orElse: 0)
self.title = decoder.decodeStringForKey("title", orElse: "") self.title = decoder.decodeStringForKey("title", orElse: "")
self.emoticon = decoder.decodeOptionalStringForKey("emoticon")
self.data = ChatListFilterData( self.data = ChatListFilterData(
categories: ChatListFilterPeerCategories(rawValue: decoder.decodeInt32ForKey("categories", orElse: 0)), categories: ChatListFilterPeerCategories(rawValue: decoder.decodeInt32ForKey("categories", orElse: 0)),
excludeMuted: decoder.decodeInt32ForKey("excludeMuted", orElse: 0) != 0, excludeMuted: decoder.decodeInt32ForKey("excludeMuted", orElse: 0) != 0,
@ -209,6 +213,11 @@ public struct ChatListFilter: PostboxCoding, Equatable {
public func encode(_ encoder: PostboxEncoder) { public func encode(_ encoder: PostboxEncoder) {
encoder.encodeInt32(self.id, forKey: "id") encoder.encodeInt32(self.id, forKey: "id")
encoder.encodeString(self.title, forKey: "title") encoder.encodeString(self.title, forKey: "title")
if let emoticon = self.emoticon {
encoder.encodeString(emoticon, forKey: "emoticon")
} else {
encoder.encodeNil(forKey: "emoticon")
}
encoder.encodeInt32(self.data.categories.rawValue, forKey: "categories") encoder.encodeInt32(self.data.categories.rawValue, forKey: "categories")
encoder.encodeInt32(self.data.excludeMuted ? 1 : 0, forKey: "excludeMuted") encoder.encodeInt32(self.data.excludeMuted ? 1 : 0, forKey: "excludeMuted")
encoder.encodeInt32(self.data.excludeRead ? 1 : 0, forKey: "excludeRead") encoder.encodeInt32(self.data.excludeRead ? 1 : 0, forKey: "excludeRead")
@ -222,10 +231,11 @@ public struct ChatListFilter: PostboxCoding, Equatable {
extension ChatListFilter { extension ChatListFilter {
init(apiFilter: Api.DialogFilter) { init(apiFilter: Api.DialogFilter) {
switch apiFilter { switch apiFilter {
case let .dialogFilter(flags, id, title, pinnedPeers, includePeers, excludePeers): case let .dialogFilter(flags, id, title, emoticon, pinnedPeers, includePeers, excludePeers):
self.init( self.init(
id: id, id: id,
title: title, title: title,
emoticon: emoticon,
data: ChatListFilterData( data: ChatListFilterData(
categories: ChatListFilterPeerCategories(apiFlags: flags), categories: ChatListFilterPeerCategories(apiFlags: flags),
excludeMuted: (flags & (1 << 11)) != 0, excludeMuted: (flags & (1 << 11)) != 0,
@ -283,7 +293,10 @@ extension ChatListFilter {
flags |= 1 << 13 flags |= 1 << 13
} }
flags |= self.data.categories.apiFlags flags |= self.data.categories.apiFlags
return .dialogFilter(flags: flags, id: self.id, title: self.title, pinnedPeers: self.data.includePeers.pinnedPeers.compactMap { peerId -> Api.InputPeer? in if self.emoticon != nil {
flags |= 1 << 25
}
return .dialogFilter(flags: flags, id: self.id, title: self.title, emoticon: self.emoticon, pinnedPeers: self.data.includePeers.pinnedPeers.compactMap { peerId -> Api.InputPeer? in
return transaction.getPeer(peerId).flatMap(apiInputPeer) return transaction.getPeer(peerId).flatMap(apiInputPeer)
}, includePeers: self.data.includePeers.peers.compactMap { peerId -> Api.InputPeer? in }, includePeers: self.data.includePeers.peers.compactMap { peerId -> Api.InputPeer? in
if self.data.includePeers.pinnedPeers.contains(peerId) { if self.data.includePeers.pinnedPeers.contains(peerId) {
@ -352,7 +365,7 @@ private func requestChatListFilters(postbox: Postbox, network: Network) -> Signa
let filter = ChatListFilter(apiFilter: apiFilter) let filter = ChatListFilter(apiFilter: apiFilter)
filters.append(filter) filters.append(filter)
switch apiFilter { switch apiFilter {
case let .dialogFilter(_, _, _, pinnedPeers, includePeers, excludePeers): case let .dialogFilter(_, _, _, _, pinnedPeers, includePeers, excludePeers):
for peer in pinnedPeers + includePeers + excludePeers { for peer in pinnedPeers + includePeers + excludePeers {
var peerId: PeerId? var peerId: PeerId?
switch peer { switch peer {

View File

@ -5,18 +5,16 @@ import AsyncDisplayKit
final class ChatControllerTitlePanelNodeContainer: ASDisplayNode { final class ChatControllerTitlePanelNodeContainer: ASDisplayNode {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if self.bounds.contains(point) { if self.bounds.contains(point) {
var foundHit = false
if let subnodes = self.subnodes { if let subnodes = self.subnodes {
for subnode in subnodes { for subnode in subnodes {
if subnode.frame.contains(point) { if subnode.frame.contains(point) {
foundHit = true if let result = subnode.view.hitTest(self.view.convert(point, to: subnode.view), with: event) {
break return result
}
} }
} }
} }
if !foundHit { return nil
return nil
}
} }
return super.hitTest(point, with: event) return super.hitTest(point, with: event)
} }