mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 03:20:48 +00:00
Merge commit '1bc6d85f0f221e08bb328c4f2764a031fec879b5'
This commit is contained in:
commit
858f765d1c
@ -562,31 +562,31 @@ private func internalChatListFilterAddChatsController(context: AccountContext, f
|
||||
ChatListNodeAdditionalCategory(
|
||||
id: AdditionalCategoryId.contacts.rawValue,
|
||||
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Contact"), color: .white), cornerRadius: 12.0, color: .blue),
|
||||
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Contact"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .blue),
|
||||
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Contact"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .blue),
|
||||
title: presentationData.strings.ChatListFolder_CategoryContacts
|
||||
),
|
||||
ChatListNodeAdditionalCategory(
|
||||
id: AdditionalCategoryId.nonContacts.rawValue,
|
||||
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/User"), color: .white), cornerRadius: 12.0, color: .yellow),
|
||||
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/User"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .yellow),
|
||||
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/User"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .yellow),
|
||||
title: presentationData.strings.ChatListFolder_CategoryNonContacts
|
||||
),
|
||||
ChatListNodeAdditionalCategory(
|
||||
id: AdditionalCategoryId.groups.rawValue,
|
||||
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Group"), color: .white), cornerRadius: 12.0, color: .green),
|
||||
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Group"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .green),
|
||||
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Group"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .green),
|
||||
title: presentationData.strings.ChatListFolder_CategoryGroups
|
||||
),
|
||||
ChatListNodeAdditionalCategory(
|
||||
id: AdditionalCategoryId.channels.rawValue,
|
||||
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Channel"), color: .white), cornerRadius: 12.0, color: .red),
|
||||
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Channel"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .red),
|
||||
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Channel"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .red),
|
||||
title: presentationData.strings.ChatListFolder_CategoryChannels
|
||||
),
|
||||
ChatListNodeAdditionalCategory(
|
||||
id: AdditionalCategoryId.bots.rawValue,
|
||||
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Bot"), color: .white), cornerRadius: 12.0, color: .violet),
|
||||
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Bot"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .violet),
|
||||
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Bot"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .violet),
|
||||
title: presentationData.strings.ChatListFolder_CategoryBots
|
||||
)
|
||||
]
|
||||
|
@ -444,9 +444,9 @@ class CreatePollOptionItemNode: ItemListRevealOptionsItemNode, ItemListItemNode,
|
||||
}
|
||||
|
||||
let _ = reorderSizeAndApply.1(layout.contentSize.height, displayTextLimit, transition)
|
||||
let reorderControlFrame = CGRect(origin: CGPoint(x: params.width + revealOffset - params.rightInset - reorderSizeAndApply.0, y: 0.0), size: CGSize(width: reorderSizeAndApply.0, height: layout.contentSize.height))
|
||||
strongSelf.reorderControlNode.frame = reorderControlFrame
|
||||
strongSelf.reorderControlNode.isHidden = !item.canMove
|
||||
let reorderControlFrame = CGRect(origin: CGPoint(x: params.width + revealOffset - params.rightInset - reorderSizeAndApply.0 + (!item.canMove ? 44.0 + params.rightInset : 0.0), y: 0.0), size: CGSize(width: reorderSizeAndApply.0, height: layout.contentSize.height))
|
||||
transition.updateFrameAdditive(node: strongSelf.reorderControlNode, frame: reorderControlFrame)
|
||||
strongSelf.reorderControlNode.isUserInteractionEnabled = item.canMove
|
||||
|
||||
let _ = textLimitApply()
|
||||
strongSelf.textLimitNode.frame = CGRect(origin: CGPoint(x: reorderControlFrame.minX + floor((reorderControlFrame.width - textLimitLayout.size.width) / 2.0) - 4.0 - UIScreenPixel, y: max(floor(reorderControlFrame.midY + 2.0), layout.contentSize.height - 15.0 - textLimitLayout.size.height)), size: textLimitLayout.size)
|
||||
|
@ -542,6 +542,9 @@ final class NavigationModalContainer: ASDisplayNode, UIScrollViewDelegate, UIGes
|
||||
} else if listNode.scroller.isDecelerating && listNode.scroller.contentOffset.y < listNode.scroller.contentInset.top {
|
||||
return self.scrollNode.view
|
||||
}
|
||||
} else if let currentParent, currentParent.disablesInteractiveModalDismiss {
|
||||
enableScrolling = false
|
||||
break
|
||||
}
|
||||
currentParent = currentParent?.superview
|
||||
}
|
||||
|
@ -225,8 +225,8 @@ public final class DrawingEntitiesView: UIView, TGPhotoDrawingEntitiesView {
|
||||
}
|
||||
}
|
||||
|
||||
var entitiesData: Data? {
|
||||
let entities = self.entities
|
||||
public static func encodeEntities(_ entities: [DrawingEntity]) -> Data? {
|
||||
let entities = entities
|
||||
guard !entities.isEmpty else {
|
||||
return nil
|
||||
}
|
||||
@ -241,6 +241,10 @@ public final class DrawingEntitiesView: UIView, TGPhotoDrawingEntitiesView {
|
||||
}
|
||||
}
|
||||
|
||||
var entitiesData: Data? {
|
||||
return DrawingEntitiesView.encodeEntities(self.entities)
|
||||
}
|
||||
|
||||
var hasChanges: Bool {
|
||||
if let initialEntitiesData = self.initialEntitiesData {
|
||||
let entitiesData = self.entitiesData
|
||||
|
@ -54,7 +54,7 @@ public final class DrawingStickerEntity: DrawingEntity, Codable {
|
||||
}
|
||||
}
|
||||
|
||||
init(content: Content) {
|
||||
public init(content: Content) {
|
||||
self.uuid = UUID()
|
||||
self.content = content
|
||||
|
||||
|
@ -29,7 +29,7 @@ private func generateKnobImage() -> UIImage? {
|
||||
return image?.stretchableImage(withLeftCapWidth: Int(margin + side * 0.5), topCapHeight: Int(margin + side * 0.5))
|
||||
}
|
||||
|
||||
class ModeAndSizeComponent: Component {
|
||||
final class ModeAndSizeComponent: Component {
|
||||
let values: [String]
|
||||
let sizeValue: CGFloat
|
||||
let isEditing: Bool
|
||||
|
@ -261,6 +261,7 @@ private final class MediaPlayerScrubbingBufferingNode: ASDisplayNode {
|
||||
self.containerNode = ASDisplayNode()
|
||||
self.containerNode.isLayerBacked = true
|
||||
self.containerNode.clipsToBounds = true
|
||||
self.containerNode.cornerRadius = lineHeight / 2.0
|
||||
|
||||
self.foregroundNode = ASImageNode()
|
||||
self.foregroundNode.isLayerBacked = true
|
||||
|
@ -669,7 +669,7 @@ public final class StorageBox {
|
||||
let queue = self.queue
|
||||
return ActionDisposable { [weak self] in
|
||||
queue.async {
|
||||
guard let self else {
|
||||
guard let `self` = self else {
|
||||
return
|
||||
}
|
||||
self.totalSizeSubscribers.remove(index)
|
||||
|
@ -622,7 +622,7 @@ final class PremiumOptionComponent: CombinedComponent {
|
||||
text: .plain(subtitleString),
|
||||
maximumNumberOfLines: 1
|
||||
),
|
||||
availableSize: CGSize(width: context.availableSize.width - insets.left - insets.right - label.size.width, height: context.availableSize.height),
|
||||
availableSize: CGSize(width: context.availableSize.width - insets.left - insets.right, height: context.availableSize.height),
|
||||
transition: context.transition
|
||||
)
|
||||
context.add(subtitle
|
||||
|
@ -52,6 +52,19 @@ private func makeExclusiveKeychain(id: AccountRecordId, postbox: Postbox) -> Key
|
||||
})
|
||||
}
|
||||
|
||||
func _internal_test(_ network: Network) -> Signal<Bool, String> {
|
||||
return network.request(Api.functions.help.test()) |> map { result in
|
||||
switch result {
|
||||
case .boolFalse:
|
||||
return false
|
||||
case .boolTrue:
|
||||
return true
|
||||
}
|
||||
} |> mapError { error in
|
||||
return error.description
|
||||
}
|
||||
}
|
||||
|
||||
public class UnauthorizedAccount {
|
||||
public let networkArguments: NetworkInitializationArguments
|
||||
public let id: AccountRecordId
|
||||
|
@ -23,6 +23,10 @@ public extension TelegramEngineUnauthorized {
|
||||
public func twoStepAuthData() -> Signal<TwoStepAuthData, MTRpcError> {
|
||||
return _internal_twoStepAuthData(self.account.network)
|
||||
}
|
||||
|
||||
public func test() -> Signal<Bool, String> {
|
||||
return _internal_test(self.account.network)
|
||||
}
|
||||
|
||||
public func updateTwoStepVerificationPassword(currentPassword: String?, updatedPassword: UpdatedTwoStepVerificationPassword) -> Signal<UpdateTwoStepVerificationPasswordResult, UpdateTwoStepVerificationPasswordError> {
|
||||
return _internal_updateTwoStepVerificationPassword(network: self.account.network, currentPassword: currentPassword, updatedPassword: updatedPassword)
|
||||
|
@ -4216,7 +4216,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
||||
}
|
||||
|
||||
if !displayCustomNotificationSettings {
|
||||
let _ = self.context.engine.peers.updatePeerMuteSetting(peerId: self.peerId, threadId: self.chatLocation.threadId, muteInterval: nil).start()
|
||||
let _ = self.context.engine.peers.updatePeerMuteSetting(peerId: self.data?.peer?.id ?? self.peerId, threadId: self.chatLocation.threadId, muteInterval: nil).start()
|
||||
|
||||
let iconColor: UIColor = .white
|
||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .universal(animation: "anim_profileunmute", scale: 0.075, colors: [
|
||||
@ -4262,10 +4262,10 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
||||
}, action: { _, f in
|
||||
f(.default)
|
||||
|
||||
guard let strongSelf = self else {
|
||||
guard let strongSelf = self, let peer = strongSelf.data?.peer else {
|
||||
return
|
||||
}
|
||||
let _ = strongSelf.context.engine.peers.updatePeerMuteSetting(peerId: strongSelf.peerId, threadId: strongSelf.chatLocation.threadId, muteInterval: value).start()
|
||||
let _ = strongSelf.context.engine.peers.updatePeerMuteSetting(peerId: peer.id, threadId: strongSelf.chatLocation.threadId, muteInterval: value).start()
|
||||
|
||||
strongSelf.controller?.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .universal(animation: "anim_mute_for", scale: 0.066, colors: [:], title: nil, text: strongSelf.presentationData.strings.PeerInfo_TooltipMutedFor(mutedForTimeIntervalString(strings: strongSelf.presentationData.strings, value: value)).string, customUndoText: nil), elevatedLayout: false, animateInAsReplacement: true, action: { _ in return false }), in: .current)
|
||||
})))
|
||||
@ -5152,7 +5152,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
||||
}
|
||||
navigationController.setViewControllers(viewControllers, animated: true)
|
||||
current.activateSearch()
|
||||
} else if let peer = self.data?.peer {
|
||||
} else if let peer = self.data?.chatPeer {
|
||||
self.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: self.context, chatLocation: .peer(EnginePeer(peer)), keepStack: self.nearbyPeerDistance != nil ? .always : .default, activateMessageSearch: (.everything, ""), peerNearbyData: self.nearbyPeerDistance.flatMap({ ChatPeerNearbyData(distance: $0) }), completion: { [weak self] _ in
|
||||
if let strongSelf = self, strongSelf.nearbyPeerDistance != nil {
|
||||
var viewControllers = navigationController.viewControllers
|
||||
@ -5220,13 +5220,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
||||
|
||||
private func openCustomMute() {
|
||||
let controller = ChatTimerScreen(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, style: .default, mode: .mute, currentTime: nil, dismissByTapOutside: true, completion: { [weak self] value in
|
||||
guard let strongSelf = self else {
|
||||
guard let strongSelf = self, let peer = strongSelf.data?.peer else {
|
||||
return
|
||||
}
|
||||
if value <= 0 {
|
||||
let _ = strongSelf.context.engine.peers.updatePeerMuteSetting(peerId: strongSelf.peerId, threadId: strongSelf.chatLocation.threadId, muteInterval: nil).start()
|
||||
let _ = strongSelf.context.engine.peers.updatePeerMuteSetting(peerId: peer.id, threadId: strongSelf.chatLocation.threadId, muteInterval: nil).start()
|
||||
} else {
|
||||
let _ = strongSelf.context.engine.peers.updatePeerMuteSetting(peerId: strongSelf.peerId, threadId: strongSelf.chatLocation.threadId, muteInterval: value).start()
|
||||
let _ = strongSelf.context.engine.peers.updatePeerMuteSetting(peerId: peer.id, threadId: strongSelf.chatLocation.threadId, muteInterval: value).start()
|
||||
|
||||
let timeString = stringForPreciseRelativeTimestamp(strings: strongSelf.presentationData.strings, relativeTimestamp: Int32(Date().timeIntervalSince1970) + value, relativeTo: Int32(Date().timeIntervalSince1970), dateTimeFormat: strongSelf.presentationData.dateTimeFormat)
|
||||
|
||||
@ -5675,7 +5675,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
||||
if isAnonymousNumber && !accountIsFromUS {
|
||||
actions.tip = .animatedEmoji(text: strongSelf.presentationData.strings.UserInfo_AnonymousNumberInfo, arguments: nil, file: nil, action: { [weak self] in
|
||||
if let strongSelf = self {
|
||||
strongSelf.context.sharedContext.openExternalUrl(context: strongSelf.context, urlContext: .generic, url: "https://fragment.com", forceExternal: true, presentationData: strongSelf.presentationData, navigationController: nil, dismissInput: {})
|
||||
strongSelf.context.sharedContext.openExternalUrl(context: strongSelf.context, urlContext: .generic, url: "https://fragment.com/numbers", forceExternal: true, presentationData: strongSelf.presentationData, navigationController: nil, dismissInput: {})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -231,21 +231,59 @@ private func navigatedMessageFromMessages(_ messages: [Message], anchorIndex: Me
|
||||
|
||||
private func navigatedMessageFromView(_ view: MessageHistoryView, anchorIndex: MessageIndex, position: NavigatedMessageFromViewPosition) -> (message: Message, around: [Message], exact: Bool)? {
|
||||
var index = 0
|
||||
|
||||
for entry in view.entries {
|
||||
if entry.index.id == anchorIndex.id {
|
||||
let currentGroupKey = entry.message.groupingKey
|
||||
|
||||
switch position {
|
||||
case .exact:
|
||||
return (entry.message, aroundMessagesFromView(view: view, centralIndex: entry.index), true)
|
||||
case .later:
|
||||
if index + 1 < view.entries.count {
|
||||
if let currentGroupKey {
|
||||
if index - 1 > 0, view.entries[index - 1].message.groupingKey == currentGroupKey {
|
||||
let message = view.entries[index - 1].message
|
||||
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index - 1].index), true)
|
||||
} else {
|
||||
for i in index ..< view.entries.count {
|
||||
if view.entries[i].message.groupingKey != currentGroupKey {
|
||||
let message = view.entries[i].message
|
||||
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i].index), true)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if index + 1 < view.entries.count {
|
||||
let message = view.entries[index + 1].message
|
||||
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index + 1].index), true)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
case .earlier:
|
||||
if index != 0 {
|
||||
if let currentGroupKey {
|
||||
if index + 1 < view.entries.count, view.entries[index + 1].message.groupingKey == currentGroupKey {
|
||||
let message = view.entries[index + 1].message
|
||||
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index + 1].index), true)
|
||||
} else {
|
||||
for i in (0 ..< index).reversed() {
|
||||
if view.entries[i].message.groupingKey != currentGroupKey {
|
||||
let message = view.entries[i].message
|
||||
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i].index), true)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if index != 0 {
|
||||
let message = view.entries[index - 1].message
|
||||
if let nextGroupingKey = message.groupingKey {
|
||||
for i in (0 ..< index).reversed() {
|
||||
if view.entries[i].message.groupingKey != nextGroupingKey {
|
||||
let message = view.entries[i + 1].message
|
||||
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i + 1].index), true)
|
||||
} else if i == 0 {
|
||||
let message = view.entries[i].message
|
||||
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i].index), true)
|
||||
}
|
||||
}
|
||||
}
|
||||
return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index - 1].index), true)
|
||||
} else {
|
||||
return nil
|
||||
|
Loading…
x
Reference in New Issue
Block a user