From 4fa1d5462d1bc714eeec418a7e4c323fc31e5174 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 6 Apr 2023 20:10:57 +0400 Subject: [PATCH] Chat wallpaper improvements --- .../Themes/CustomWallpaperPicker.swift | 2 +- .../Themes/WallpaperGalleryToolbarNode.swift | 71 +++++++----- .../Themes/WallpaperOptionButtonNode.swift | 105 ++++-------------- submodules/TelegramApi/Sources/Api0.swift | 2 +- submodules/TelegramApi/Sources/Api12.swift | 24 ++-- submodules/TelegramApi/Sources/Api30.swift | 4 +- .../ApiUtils/TelegramMediaAction.swift | 4 +- .../SyncCore_TelegramMediaAction.swift | 11 +- .../TelegramEngine/Themes/ChatThemes.swift | 20 +++- .../Themes/TelegramEngineThemes.swift | 4 +- .../TelegramUI/Sources/ChatController.swift | 4 +- 11 files changed, 112 insertions(+), 139 deletions(-) diff --git a/submodules/SettingsUI/Sources/Themes/CustomWallpaperPicker.swift b/submodules/SettingsUI/Sources/Themes/CustomWallpaperPicker.swift index 0dcb6dfb53..a3831910cd 100644 --- a/submodules/SettingsUI/Sources/Themes/CustomWallpaperPicker.swift +++ b/submodules/SettingsUI/Sources/Themes/CustomWallpaperPicker.swift @@ -196,7 +196,7 @@ func uploadCustomWallpaper(context: AccountContext, wallpaper: WallpaperGalleryE }).start() } -public func uploadCustomPeerWallpaper(context: AccountContext, wallpaper: WallpaperGalleryEntry, mode: WallpaperPresentationOptions, cropRect: CGRect?, peerId: PeerId, completion: @escaping () -> Void) { +public func uploadCustomPeerWallpaper(context: AccountContext, wallpaper: WallpaperGalleryEntry, mode: WallpaperPresentationOptions, cropRect: CGRect?, brightnessMultiplier: CGFloat?, peerId: PeerId, completion: @escaping () -> Void) { let imageSignal: Signal switch wallpaper { case let .wallpaper(wallpaper, _): diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryToolbarNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryToolbarNode.swift index e29590d657..13c47595c0 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryToolbarNode.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryToolbarNode.swift @@ -17,6 +17,39 @@ enum WallpaperGalleryToolbarDoneButtonType { case none } +final class WallpaperLightButtonBackgroundNode: ASDisplayNode { + private let backgroundNode: NavigationBackgroundNode + private let overlayNode: ASDisplayNode + private let lightNode: ASDisplayNode + + override init() { + self.backgroundNode = NavigationBackgroundNode(color: UIColor(rgb: 0x000000, alpha: 0.01), enableBlur: true) + self.overlayNode = ASDisplayNode() + self.overlayNode.backgroundColor = UIColor(rgb: 0xffffff, alpha: 0.55) + self.overlayNode.layer.compositingFilter = "overlayBlendMode" + + self.lightNode = ASDisplayNode() + self.lightNode.backgroundColor = UIColor(rgb: 0xf2f2f2, alpha: 0.3) + + super.init() + + self.clipsToBounds = true + + self.addSubnode(self.backgroundNode) + self.addSubnode(self.overlayNode) + //self.addSubnode(self.lightNode) + } + + func updateLayout(size: CGSize) { + let frame = CGRect(origin: .zero, size: size) + self.backgroundNode.frame = frame + self.overlayNode.frame = frame + self.lightNode.frame = frame + + self.backgroundNode.update(size: size, transition: .immediate) + } +} + final class WallpaperGalleryToolbarNode: ASDisplayNode { private var theme: PresentationTheme private let strings: PresentationStrings @@ -33,11 +66,9 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode { } private let doneButton = HighlightTrackingButtonNode() - private let doneButtonBackgroundNode: NavigationBackgroundNode + private let doneButtonBackgroundNode: WallpaperLightButtonBackgroundNode private let doneButtonTitleNode: ImmediateTextNode - private let doneButtonVibrancyView: UIVisualEffectView - private let doneButtonVibrancyTitleNode: ImmediateTextNode private let doneButtonSolidBackgroundNode: ASDisplayNode private let doneButtonSolidTitleNode: ImmediateTextNode @@ -51,25 +82,13 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode { self.cancelButtonType = cancelButtonType self.doneButtonType = doneButtonType - self.doneButtonBackgroundNode = NavigationBackgroundNode(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75)) + self.doneButtonBackgroundNode = WallpaperLightButtonBackgroundNode() self.doneButtonBackgroundNode.cornerRadius = 14.0 - let blurEffect: UIBlurEffect - if #available(iOS 13.0, *) { - blurEffect = UIBlurEffect(style: .extraLight) - } else { - blurEffect = UIBlurEffect(style: .light) - } - self.doneButtonVibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect)) - self.doneButtonTitleNode = ImmediateTextNode() self.doneButtonTitleNode.displaysAsynchronously = false self.doneButtonTitleNode.isUserInteractionEnabled = false - self.doneButtonVibrancyTitleNode = ImmediateTextNode() - self.doneButtonVibrancyTitleNode.displaysAsynchronously = false - self.doneButtonVibrancyTitleNode.isUserInteractionEnabled = false - self.doneButtonSolidBackgroundNode = ASDisplayNode() self.doneButtonSolidBackgroundNode.alpha = 0.0 self.doneButtonSolidBackgroundNode.clipsToBounds = true @@ -87,8 +106,6 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode { super.init() self.addSubnode(self.doneButtonBackgroundNode) - self.doneButtonVibrancyView.contentView.addSubnode(self.doneButtonVibrancyTitleNode) - self.doneButtonBackgroundNode.view.addSubview(self.doneButtonVibrancyView) self.doneButtonBackgroundNode.addSubnode(self.doneButtonTitleNode) self.addSubnode(self.doneButtonSolidBackgroundNode) @@ -109,8 +126,8 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode { } else { strongSelf.doneButtonBackgroundNode.layer.removeAnimation(forKey: "opacity") strongSelf.doneButtonBackgroundNode.alpha = 0.55 - strongSelf.doneButtonVibrancyTitleNode.layer.removeAnimation(forKey: "opacity") - strongSelf.doneButtonVibrancyTitleNode.alpha = 0.55 + strongSelf.doneButtonTitleNode.layer.removeAnimation(forKey: "opacity") + strongSelf.doneButtonTitleNode.alpha = 0.55 } } else { if strongSelf.isSolid { @@ -121,8 +138,8 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode { } else { strongSelf.doneButtonBackgroundNode.alpha = 1.0 strongSelf.doneButtonBackgroundNode.layer.animateAlpha(from: 0.55, to: 1.0, duration: 0.2) - strongSelf.doneButtonVibrancyTitleNode.alpha = 1.0 - strongSelf.doneButtonVibrancyTitleNode.layer.animateAlpha(from: 0.55, to: 1.0, duration: 0.2) + strongSelf.doneButtonTitleNode.alpha = 1.0 + strongSelf.doneButtonTitleNode.layer.animateAlpha(from: 0.55, to: 1.0, duration: 0.2) } } } @@ -146,7 +163,6 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode { transition.updateAlpha(node: self.doneButtonBackgroundNode, alpha: isSolid ? 0.0 : 1.0) transition.updateAlpha(node: self.doneButtonSolidBackgroundNode, alpha: isSolid ? 1.0 : 0.0) transition.updateAlpha(node: self.doneButtonTitleNode, alpha: isSolid ? 0.0 : 1.0) - transition.updateAlpha(node: self.doneButtonVibrancyTitleNode, alpha: isSolid ? 0.0 : 1.0) transition.updateAlpha(node: self.doneButtonSolidTitleNode, alpha: isSolid ? 1.0 : 0.0) } @@ -167,8 +183,7 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode { doneTitle = "" self.doneButton.isUserInteractionEnabled = false } - self.doneButtonTitleNode.attributedText = NSAttributedString(string: doneTitle, font: Font.semibold(17.0), textColor: UIColor(rgb: 0x000000, alpha: 0.25)) - self.doneButtonVibrancyTitleNode.attributedText = NSAttributedString(string: doneTitle, font: Font.semibold(17.0), textColor: .white) + self.doneButtonTitleNode.attributedText = NSAttributedString(string: doneTitle, font: Font.semibold(17.0), textColor: .white) self.doneButtonSolidBackgroundNode.backgroundColor = theme.list.itemCheckColors.fillColor self.doneButtonSolidTitleNode.attributedText = NSAttributedString(string: doneTitle, font: Font.semibold(17.0), textColor: theme.list.itemCheckColors.foregroundColor) @@ -181,16 +196,12 @@ final class WallpaperGalleryToolbarNode: ASDisplayNode { let doneFrame = CGRect(origin: CGPoint(x: inset, y: 2.0), size: CGSize(width: size.width - inset * 2.0, height: buttonHeight)) self.doneButton.frame = doneFrame self.doneButtonBackgroundNode.frame = doneFrame - self.doneButtonBackgroundNode.update(size: doneFrame.size, cornerRadius: 14.0, transition: transition) - self.doneButtonVibrancyView.frame = self.doneButtonBackgroundNode.bounds + self.doneButtonBackgroundNode.updateLayout(size: doneFrame.size) self.doneButtonSolidBackgroundNode.frame = doneFrame let doneTitleSize = self.doneButtonTitleNode.updateLayout(doneFrame.size) self.doneButtonTitleNode.frame = CGRect(origin: CGPoint(x: floorToScreenPixels((doneFrame.width - doneTitleSize.width) / 2.0), y: floorToScreenPixels((doneFrame.height - doneTitleSize.height) / 2.0)), size: doneTitleSize) - let _ = self.doneButtonVibrancyTitleNode.updateLayout(doneFrame.size) - self.doneButtonVibrancyTitleNode.frame = self.doneButtonTitleNode.frame - let _ = self.doneButtonSolidTitleNode.updateLayout(doneFrame.size) self.doneButtonSolidTitleNode.frame = self.doneButtonTitleNode.frame.offsetBy(dx: doneFrame.minX, dy: doneFrame.minY) } diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperOptionButtonNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperOptionButtonNode.swift index 202496bd49..5ccd6243de 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperOptionButtonNode.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperOptionButtonNode.swift @@ -42,41 +42,25 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode { private let content: Content - private let backgroundNode: NavigationBackgroundNode - private let vibrancyView: UIVisualEffectView - + private let backgroundNode: WallpaperLightButtonBackgroundNode + private let iconNode: ASImageNode - private let darkIconNode: ASImageNode private let textNode: ImmediateTextNode - private let darkTextNode: ImmediateTextNode func setIcon(_ image: UIImage?) { self.iconNode.image = generateTintedImage(image: image, color: .white) - self.darkIconNode.image = generateTintedImage(image: image, color: UIColor(rgb: 0x000000, alpha: 0.25)) } init(content: Content) { self.content = content - self.backgroundNode = NavigationBackgroundNode(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75)) - - let blurEffect: UIBlurEffect - if #available(iOS 13.0, *) { - blurEffect = UIBlurEffect(style: .extraLight) - } else { - blurEffect = UIBlurEffect(style: .light) - } - self.vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect)) + self.backgroundNode = WallpaperLightButtonBackgroundNode() self.iconNode = ASImageNode() self.iconNode.displaysAsynchronously = false self.iconNode.contentMode = .center - self.darkIconNode = ASImageNode() - self.darkIconNode.displaysAsynchronously = false - self.darkIconNode.contentMode = .center - var title: String switch content { case let .text(text): @@ -84,23 +68,16 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode { case let .icon(icon, _): title = "" self.iconNode.image = generateTintedImage(image: icon, color: .white) - self.darkIconNode.image = generateTintedImage(image: icon, color: UIColor(rgb: 0x000000, alpha: 0.25)) } self.textNode = ImmediateTextNode() self.textNode.attributedText = NSAttributedString(string: title, font: Font.semibold(15.0), textColor: .white) - self.darkTextNode = ImmediateTextNode() - self.darkTextNode.attributedText = NSAttributedString(string: title, font: Font.semibold(15.0), textColor: UIColor(rgb: 0x000000, alpha: 0.25)) - super.init() self.addSubnode(self.backgroundNode) - self.vibrancyView.contentView.addSubnode(self.iconNode) - self.vibrancyView.contentView.addSubnode(self.textNode) - self.backgroundNode.view.addSubview(self.vibrancyView) - self.backgroundNode.addSubnode(self.darkIconNode) - self.backgroundNode.addSubnode(self.darkTextNode) + self.addSubnode(self.iconNode) + self.addSubnode(self.textNode) self.highligthedChanged = { [weak self] highlighted in if let strongSelf = self { @@ -117,11 +94,11 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode { var buttonColor: UIColor = UIColor(rgb: 0x000000, alpha: 0.3) { didSet { - if self.buttonColor == UIColor(rgb: 0x000000, alpha: 0.3) { - self.backgroundNode.updateColor(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75), transition: .immediate) - } else { - self.backgroundNode.updateColor(color: self.buttonColor, transition: .immediate) - } +// if self.buttonColor == UIColor(rgb: 0x000000, alpha: 0.3) { +// self.backgroundNode.updateColor(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75), transition: .immediate) +// } else { +// self.backgroundNode.updateColor(color: self.buttonColor, transition: .immediate) +// } } } @@ -130,7 +107,6 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode { switch self.content { case .text: let size = self.textNode.updateLayout(constrainedSize) - let _ = self.darkTextNode.updateLayout(constrainedSize) self.textSize = size return CGSize(width: ceil(size.width) + 16.0, height: 28.0) case let .icon(_, size): @@ -143,15 +119,13 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode { let size = self.bounds.size self.backgroundNode.frame = self.bounds - self.backgroundNode.update(size: self.backgroundNode.bounds.size, cornerRadius: self.bounds.size.height / 2.0, transition: .immediate) - self.vibrancyView.frame = self.bounds + self.backgroundNode.updateLayout(size: self.backgroundNode.bounds.size) + self.backgroundNode.cornerRadius = size.height / 2.0 self.iconNode.frame = self.bounds - self.darkIconNode.frame = self.bounds if let textSize = self.textSize { self.textNode.frame = CGRect(x: floorToScreenPixels((size.width - textSize.width) / 2.0), y: floorToScreenPixels((size.height - textSize.height) / 2.0), width: textSize.width, height: textSize.height) - self.darkTextNode.frame = self.textNode.frame } } } @@ -159,15 +133,11 @@ final class WallpaperNavigationButtonNode: HighlightTrackingButtonNode { final class WallpaperOptionButtonNode: HighlightTrackingButtonNode { private let backgroundNode: NavigationBackgroundNode - private let vibrancyView: UIVisualEffectView private let checkNode: CheckNode - private let darkCheckNode: CheckNode - private let colorNode: ASImageNode private let textNode: ImmediateTextNode - private let darkTextNode: ImmediateTextNode private var textSize: CGSize? @@ -189,14 +159,12 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode { self._value = .colors(newValue, colors) } self.checkNode.setSelected(newValue, animated: false) - self.darkCheckNode.setSelected(newValue, animated: false) } } var title: String { didSet { self.textNode.attributedText = NSAttributedString(string: title, font: Font.medium(13), textColor: .white) - self.darkTextNode.attributedText = NSAttributedString(string: title, font: Font.medium(13), textColor: UIColor(rgb: 0x000000, alpha: 0.25)) } } @@ -204,62 +172,38 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode { self._value = value self.title = title - self.backgroundNode = NavigationBackgroundNode(color: UIColor(rgb: 0xffffff, alpha: 0.4)) + self.backgroundNode = NavigationBackgroundNode(color: UIColor(rgb: 0x000000, alpha: 0.01)) self.backgroundNode.cornerRadius = 14.0 - - let blurEffect: UIBlurEffect - if #available(iOS 13.0, *) { - blurEffect = UIBlurEffect(style: .extraLight) - } else { - blurEffect = UIBlurEffect(style: .light) - } - self.vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect)) - - let darkColor = UIColor(rgb: 0x000000, alpha: 0.25) - + self.checkNode = CheckNode(theme: CheckNodeTheme(backgroundColor: .white, strokeColor: .clear, borderColor: .white, overlayBorder: false, hasInset: false, hasShadow: false, borderWidth: 1.5)) self.checkNode.isUserInteractionEnabled = false - self.darkCheckNode = CheckNode(theme: CheckNodeTheme(backgroundColor: darkColor, strokeColor: .clear, borderColor: darkColor, overlayBorder: false, hasInset: false, hasShadow: false, borderWidth: 1.5)) - self.darkCheckNode.isUserInteractionEnabled = false - self.colorNode = ASImageNode() self.textNode = ImmediateTextNode() self.textNode.displaysAsynchronously = false self.textNode.attributedText = NSAttributedString(string: title, font: Font.medium(13), textColor: .white) - - self.darkTextNode = ImmediateTextNode() - self.darkTextNode.displaysAsynchronously = false - self.darkTextNode.attributedText = NSAttributedString(string: title, font: Font.medium(13), textColor: UIColor(rgb: 0x000000, alpha: 0.25)) - + super.init() switch value { case let .check(selected): self.checkNode.isHidden = false - self.darkCheckNode.isHidden = false self.colorNode.isHidden = true self.checkNode.selected = selected - self.darkCheckNode.selected = selected case let .color(_, color): self.checkNode.isHidden = true - self.darkCheckNode.isHidden = true self.colorNode.isHidden = false self.colorNode.image = generateFilledCircleImage(diameter: 18.0, color: color) case let .colors(_, colors): self.checkNode.isHidden = true - self.darkCheckNode.isHidden = true self.colorNode.isHidden = false self.colorNode.image = generateColorsImage(diameter: 18.0, colors: colors) } self.addSubnode(self.backgroundNode) - self.vibrancyView.contentView.addSubnode(self.checkNode) - self.vibrancyView.contentView.addSubnode(self.textNode) - self.backgroundNode.view.addSubview(self.vibrancyView) - self.addSubnode(self.darkCheckNode) - self.addSubnode(self.darkTextNode) + self.addSubnode(self.checkNode) + self.addSubnode(self.textNode) self.addSubnode(self.colorNode) self.highligthedChanged = { [weak self] highlighted in @@ -283,11 +227,11 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode { var buttonColor: UIColor = UIColor(rgb: 0x000000, alpha: 0.3) { didSet { - if self.buttonColor == UIColor(rgb: 0x000000, alpha: 0.3) { - self.backgroundNode.updateColor(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75), transition: .immediate) - } else { - self.backgroundNode.updateColor(color: self.buttonColor, transition: .immediate) - } +// if self.buttonColor == UIColor(rgb: 0x000000, alpha: 0.3) { +// self.backgroundNode.updateColor(color: UIColor(rgb: 0xf2f2f2, alpha: 0.75), transition: .immediate) +// } else { +// self.backgroundNode.updateColor(color: self.buttonColor, transition: .immediate) +// } } } @@ -357,7 +301,6 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode { self._value = .colors(selected, colors) } self.checkNode.setSelected(selected, animated: animated) - self.darkCheckNode.setSelected(selected, animated: animated) } func setEnabled(_ enabled: Bool) { @@ -371,7 +314,6 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode { override func measure(_ constrainedSize: CGSize) -> CGSize { let size = self.textNode.updateLayout(constrainedSize) - let _ = self.darkTextNode.updateLayout(constrainedSize) self.textSize = size return CGSize(width: ceil(size.width) + 48.0, height: 30.0) } @@ -381,7 +323,6 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode { self.backgroundNode.frame = self.bounds self.backgroundNode.update(size: self.backgroundNode.bounds.size, cornerRadius: 15.0, transition: .immediate) - self.vibrancyView.frame = self.bounds guard let _ = self.textSize else { return @@ -392,12 +333,10 @@ final class WallpaperOptionButtonNode: HighlightTrackingButtonNode { let checkSize = CGSize(width: 18.0, height: 18.0) let checkFrame = CGRect(origin: CGPoint(x: padding, y: padding), size: checkSize) self.checkNode.frame = checkFrame - self.darkCheckNode.frame = checkFrame self.colorNode.frame = checkFrame if let textSize = self.textSize { self.textNode.frame = CGRect(x: max(padding + checkSize.width + spacing, padding + checkSize.width + floor((self.bounds.width - padding - checkSize.width - textSize.width) / 2.0) - 2.0), y: floorToScreenPixels((self.bounds.height - textSize.height) / 2.0), width: textSize.width, height: textSize.height) - self.darkTextNode.frame = self.textNode.frame } } } diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 6822745a8e..bd9372bcd0 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -479,7 +479,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1434950843] = { return Api.MessageAction.parse_messageActionSetChatTheme($0) } dict[-1136350937] = { return Api.MessageAction.parse_messageActionSetChatWallPaper($0) } dict[1007897979] = { return Api.MessageAction.parse_messageActionSetMessagesTTL($0) } - dict[-632006598] = { return Api.MessageAction.parse_messageActionSetSameChatWallPaper($0) } + dict[-1065845395] = { return Api.MessageAction.parse_messageActionSetSameChatWallPaper($0) } dict[1474192222] = { return Api.MessageAction.parse_messageActionSuggestProfilePhoto($0) } dict[228168278] = { return Api.MessageAction.parse_messageActionTopicCreate($0) } dict[-1064024032] = { return Api.MessageAction.parse_messageActionTopicEdit($0) } diff --git a/submodules/TelegramApi/Sources/Api12.swift b/submodules/TelegramApi/Sources/Api12.swift index 4e3c6116ff..55ad86a29f 100644 --- a/submodules/TelegramApi/Sources/Api12.swift +++ b/submodules/TelegramApi/Sources/Api12.swift @@ -263,7 +263,7 @@ public extension Api { case messageActionSetChatTheme(emoticon: String) case messageActionSetChatWallPaper(wallpaper: Api.WallPaper) case messageActionSetMessagesTTL(flags: Int32, period: Int32, autoSettingFrom: Int64?) - case messageActionSetSameChatWallPaper + case messageActionSetSameChatWallPaper(wallpaper: Api.WallPaper) case messageActionSuggestProfilePhoto(photo: Api.Photo) case messageActionTopicCreate(flags: Int32, title: String, iconColor: Int32, iconEmojiId: Int64?) case messageActionTopicEdit(flags: Int32, title: String?, iconEmojiId: Int64?, closed: Api.Bool?, hidden: Api.Bool?) @@ -522,11 +522,11 @@ public extension Api { serializeInt32(period, buffer: buffer, boxed: false) if Int(flags) & Int(1 << 0) != 0 {serializeInt64(autoSettingFrom!, buffer: buffer, boxed: false)} break - case .messageActionSetSameChatWallPaper: + case .messageActionSetSameChatWallPaper(let wallpaper): if boxed { - buffer.appendInt32(-632006598) + buffer.appendInt32(-1065845395) } - + wallpaper.serialize(buffer, true) break case .messageActionSuggestProfilePhoto(let photo): if boxed { @@ -637,8 +637,8 @@ public extension Api { return ("messageActionSetChatWallPaper", [("wallpaper", wallpaper as Any)]) case .messageActionSetMessagesTTL(let flags, let period, let autoSettingFrom): return ("messageActionSetMessagesTTL", [("flags", flags as Any), ("period", period as Any), ("autoSettingFrom", autoSettingFrom as Any)]) - case .messageActionSetSameChatWallPaper: - return ("messageActionSetSameChatWallPaper", []) + case .messageActionSetSameChatWallPaper(let wallpaper): + return ("messageActionSetSameChatWallPaper", [("wallpaper", wallpaper as Any)]) case .messageActionSuggestProfilePhoto(let photo): return ("messageActionSuggestProfilePhoto", [("photo", photo as Any)]) case .messageActionTopicCreate(let flags, let title, let iconColor, let iconEmojiId): @@ -1092,7 +1092,17 @@ public extension Api { } } public static func parse_messageActionSetSameChatWallPaper(_ reader: BufferReader) -> MessageAction? { - return Api.MessageAction.messageActionSetSameChatWallPaper + var _1: Api.WallPaper? + if let signature = reader.readInt32() { + _1 = Api.parse(reader, signature: signature) as? Api.WallPaper + } + let _c1 = _1 != nil + if _c1 { + return Api.MessageAction.messageActionSetSameChatWallPaper(wallpaper: _1!) + } + else { + return nil + } } public static func parse_messageActionSuggestProfilePhoto(_ reader: BufferReader) -> MessageAction? { var _1: Api.Photo? diff --git a/submodules/TelegramApi/Sources/Api30.swift b/submodules/TelegramApi/Sources/Api30.swift index 697f9d22ba..66622b9ad0 100644 --- a/submodules/TelegramApi/Sources/Api30.swift +++ b/submodules/TelegramApi/Sources/Api30.swift @@ -6884,11 +6884,11 @@ public extension Api.functions.messages { public extension Api.functions.messages { static func setChatWallPaper(flags: Int32, peer: Api.InputPeer, wallpaper: Api.InputWallPaper?, settings: Api.WallPaperSettings?, id: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-609568219) + buffer.appendInt32(-1879389471) serializeInt32(flags, buffer: buffer, boxed: false) peer.serialize(buffer, true) if Int(flags) & Int(1 << 0) != 0 {wallpaper!.serialize(buffer, true)} - if Int(flags) & Int(1 << 0) != 0 {settings!.serialize(buffer, true)} + if Int(flags) & Int(1 << 2) != 0 {settings!.serialize(buffer, true)} if Int(flags) & Int(1 << 1) != 0 {serializeInt32(id!, buffer: buffer, boxed: false)} return (FunctionDescription(name: "messages.setChatWallPaper", parameters: [("flags", String(describing: flags)), ("peer", String(describing: peer)), ("wallpaper", String(describing: wallpaper)), ("settings", String(describing: settings)), ("id", String(describing: id))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in let reader = BufferReader(buffer) diff --git a/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift b/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift index e8972b5cf6..fef8fb0c46 100644 --- a/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift +++ b/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift @@ -110,8 +110,8 @@ func telegramMediaActionFromApiAction(_ action: Api.MessageAction) -> TelegramMe return TelegramMediaAction(action: .requestedPeer(buttonId: buttonId, peerId: peer.peerId)) case let .messageActionSetChatWallPaper(wallpaper): return TelegramMediaAction(action: .setChatWallpaper(wallpaper: TelegramWallpaper(apiWallpaper: wallpaper))) - case .messageActionSetSameChatWallPaper: - return TelegramMediaAction(action: .setSameChatWallpaper) + case let .messageActionSetSameChatWallPaper(wallpaper): + return TelegramMediaAction(action: .setSameChatWallpaper(wallpaper: TelegramWallpaper(apiWallpaper: wallpaper))) } } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaAction.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaAction.swift index 22442aba6a..d8c8d6d550 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaAction.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaAction.swift @@ -102,7 +102,7 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable { case attachMenuBotAllowed case requestedPeer(buttonId: Int32, peerId: PeerId) case setChatWallpaper(wallpaper: TelegramWallpaper) - case setSameChatWallpaper + case setSameChatWallpaper(wallpaper: TelegramWallpaper) public init(decoder: PostboxDecoder) { let rawValue: Int32 = decoder.decodeInt32ForKey("_rawValue", orElse: 0) @@ -190,7 +190,11 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable { self = .unknown } case 34: - self = .setSameChatWallpaper + if let wallpaper = decoder.decode(TelegramWallpaperNativeCodable.self, forKey: "wallpaper")?.value { + self = .setSameChatWallpaper(wallpaper: wallpaper) + } else { + self = .unknown + } default: self = .unknown } @@ -355,8 +359,9 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable { case let .setChatWallpaper(wallpaper): encoder.encodeInt32(33, forKey: "_rawValue") encoder.encode(TelegramWallpaperNativeCodable(wallpaper), forKey: "wallpaper") - case .setSameChatWallpaper: + case let .setSameChatWallpaper(wallpaper): encoder.encodeInt32(34, forKey: "_rawValue") + encoder.encode(TelegramWallpaperNativeCodable(wallpaper), forKey: "wallpaper") } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Themes/ChatThemes.swift b/submodules/TelegramCore/Sources/TelegramEngine/Themes/ChatThemes.swift index 4d7c7609cf..4a78cf87ad 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Themes/ChatThemes.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Themes/ChatThemes.swift @@ -134,15 +134,17 @@ func _internal_setChatWallpaper(account: Account, peerId: PeerId, wallpaper: Tel } }) + var flags: Int32 = 0 + var inputWallpaper: Api.InputWallPaper? var inputSettings: Api.WallPaperSettings? if let inputWallpaperAndInputSettings = wallpaper?.apiInputWallpaperAndSettings { + flags |= 1 << 0 + inputWallpaper = inputWallpaperAndInputSettings.0 inputSettings = inputWallpaperAndInputSettings.1 } - - let flags: Int32 = 1 << 0 - return account.network.request(Api.functions.messages.setChatWallPaper(flags: flags, peer: inputPeer, wallpaper: inputWallpaper ?? .inputWallPaperNoFile(id: 0), settings: inputSettings ?? apiWallpaperSettings(WallpaperSettings()), id: nil)) + return account.network.request(Api.functions.messages.setChatWallPaper(flags: flags, peer: inputPeer, wallpaper: inputWallpaper, settings: inputSettings, id: nil)) |> `catch` { error in return .complete() } @@ -158,7 +160,7 @@ public enum SetExistingChatWallpaperError { case generic } -func _internal_setExistingChatWallpaper(account: Account, messageId: MessageId) -> Signal { +func _internal_setExistingChatWallpaper(account: Account, messageId: MessageId, wallpaper: TelegramWallpaper?) -> Signal { return account.postbox.transaction { transaction -> Peer? in if let peer = transaction.getPeer(messageId.peerId), let message = transaction.getMessage(messageId) { if let action = message.media.first(where: { $0 is TelegramMediaAction }) as? TelegramMediaAction, case let .setChatWallpaper(wallpaper) = action.action { @@ -180,8 +182,14 @@ func _internal_setExistingChatWallpaper(account: Account, messageId: MessageId) guard let peer = peer, let inputPeer = apiInputPeer(peer) else { return .complete() } - let flags: Int32 = 1 << 1 - return account.network.request(Api.functions.messages.setChatWallPaper(flags: flags, peer: inputPeer, wallpaper: nil, settings: nil, id: messageId.id)) + var flags: Int32 = 1 << 1 + + var inputSettings: Api.WallPaperSettings? + if let inputWallpaperAndInputSettings = wallpaper?.apiInputWallpaperAndSettings { + flags |= 1 << 2 + inputSettings = inputWallpaperAndInputSettings.1 + } + return account.network.request(Api.functions.messages.setChatWallPaper(flags: flags, peer: inputPeer, wallpaper: nil, settings: inputSettings, id: messageId.id)) |> `catch` { _ -> Signal in return .fail(.generic) } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Themes/TelegramEngineThemes.swift b/submodules/TelegramCore/Sources/TelegramEngine/Themes/TelegramEngineThemes.swift index 7cfd04ef32..d444f1edce 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Themes/TelegramEngineThemes.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Themes/TelegramEngineThemes.swift @@ -21,8 +21,8 @@ public extension TelegramEngine { return _internal_setChatWallpaper(account: self.account, peerId: peerId, wallpaper: wallpaper) } - public func setExistingChatWallpaper(messageId: MessageId) -> Signal { - return _internal_setExistingChatWallpaper(account: self.account, messageId: messageId) + public func setExistingChatWallpaper(messageId: MessageId, wallpaper: TelegramWallpaper?) -> Signal { + return _internal_setExistingChatWallpaper(account: self.account, messageId: messageId, wallpaper: wallpaper) } } } diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index bbd85374e4..f0772f4229 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -846,7 +846,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G strongSelf.chatDisplayNode.dismissInput() let wallpaperPreviewController = WallpaperGalleryController(context: strongSelf.context, source: .wallpaper(wallpaper, nil, [], nil, nil, nil), mode: .peer(EnginePeer(peer), true)) wallpaperPreviewController.apply = { wallpaper, options, _ in - let _ = (strongSelf.context.engine.themes.setExistingChatWallpaper(messageId: message.id) + let _ = (strongSelf.context.engine.themes.setExistingChatWallpaper(messageId: message.id, wallpaper: nil) |> deliverOnMainQueue).start(completed: { [weak wallpaperPreviewController] in wallpaperPreviewController?.dismiss() }) @@ -18537,7 +18537,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G controller.navigationPresentation = .modal controller.apply = { [weak self] wallpaper, options, cropRect in if let strongSelf = self { - uploadCustomPeerWallpaper(context: strongSelf.context, wallpaper: wallpaper, mode: options, cropRect: cropRect, peerId: peerId, completion: { + uploadCustomPeerWallpaper(context: strongSelf.context, wallpaper: wallpaper, mode: options, cropRect: cropRect, brightnessMultiplier: nil, peerId: peerId, completion: { dismissControllers() }) }