diff --git a/submodules/ChatListUI/Sources/ChatListFilterPresetController.swift b/submodules/ChatListUI/Sources/ChatListFilterPresetController.swift index 2602b0add5..e33cadd481 100644 --- a/submodules/ChatListUI/Sources/ChatListFilterPresetController.swift +++ b/submodules/ChatListUI/Sources/ChatListFilterPresetController.swift @@ -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 ) ] @@ -710,19 +710,19 @@ private func internalChatListFilterExcludeChatsController(context: AccountContex ChatListNodeAdditionalCategory( id: AdditionalExcludeCategoryId.muted.rawValue, icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Muted"), color: .white), cornerRadius: 12.0, color: .red), - smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Muted"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .red), + smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Muted"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .red), title: presentationData.strings.ChatListFolder_CategoryMuted ), ChatListNodeAdditionalCategory( id: AdditionalExcludeCategoryId.read.rawValue, icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Read"), color: .white), cornerRadius: 12.0, color: .blue), - smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Read"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .blue), + smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Read"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .blue), title: presentationData.strings.ChatListFolder_CategoryRead ), ChatListNodeAdditionalCategory( id: AdditionalExcludeCategoryId.archived.rawValue, icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Archive"), color: .white), cornerRadius: 12.0, color: .yellow), - smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Archive"), color: .white), iconScale: 0.6, cornerRadius: 11.0, circleCorners: true, color: .yellow), + smallIcon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Archive"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .yellow), title: presentationData.strings.ChatListFolder_CategoryArchived ), ] diff --git a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift index 4925d06c1b..4b7366ab5f 100644 --- a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift +++ b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift @@ -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) diff --git a/submodules/Display/Source/Navigation/NavigationModalContainer.swift b/submodules/Display/Source/Navigation/NavigationModalContainer.swift index 66531b1386..42354f8ec4 100644 --- a/submodules/Display/Source/Navigation/NavigationModalContainer.swift +++ b/submodules/Display/Source/Navigation/NavigationModalContainer.swift @@ -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 } diff --git a/submodules/DrawingUI/Sources/DrawingEntitiesView.swift b/submodules/DrawingUI/Sources/DrawingEntitiesView.swift index 442c7e6b15..893c583bf2 100644 --- a/submodules/DrawingUI/Sources/DrawingEntitiesView.swift +++ b/submodules/DrawingUI/Sources/DrawingEntitiesView.swift @@ -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 diff --git a/submodules/DrawingUI/Sources/DrawingStickerEntity.swift b/submodules/DrawingUI/Sources/DrawingStickerEntity.swift index de673e2367..697e8c6e35 100644 --- a/submodules/DrawingUI/Sources/DrawingStickerEntity.swift +++ b/submodules/DrawingUI/Sources/DrawingStickerEntity.swift @@ -54,7 +54,7 @@ public final class DrawingStickerEntity: DrawingEntity, Codable { } } - init(content: Content) { + public init(content: Content) { self.uuid = UUID() self.content = content diff --git a/submodules/DrawingUI/Sources/ModeAndSizeComponent.swift b/submodules/DrawingUI/Sources/ModeAndSizeComponent.swift index b4c037ec8f..af2620f379 100644 --- a/submodules/DrawingUI/Sources/ModeAndSizeComponent.swift +++ b/submodules/DrawingUI/Sources/ModeAndSizeComponent.swift @@ -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 diff --git a/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift b/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift index a45e5ae06d..8b4608d826 100644 --- a/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift @@ -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 diff --git a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift index c1b5fab349..f6550a864d 100644 --- a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift @@ -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 diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index d7c8e7637b..223d642fa8 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -5667,7 +5667,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: {}) } }) } diff --git a/submodules/TelegramUI/Sources/PeerMessagesMediaPlaylist.swift b/submodules/TelegramUI/Sources/PeerMessagesMediaPlaylist.swift index e159d41075..e148a54572 100644 --- a/submodules/TelegramUI/Sources/PeerMessagesMediaPlaylist.swift +++ b/submodules/TelegramUI/Sources/PeerMessagesMediaPlaylist.swift @@ -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