From b30ae66b1e80e5eef126d7dec9f8e9b92bcb87d6 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 27 Nov 2018 22:58:28 +0400 Subject: [PATCH] Fixed chat action buttons color when custom wallpaper is applied --- TelegramUI/ChatEmptyNode.swift | 2 +- TelegramUI/ChatHoleItem.swift | 2 +- TelegramUI/ChatLoadingNode.swift | 2 +- TelegramUI/ChatMessageActionButtonsNode.swift | 15 +-- TelegramUI/ChatMessageBubbleItemNode.swift | 16 +-- .../ChatMessageInstantVideoItemNode.swift | 8 +- TelegramUI/ChatMessageStickerItemNode.swift | 14 ++- TelegramUI/ChatRecentActionsEmptyNode.swift | 2 +- .../DefaultDarkAccentPresentationTheme.swift | 6 +- TelegramUI/DefaultDarkPresentationTheme.swift | 6 +- TelegramUI/DefaultPresentationTheme.swift | 12 +- TelegramUI/InstantPageController.swift | 6 +- TelegramUI/PresentationResourceKey.swift | 17 +-- TelegramUI/PresentationResourcesChat.swift | 117 ++---------------- TelegramUI/PresentationTheme.swift | 26 +++- .../PresentationThemeEssentialGraphics.swift | 85 ++++++++++--- TelegramUI/UrlHandling.swift | 4 +- 17 files changed, 154 insertions(+), 186 deletions(-) diff --git a/TelegramUI/ChatEmptyNode.swift b/TelegramUI/ChatEmptyNode.swift index d29e54943d..c7afe8620f 100644 --- a/TelegramUI/ChatEmptyNode.swift +++ b/TelegramUI/ChatEmptyNode.swift @@ -329,7 +329,7 @@ final class ChatEmptyNode: ASDisplayNode { self.currentTheme = interfaceState.theme self.currentStrings = interfaceState.strings - let graphics = PresentationResourcesChat.principalGraphics(interfaceState.theme, wallpaper: interfaceState.chatWallpaper) + let graphics = PresentationResourcesChat.additionalGraphics(interfaceState.theme, wallpaper: interfaceState.chatWallpaper) self.backgroundNode.image = graphics.chatEmptyItemBackgroundImage } diff --git a/TelegramUI/ChatHoleItem.swift b/TelegramUI/ChatHoleItem.swift index a2b409de6a..57083a356c 100644 --- a/TelegramUI/ChatHoleItem.swift +++ b/TelegramUI/ChatHoleItem.swift @@ -80,7 +80,7 @@ class ChatHoleItemNode: ListViewItemNode { return { item, params, dateAtBottom in var updatedBackground: UIImage? if item.presentationData.theme !== currentItem?.presentationData.theme { - let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) updatedBackground = graphics.chatServiceBubbleFillImage } diff --git a/TelegramUI/ChatLoadingNode.swift b/TelegramUI/ChatLoadingNode.swift index 23d9362aaa..6391b1c9c9 100644 --- a/TelegramUI/ChatLoadingNode.swift +++ b/TelegramUI/ChatLoadingNode.swift @@ -13,7 +13,7 @@ final class ChatLoadingNode: ASDisplayNode { self.backgroundNode.displayWithoutProcessing = true self.backgroundNode.displaysAsynchronously = false - let graphics = PresentationResourcesChat.principalGraphics(theme, wallpaper: chatWallpaper) + let graphics = PresentationResourcesChat.additionalGraphics(theme, wallpaper: chatWallpaper) self.backgroundNode.image = graphics.chatLoadingIndicatorBackgroundImage let serviceColor = serviceMessageColorComponents(theme: theme, wallpaper: chatWallpaper) diff --git a/TelegramUI/ChatMessageActionButtonsNode.swift b/TelegramUI/ChatMessageActionButtonsNode.swift index a11dd56914..767e56b14d 100644 --- a/TelegramUI/ChatMessageActionButtonsNode.swift +++ b/TelegramUI/ChatMessageActionButtonsNode.swift @@ -53,7 +53,7 @@ private final class ChatMessageActionButtonNode: ASDisplayNode { } } - class func asyncLayout(_ maybeNode: ChatMessageActionButtonNode?) -> (_ account: Account, _ theme: PresentationTheme, _ strings: PresentationStrings, _ message: Message, _ button: ReplyMarkupButton, _ constrainedWidth: CGFloat, _ position: MessageBubbleActionButtonPosition) -> (minimumWidth: CGFloat, layout: ((CGFloat) -> (CGSize, () -> ChatMessageActionButtonNode))) { + class func asyncLayout(_ maybeNode: ChatMessageActionButtonNode?) -> (_ account: Account, _ theme: ChatPresentationThemeData, _ strings: PresentationStrings, _ message: Message, _ button: ReplyMarkupButton, _ constrainedWidth: CGFloat, _ position: MessageBubbleActionButtonPosition) -> (minimumWidth: CGFloat, layout: ((CGFloat) -> (CGSize, () -> ChatMessageActionButtonNode))) { let titleLayout = TextNode.asyncLayout(maybeNode?.titleNode) return { account, theme, strings, message, button, constrainedWidth, position in @@ -73,18 +73,19 @@ private final class ChatMessageActionButtonNode: ASDisplayNode { } } - let (titleSize, titleApply) = titleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: title, font: titleFont, textColor: incoming ? theme.chat.bubble.actionButtonsIncomingTextColor : theme.chat.bubble.actionButtonsOutgoingTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: max(1.0, constrainedWidth - minimumSideInset - minimumSideInset), height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets(top: 1.0, left: 0.0, bottom: 1.0, right: 0.0))) + let (titleSize, titleApply) = titleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: title, font: titleFont, textColor: incoming ? theme.theme.chat.bubble.actionButtonsIncomingTextColor : theme.theme.chat.bubble.actionButtonsOutgoingTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: max(1.0, constrainedWidth - minimumSideInset - minimumSideInset), height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets(top: 1.0, left: 0.0, bottom: 1.0, right: 0.0))) + let graphics = PresentationResourcesChat.additionalGraphics(theme.theme, wallpaper: theme.wallpaper) let backgroundImage: UIImage? switch position { case .middle: - backgroundImage = incoming ? PresentationResourcesChat.chatBubbleActionButtonIncomingMiddleImage(theme) : PresentationResourcesChat.chatBubbleActionButtonOutgoingMiddleImage(theme) + backgroundImage = incoming ? graphics.chatBubbleActionButtonIncomingMiddleImage : graphics.chatBubbleActionButtonOutgoingMiddleImage case .bottomLeft: - backgroundImage = incoming ? PresentationResourcesChat.chatBubbleActionButtonIncomingBottomLeftImage(theme) : PresentationResourcesChat.chatBubbleActionButtonOutgoingBottomLeftImage(theme) + backgroundImage = incoming ? graphics.chatBubbleActionButtonIncomingBottomLeftImage : graphics.chatBubbleActionButtonOutgoingBottomLeftImage case .bottomRight: - backgroundImage = incoming ? PresentationResourcesChat.chatBubbleActionButtonIncomingBottomRightImage(theme) : PresentationResourcesChat.chatBubbleActionButtonOutgoingBottomRightImage(theme) + backgroundImage = incoming ? graphics.chatBubbleActionButtonIncomingBottomRightImage : graphics.chatBubbleActionButtonOutgoingBottomRightImage case .bottomSingle: - backgroundImage = incoming ? PresentationResourcesChat.chatBubbleActionButtonIncomingBottomSingleImage(theme) : PresentationResourcesChat.chatBubbleActionButtonOutgoingBottomSingleImage(theme) + backgroundImage = incoming ? graphics.chatBubbleActionButtonIncomingBottomSingleImage : graphics.chatBubbleActionButtonOutgoingBottomSingleImage } return (titleSize.size.width + sideInset + sideInset, { width in @@ -134,7 +135,7 @@ final class ChatMessageActionButtonsNode: ASDisplayNode { } } - class func asyncLayout(_ maybeNode: ChatMessageActionButtonsNode?) -> (_ account: Account, _ theme: PresentationTheme, _ strings: PresentationStrings, _ replyMarkup: ReplyMarkupMessageAttribute, _ message: Message, _ constrainedWidth: CGFloat) -> (minWidth: CGFloat, layout: (CGFloat) -> (CGSize, (_ animated: Bool) -> ChatMessageActionButtonsNode)) { + class func asyncLayout(_ maybeNode: ChatMessageActionButtonsNode?) -> (_ account: Account, _ theme: ChatPresentationThemeData, _ strings: PresentationStrings, _ replyMarkup: ReplyMarkupMessageAttribute, _ message: Message, _ constrainedWidth: CGFloat) -> (minWidth: CGFloat, layout: (CGFloat) -> (CGSize, (_ animated: Bool) -> ChatMessageActionButtonsNode)) { let currentButtonLayouts = maybeNode?.buttonNodes.map { ChatMessageActionButtonNode.asyncLayout($0) } ?? [] return { account, theme, strings, replyMarkup, message, constrainedWidth in diff --git a/TelegramUI/ChatMessageBubbleItemNode.swift b/TelegramUI/ChatMessageBubbleItemNode.swift index fe01f667b0..cc873da459 100644 --- a/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/TelegramUI/ChatMessageBubbleItemNode.swift @@ -843,7 +843,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { var actionButtonsFinalize: ((CGFloat) -> (CGSize, (_ animated: Bool) -> ChatMessageActionButtonsNode))? if let replyMarkup = replyMarkup { - let (minWidth, buttonsLayout) = actionButtonsLayout(item.account, item.presentationData.theme.theme, item.presentationData.strings, replyMarkup, item.message, maximumNodeWidth) + let (minWidth, buttonsLayout) = actionButtonsLayout(item.account, item.presentationData.theme, item.presentationData.strings, replyMarkup, item.message, maximumNodeWidth) maxContentWidth = max(maxContentWidth, minWidth) actionButtonsFinalize = buttonsLayout } @@ -1080,19 +1080,21 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { if currentShareButtonNode != nil { updatedShareButtonNode = currentShareButtonNode if item.presentationData.theme !== currentItem?.presentationData.theme { + let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) if item.message.id.peerId == item.account.peerId { - updatedShareButtonBackground = PresentationResourcesChat.chatBubbleNavigateButtonImage(item.presentationData.theme.theme) + updatedShareButtonBackground = graphics.chatBubbleNavigateButtonImage } else { - updatedShareButtonBackground = PresentationResourcesChat.chatBubbleShareButtonImage(item.presentationData.theme.theme) + updatedShareButtonBackground = graphics.chatBubbleShareButtonImage } } } else { let buttonNode = HighlightableButtonNode() let buttonIcon: UIImage? + let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) if item.message.id.peerId == item.account.peerId { - buttonIcon = PresentationResourcesChat.chatBubbleNavigateButtonImage(item.presentationData.theme.theme) + buttonIcon = graphics.chatBubbleNavigateButtonImage } else { - buttonIcon = PresentationResourcesChat.chatBubbleShareButtonImage(item.presentationData.theme.theme) + buttonIcon = graphics.chatBubbleShareButtonImage } buttonNode.setBackgroundImage(buttonIcon, for: [.normal]) updatedShareButtonNode = buttonNode @@ -1953,8 +1955,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { if (translation.x < -45.0) != (self.currentSwipeToReplyTranslation < -45.0) { if translation.x < -45.0, self.swipeToReplyNode == nil, let item = self.item { self.swipeToReplyFeedback?.impact() - - let swipeToReplyNode = ChatMessageSwipeToReplyNode(fillColor: item.presentationData.theme.theme.chat.bubble.shareButtonFillColor, strokeColor: item.presentationData.theme.theme.chat.bubble.shareButtonStrokeColor, foregroundColor: item.presentationData.theme.theme.chat.bubble.shareButtonForegroundColor) + + let swipeToReplyNode = ChatMessageSwipeToReplyNode(fillColor: bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.bubble.shareButtonFillColor, wallpaper: item.presentationData.theme.wallpaper), strokeColor: item.presentationData.theme.theme.chat.bubble.shareButtonStrokeColor, foregroundColor: item.presentationData.theme.theme.chat.bubble.shareButtonForegroundColor) self.swipeToReplyNode = swipeToReplyNode self.addSubnode(swipeToReplyNode) animateReplyNodeIn = true diff --git a/TelegramUI/ChatMessageInstantVideoItemNode.swift b/TelegramUI/ChatMessageInstantVideoItemNode.swift index 6b605d3247..fd5cb6f29e 100644 --- a/TelegramUI/ChatMessageInstantVideoItemNode.swift +++ b/TelegramUI/ChatMessageInstantVideoItemNode.swift @@ -149,7 +149,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { updatedReplyBackgroundNode = ASImageNode() } - let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) replyBackgroundImage = graphics.chatServiceBubbleFillImage break } else if let attribute = attribute as? InlineBotMessageAttribute { @@ -194,14 +194,14 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { updatedForwardBackgroundNode = ASImageNode() } - let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) forwardBackgroundImage = graphics.chatServiceBubbleFillImage } var maxContentWidth = videoLayout.contentSize.width var actionButtonsFinalize: ((CGFloat) -> (CGSize, (_ animated: Bool) -> ChatMessageActionButtonsNode))? if let replyMarkup = replyMarkup { - let (minWidth, buttonsLayout) = actionButtonsLayout(item.account, item.presentationData.theme.theme, item.presentationData.strings, replyMarkup, item.message, maxContentWidth) + let (minWidth, buttonsLayout) = actionButtonsLayout(item.account, item.presentationData.theme, item.presentationData.strings, replyMarkup, item.message, maxContentWidth) maxContentWidth = max(maxContentWidth, minWidth) actionButtonsFinalize = buttonsLayout } @@ -390,7 +390,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { if translation.x < -45.0, self.swipeToReplyNode == nil, let item = self.item { self.swipeToReplyFeedback?.impact() - let swipeToReplyNode = ChatMessageSwipeToReplyNode(fillColor: item.presentationData.theme.theme.chat.bubble.shareButtonFillColor, strokeColor: item.presentationData.theme.theme.chat.bubble.shareButtonStrokeColor, foregroundColor: item.presentationData.theme.theme.chat.bubble.shareButtonForegroundColor) + let swipeToReplyNode = ChatMessageSwipeToReplyNode(fillColor: bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.bubble.shareButtonFillColor, wallpaper: item.presentationData.theme.wallpaper), strokeColor: item.presentationData.theme.theme.chat.bubble.shareButtonStrokeColor, foregroundColor: item.presentationData.theme.theme.chat.bubble.shareButtonForegroundColor) self.swipeToReplyNode = swipeToReplyNode self.addSubnode(swipeToReplyNode) animateReplyNodeIn = true diff --git a/TelegramUI/ChatMessageStickerItemNode.swift b/TelegramUI/ChatMessageStickerItemNode.swift index 4e476fc917..b87e525a0f 100644 --- a/TelegramUI/ChatMessageStickerItemNode.swift +++ b/TelegramUI/ChatMessageStickerItemNode.swift @@ -242,7 +242,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { updatedReplyBackgroundNode = ASImageNode() } - let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) replyBackgroundImage = graphics.chatFreeformContentAdditionalInfoBackgroundImage break } @@ -255,19 +255,21 @@ class ChatMessageStickerItemNode: ChatMessageItemView { if currentShareButtonNode != nil { updatedShareButtonNode = currentShareButtonNode if item.presentationData.theme !== currentItem?.presentationData.theme { + let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) if item.message.id.peerId == item.account.peerId { - updatedShareButtonBackground = PresentationResourcesChat.chatBubbleNavigateButtonImage(item.presentationData.theme.theme) + updatedShareButtonBackground = graphics.chatBubbleNavigateButtonImage } else { - updatedShareButtonBackground = PresentationResourcesChat.chatBubbleShareButtonImage(item.presentationData.theme.theme) + updatedShareButtonBackground = graphics.chatBubbleShareButtonImage } } } else { let buttonNode = HighlightableButtonNode() let buttonIcon: UIImage? + let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) if item.message.id.peerId == item.account.peerId { - buttonIcon = PresentationResourcesChat.chatBubbleNavigateButtonImage(item.presentationData.theme.theme) + buttonIcon = graphics.chatBubbleNavigateButtonImage } else { - buttonIcon = PresentationResourcesChat.chatBubbleShareButtonImage(item.presentationData.theme.theme) + buttonIcon = graphics.chatBubbleShareButtonImage } buttonNode.setBackgroundImage(buttonIcon, for: [.normal]) updatedShareButtonNode = buttonNode @@ -418,7 +420,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView { if translation.x < -45.0, self.swipeToReplyNode == nil, let item = self.item { self.swipeToReplyFeedback?.impact() - let swipeToReplyNode = ChatMessageSwipeToReplyNode(fillColor: item.presentationData.theme.theme.chat.bubble.shareButtonFillColor, strokeColor: item.presentationData.theme.theme.chat.bubble.shareButtonStrokeColor, foregroundColor: item.presentationData.theme.theme.chat.bubble.shareButtonForegroundColor) + let swipeToReplyNode = ChatMessageSwipeToReplyNode(fillColor: bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.bubble.shareButtonFillColor, wallpaper: item.presentationData.theme.wallpaper), strokeColor: item.presentationData.theme.theme.chat.bubble.shareButtonStrokeColor, foregroundColor: item.presentationData.theme.theme.chat.bubble.shareButtonForegroundColor) self.swipeToReplyNode = swipeToReplyNode self.addSubnode(swipeToReplyNode) animateReplyNodeIn = true diff --git a/TelegramUI/ChatRecentActionsEmptyNode.swift b/TelegramUI/ChatRecentActionsEmptyNode.swift index d2cd86b145..4e06fc3423 100644 --- a/TelegramUI/ChatRecentActionsEmptyNode.swift +++ b/TelegramUI/ChatRecentActionsEmptyNode.swift @@ -34,7 +34,7 @@ final class ChatRecentActionsEmptyNode: ASDisplayNode { super.init() - let graphics = PresentationResourcesChat.principalGraphics(theme, wallpaper: chatWallpaper) + let graphics = PresentationResourcesChat.additionalGraphics(theme, wallpaper: chatWallpaper) self.backgroundNode.image = graphics.chatEmptyItemBackgroundImage self.addSubnode(self.backgroundNode) diff --git a/TelegramUI/DefaultDarkAccentPresentationTheme.swift b/TelegramUI/DefaultDarkAccentPresentationTheme.swift index cf1f4a4182..863ca81732 100644 --- a/TelegramUI/DefaultDarkAccentPresentationTheme.swift +++ b/TelegramUI/DefaultDarkAccentPresentationTheme.swift @@ -168,15 +168,15 @@ private let bubble = PresentationThemeChatBubble( outgoingFileDescriptionColor: UIColor(rgb: 0xDBF5FF, alpha: 0.5), incomingFileDurationColor: UIColor(rgb: 0xDBF5FF, alpha: 0.5), outgoingFileDurationColor: UIColor(rgb: 0xDBF5FF, alpha: 0.5), - shareButtonFillColor: UIColor(rgb: 0x18222D, alpha: 0.5), + shareButtonFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x18222D, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x18222D, alpha: 0.5)), shareButtonStrokeColor: UIColor(rgb: 0x213040), shareButtonForegroundColor: UIColor(rgb: 0xb2b2b2), //!!! mediaOverlayControlBackgroundColor: UIColor(white: 0.0, alpha: 0.6), //!!! mediaOverlayControlForegroundColor: UIColor(white: 1.0, alpha: 1.0), //!!! - actionButtonsIncomingFillColor: UIColor(rgb: 0x18222D, alpha: 0.5), + actionButtonsIncomingFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x18222D, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x18222D, alpha: 0.5)), actionButtonsIncomingStrokeColor: UIColor(rgb: 0x213040), actionButtonsIncomingTextColor: UIColor(rgb: 0xffffff), - actionButtonsOutgoingFillColor: UIColor(rgb: 0x18222D, alpha: 0.5), + actionButtonsOutgoingFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x18222D, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x18222D, alpha: 0.5)), actionButtonsOutgoingStrokeColor: UIColor(rgb: 0x213040), actionButtonsOutgoingTextColor: UIColor(rgb: 0xffffff), selectionControlBorderColor: .white, diff --git a/TelegramUI/DefaultDarkPresentationTheme.swift b/TelegramUI/DefaultDarkPresentationTheme.swift index a3059d9fd8..b90878ec05 100644 --- a/TelegramUI/DefaultDarkPresentationTheme.swift +++ b/TelegramUI/DefaultDarkPresentationTheme.swift @@ -168,15 +168,15 @@ private let bubble = PresentationThemeChatBubble( outgoingFileDescriptionColor: UIColor(rgb: 0xffffff, alpha: 0.5), incomingFileDurationColor: UIColor(rgb: 0xffffff, alpha: 0.5), outgoingFileDurationColor: UIColor(rgb: 0xffffff, alpha: 0.5), - shareButtonFillColor: UIColor(rgb: 0x000000, alpha: 0.5), + shareButtonFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), shareButtonStrokeColor: UIColor(rgb: 0x1f1f1f), shareButtonForegroundColor: UIColor(rgb: 0xb2b2b2), //!!! mediaOverlayControlBackgroundColor: UIColor(white: 0.0, alpha: 0.6), //!!! mediaOverlayControlForegroundColor: UIColor(white: 1.0, alpha: 1.0), //!!! - actionButtonsIncomingFillColor: UIColor(rgb: 0x000000, alpha: 0.5), + actionButtonsIncomingFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsIncomingStrokeColor: UIColor(rgb: 0x1f1f1f), actionButtonsIncomingTextColor: UIColor(rgb: 0xffffff), - actionButtonsOutgoingFillColor: UIColor(rgb: 0x000000, alpha: 0.5), + actionButtonsOutgoingFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), actionButtonsOutgoingStrokeColor: UIColor(rgb: 0x1f1f1f), actionButtonsOutgoingTextColor: UIColor(rgb: 0xffffff), selectionControlBorderColor: .white, diff --git a/TelegramUI/DefaultPresentationTheme.swift b/TelegramUI/DefaultPresentationTheme.swift index b7311fc7eb..a26b754b5c 100644 --- a/TelegramUI/DefaultPresentationTheme.swift +++ b/TelegramUI/DefaultPresentationTheme.swift @@ -199,15 +199,15 @@ private func makeDefaultPresentationTheme(accentColor: UIColor, day: Bool) -> Pr outgoingFileDescriptionColor: UIColor(rgb: 0x6fb26a), incomingFileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), outgoingFileDurationColor: UIColor(rgb: 0x008c09, alpha: 0.8), - shareButtonFillColor: UIColor(rgb: 0x748391, alpha: 0.45), + shareButtonFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.25), withoutWallpaper: UIColor(rgb: 0x748391, alpha: 0.45)), shareButtonStrokeColor: .clear, shareButtonForegroundColor: .white, mediaOverlayControlBackgroundColor: UIColor(white: 0.0, alpha: 0.6), mediaOverlayControlForegroundColor: UIColor(white: 1.0, alpha: 1.0), - actionButtonsIncomingFillColor: UIColor(rgb: 0x596E89, alpha: 0.35), + actionButtonsIncomingFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.25), withoutWallpaper: UIColor(rgb: 0x596E89, alpha: 0.35)), actionButtonsIncomingStrokeColor: .clear, actionButtonsIncomingTextColor: .white, - actionButtonsOutgoingFillColor: UIColor(rgb: 0x596E89, alpha: 0.35), + actionButtonsOutgoingFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.25), withoutWallpaper: UIColor(rgb: 0x596E89, alpha: 0.35)), actionButtonsOutgoingStrokeColor: .clear, actionButtonsOutgoingTextColor: .white, selectionControlBorderColor: UIColor(rgb: 0xC7C7CC), @@ -253,15 +253,15 @@ private func makeDefaultPresentationTheme(accentColor: UIColor, day: Bool) -> Pr outgoingFileDescriptionColor: UIColor(rgb: 0xffffff, alpha: 0.7), incomingFileDurationColor: UIColor(rgb: 0x525252, alpha: 0.6), outgoingFileDurationColor: UIColor(rgb: 0xffffff, alpha: 0.7), - shareButtonFillColor: UIColor(rgb: 0xffffff, alpha: 0.8), + shareButtonFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8), withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.8)), shareButtonStrokeColor: UIColor(rgb: 0xE5E5EA), shareButtonForegroundColor: accentColor, mediaOverlayControlBackgroundColor: UIColor(rgb: 0x000000, alpha: 0.6), mediaOverlayControlForegroundColor: UIColor(rgb: 0xffffff, alpha: 1.0), - actionButtonsIncomingFillColor: UIColor(rgb: 0xffffff, alpha: 0.5), + actionButtonsIncomingFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0xffffff, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.5)), actionButtonsIncomingStrokeColor: UIColor(rgb: 0x3996ee), actionButtonsIncomingTextColor: UIColor(rgb: 0x3996ee), - actionButtonsOutgoingFillColor: UIColor(rgb: 0xffffff, alpha: 0.5), + actionButtonsOutgoingFillColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0xffffff, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.5)), actionButtonsOutgoingStrokeColor: UIColor(rgb: 0x3996ee), actionButtonsOutgoingTextColor: UIColor(rgb: 0x3996ee), selectionControlBorderColor: UIColor(rgb: 0xC7C7CC), diff --git a/TelegramUI/InstantPageController.swift b/TelegramUI/InstantPageController.swift index 3886201437..1056101a1c 100644 --- a/TelegramUI/InstantPageController.swift +++ b/TelegramUI/InstantPageController.swift @@ -57,7 +57,6 @@ final class InstantPageController: ViewController { if strongSelf.isNodeLoaded { strongSelf.controllerNode.update(settings: settings, strings: strongSelf.presentationData.strings) } - strongSelf._ready.set(.single(true)) } }) } @@ -98,14 +97,15 @@ final class InstantPageController: ViewController { } }) - self.displayNodeDidLoad() - let _ = (instantPageStoredState(postbox: self.account.postbox, webPage: self.webPage) |> deliverOnMainQueue).start(next: { [weak self] state in if let strongSelf = self { strongSelf.controllerNode.updateWebPage(strongSelf.webPage, anchor: strongSelf.anchor, state: state) + strongSelf._ready.set(.single(true)) } }) + + self.displayNodeDidLoad() } override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { diff --git a/TelegramUI/PresentationResourceKey.swift b/TelegramUI/PresentationResourceKey.swift index 679d3798bc..b3a45332f6 100644 --- a/TelegramUI/PresentationResourceKey.swift +++ b/TelegramUI/PresentationResourceKey.swift @@ -72,6 +72,10 @@ enum PresentationResourceKey: Int32 { case chatPrincipalThemeEssentialGraphicsWithWallpaper case chatPrincipalThemeEssentialGraphicsWithoutWallpaper + + case chatPrincipalThemeAdditionalGraphicsWithCustomWallpaper + case chatPrincipalThemeAdditionalGraphicsWithDefaultWallpaper + case chatBubbleVerticalLineIncomingImage case chatBubbleVerticalLineOutgoingImage case chatServiceVerticalLineImage @@ -85,9 +89,6 @@ enum PresentationResourceKey: Int32 { case chatBubbleConsumableContentOutgoingIcon case chatMediaConsumableContentIcon - case chatBubbleShareButtonImage - case chatBubbleNavigateButtonImage - case chatBubbleMediaOverlayControlSecret case chatBubbleSecretMediaIcon @@ -98,16 +99,6 @@ enum PresentationResourceKey: Int32 { case chatUnreadBarBackgroundImage - case chatBubbleActionButtonIncomingMiddleImage - case chatBubbleActionButtonIncomingBottomLeftImage - case chatBubbleActionButtonIncomingBottomRightImage - case chatBubbleActionButtonIncomingBottomSingleImage - - case chatBubbleActionButtonOutgoingMiddleImage - case chatBubbleActionButtonOutgoingBottomLeftImage - case chatBubbleActionButtonOutgoingBottomRightImage - case chatBubbleActionButtonOutgoingBottomSingleImage - case chatBubbleFileCloudFetchMediaIcon case chatBubbleFileCloudFetchIncomingIcon case chatBubbleFileCloudFetchOutgoingIcon diff --git a/TelegramUI/PresentationResourcesChat.swift b/TelegramUI/PresentationResourcesChat.swift index 659e30bc31..002cdbfcbe 100644 --- a/TelegramUI/PresentationResourcesChat.swift +++ b/TelegramUI/PresentationResourcesChat.swift @@ -73,6 +73,13 @@ struct PresentationResourcesChat { }) as! PrincipalThemeEssentialGraphics } + static func additionalGraphics(_ theme: PresentationTheme, wallpaper: TelegramWallpaper) -> PrincipalThemeAdditionalGraphics { + let key: PresentationResourceKey = wallpaper.isBuiltin ? PresentationResourceKey.chatPrincipalThemeAdditionalGraphicsWithDefaultWallpaper : PresentationResourceKey.chatPrincipalThemeAdditionalGraphicsWithCustomWallpaper + return theme.object(key.rawValue, { theme in + return PrincipalThemeAdditionalGraphics(theme.chat, wallpaper: wallpaper) + }) as! PrincipalThemeAdditionalGraphics + } + static func chatBubbleVerticalLineIncomingImage(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.chatBubbleVerticalLineIncomingImage.rawValue, { theme in return generateLineImage(color: theme.chat.bubble.incomingAccentControlColor) @@ -109,66 +116,6 @@ struct PresentationResourcesChat { }) } - static func chatBubbleShareButtonImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatBubbleShareButtonImage.rawValue, { theme in - return generateImage(CGSize(width: 29.0, height: 29.0), rotatedContext: { size, context in - context.clear(CGRect(origin: CGPoint(), size: size)) - context.setFillColor(theme.chat.bubble.shareButtonFillColor.cgColor) - context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) - let lineWidth: CGFloat = 1.0 - let halfLineWidth = lineWidth / 2.0 - var strokeAlpha: CGFloat = 0.0 - theme.chat.bubble.shareButtonStrokeColor.getRed(nil, green: nil, blue: nil, alpha: &strokeAlpha) - if !strokeAlpha.isZero { - context.setStrokeColor(theme.chat.bubble.shareButtonStrokeColor.cgColor) - context.setLineWidth(lineWidth) - context.strokeEllipse(in: CGRect(origin: CGPoint(x: halfLineWidth, y: halfLineWidth), size: CGSize(width: size.width - lineWidth, height: size.width - lineWidth))) - } - - if let image = UIImage(bundleImageName: "Chat/Message/ShareIcon") { - let imageRect = CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.height - image.size.height) / 2.0)), size: image.size) - - context.translateBy(x: imageRect.midX, y: imageRect.midY) - context.scaleBy(x: 1.0, y: -1.0) - context.translateBy(x: -imageRect.midX, y: -imageRect.midY) - context.clip(to: imageRect, mask: image.cgImage!) - context.setFillColor(theme.chat.bubble.shareButtonForegroundColor.cgColor) - context.fill(imageRect) - } - }) - }) - } - - static func chatBubbleNavigateButtonImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatBubbleNavigateButtonImage.rawValue, { theme in - return generateImage(CGSize(width: 29.0, height: 29.0), rotatedContext: { size, context in - context.clear(CGRect(origin: CGPoint(), size: size)) - context.setFillColor(theme.chat.bubble.shareButtonFillColor.cgColor) - context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) - let lineWidth: CGFloat = 1.0 - let halfLineWidth = lineWidth / 2.0 - var strokeAlpha: CGFloat = 0.0 - theme.chat.bubble.shareButtonStrokeColor.getRed(nil, green: nil, blue: nil, alpha: &strokeAlpha) - if !strokeAlpha.isZero { - context.setStrokeColor(theme.chat.bubble.shareButtonStrokeColor.cgColor) - context.setLineWidth(lineWidth) - context.strokeEllipse(in: CGRect(origin: CGPoint(x: halfLineWidth, y: halfLineWidth), size: CGSize(width: size.width - lineWidth, height: size.width - lineWidth))) - } - - if let image = UIImage(bundleImageName: "Chat/Message/NavigateToMessageIcon") { - let imageRect = CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.height - image.size.height) / 2.0) + 1.0), size: image.size) - - context.translateBy(x: imageRect.midX, y: imageRect.midY) - context.scaleBy(x: 1.0, y: -1.0) - context.translateBy(x: -imageRect.midX, y: -imageRect.midY) - context.clip(to: imageRect, mask: image.cgImage!) - context.setFillColor(theme.chat.bubble.shareButtonForegroundColor.cgColor) - context.fill(imageRect) - } - }) - }) - } - static func chatBubbleSecretMediaIcon(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.chatBubbleSecretMediaIcon.rawValue, { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/SecretMediaIcon"), color: theme.chat.bubble.mediaOverlayControlForegroundColor) @@ -208,55 +155,7 @@ struct PresentationResourcesChat { })?.stretchableImage(withLeftCapWidth: 1, topCapHeight: 4) }) } - - static func chatBubbleActionButtonIncomingMiddleImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatBubbleActionButtonIncomingMiddleImage.rawValue, { theme in - return messageBubbleActionButtonImage(color: theme.chat.bubble.actionButtonsIncomingFillColor, strokeColor: theme.chat.bubble.actionButtonsIncomingStrokeColor, position: .middle) - }) - } - - static func chatBubbleActionButtonIncomingBottomLeftImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatBubbleActionButtonIncomingBottomLeftImage.rawValue, { theme in - return messageBubbleActionButtonImage(color: theme.chat.bubble.actionButtonsIncomingFillColor, strokeColor: theme.chat.bubble.actionButtonsIncomingStrokeColor, position: .bottomLeft) - }) - } - - static func chatBubbleActionButtonIncomingBottomRightImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatBubbleActionButtonIncomingBottomRightImage.rawValue, { theme in - return messageBubbleActionButtonImage(color: theme.chat.bubble.actionButtonsIncomingFillColor, strokeColor: theme.chat.bubble.actionButtonsIncomingStrokeColor, position: .bottomRight) - }) - } - - static func chatBubbleActionButtonIncomingBottomSingleImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatBubbleActionButtonIncomingBottomSingleImage.rawValue, { theme in - return messageBubbleActionButtonImage(color: theme.chat.bubble.actionButtonsIncomingFillColor, strokeColor: theme.chat.bubble.actionButtonsIncomingStrokeColor, position: .bottomSingle) - }) - } - - static func chatBubbleActionButtonOutgoingMiddleImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatBubbleActionButtonOutgoingMiddleImage.rawValue, { theme in - return messageBubbleActionButtonImage(color: theme.chat.bubble.actionButtonsOutgoingFillColor, strokeColor: theme.chat.bubble.actionButtonsOutgoingStrokeColor, position: .middle) - }) - } - - static func chatBubbleActionButtonOutgoingBottomLeftImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatBubbleActionButtonOutgoingBottomLeftImage.rawValue, { theme in - return messageBubbleActionButtonImage(color: theme.chat.bubble.actionButtonsOutgoingFillColor, strokeColor: theme.chat.bubble.actionButtonsOutgoingStrokeColor, position: .bottomLeft) - }) - } - - static func chatBubbleActionButtonOutgoingBottomRightImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatBubbleActionButtonOutgoingBottomRightImage.rawValue, { theme in - return messageBubbleActionButtonImage(color: theme.chat.bubble.actionButtonsOutgoingFillColor, strokeColor: theme.chat.bubble.actionButtonsOutgoingStrokeColor, position: .bottomRight) - }) - } - - static func chatBubbleActionButtonOutgoingBottomSingleImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatBubbleActionButtonOutgoingBottomSingleImage.rawValue, { theme in - return messageBubbleActionButtonImage(color: theme.chat.bubble.actionButtonsOutgoingFillColor, strokeColor: theme.chat.bubble.actionButtonsOutgoingStrokeColor, position: .bottomSingle) - }) - } - + static func chatInfoItemBackgroundImageWithoutWallpaper(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.chatInfoItemBackgroundImageWithoutWallpaper.rawValue, { theme in return messageSingleBubbleLikeImage(fillColor: theme.chat.bubble.incoming.withoutWallpaper.fill, strokeColor: theme.chat.bubble.incoming.withoutWallpaper.stroke) diff --git a/TelegramUI/PresentationTheme.swift b/TelegramUI/PresentationTheme.swift index 38d5eee5ed..f20266e2c4 100644 --- a/TelegramUI/PresentationTheme.swift +++ b/TelegramUI/PresentationTheme.swift @@ -412,6 +412,16 @@ public final class PresentationThemeBubbleColor { } } +public final class PresentationThemeVariableColor { + public let withWallpaper: UIColor + public let withoutWallpaper: UIColor + + public init(withWallpaper: UIColor, withoutWallpaper: UIColor) { + self.withWallpaper = withWallpaper + self.withoutWallpaper = withoutWallpaper + } +} + public func bubbleColorComponents(theme: PresentationTheme, incoming: Bool, wallpaper: Bool) -> PresentationThemeBubbleColorComponents { if incoming { if wallpaper { @@ -428,6 +438,14 @@ public func bubbleColorComponents(theme: PresentationTheme, incoming: Bool, wall } } +public func bubbleVariableColor(variableColor: PresentationThemeVariableColor, wallpaper: TelegramWallpaper) -> UIColor { + if wallpaper != .builtin { + return variableColor.withWallpaper + } else { + return variableColor.withoutWallpaper + } +} + public final class PresentationThemeChatBubble { public let incoming: PresentationThemeBubbleColor public let outgoing: PresentationThemeBubbleColor @@ -469,18 +487,18 @@ public final class PresentationThemeChatBubble { public let incomingFileDurationColor: UIColor public let outgoingFileDurationColor: UIColor - public let shareButtonFillColor: UIColor + public let shareButtonFillColor: PresentationThemeVariableColor public let shareButtonStrokeColor: UIColor public let shareButtonForegroundColor: UIColor public let mediaOverlayControlBackgroundColor: UIColor public let mediaOverlayControlForegroundColor: UIColor - public let actionButtonsIncomingFillColor: UIColor + public let actionButtonsIncomingFillColor: PresentationThemeVariableColor public let actionButtonsIncomingStrokeColor: UIColor public let actionButtonsIncomingTextColor: UIColor - public let actionButtonsOutgoingFillColor: UIColor + public let actionButtonsOutgoingFillColor: PresentationThemeVariableColor public let actionButtonsOutgoingStrokeColor: UIColor public let actionButtonsOutgoingTextColor: UIColor @@ -496,7 +514,7 @@ public final class PresentationThemeChatBubble { public let incomingMediaPlaceholderColor: UIColor public let outgoingMediaPlaceholderColor: UIColor - public init(incoming: PresentationThemeBubbleColor, outgoing: PresentationThemeBubbleColor, freeform: PresentationThemeBubbleColor, incomingPrimaryTextColor: UIColor, incomingSecondaryTextColor: UIColor, incomingLinkTextColor: UIColor, incomingLinkHighlightColor: UIColor, outgoingPrimaryTextColor: UIColor, outgoingSecondaryTextColor: UIColor, outgoingLinkTextColor: UIColor, outgoingLinkHighlightColor: UIColor, infoPrimaryTextColor: UIColor, infoLinkTextColor: UIColor, incomingAccentTextColor: UIColor, outgoingAccentTextColor: UIColor, incomingAccentControlColor: UIColor, outgoingAccentControlColor: UIColor, incomingMediaActiveControlColor: UIColor, outgoingMediaActiveControlColor: UIColor, incomingMediaInactiveControlColor: UIColor, outgoingMediaInactiveControlColor: UIColor, outgoingCheckColor: UIColor, incomingPendingActivityColor: UIColor, outgoingPendingActivityColor: UIColor, mediaDateAndStatusFillColor: UIColor, mediaDateAndStatusTextColor: UIColor, incomingFileTitleColor: UIColor, outgoingFileTitleColor: UIColor, incomingFileDescriptionColor: UIColor, outgoingFileDescriptionColor: UIColor, incomingFileDurationColor: UIColor, outgoingFileDurationColor: UIColor, shareButtonFillColor: UIColor, shareButtonStrokeColor: UIColor, shareButtonForegroundColor: UIColor, mediaOverlayControlBackgroundColor: UIColor, mediaOverlayControlForegroundColor: UIColor, actionButtonsIncomingFillColor: UIColor, actionButtonsIncomingStrokeColor: UIColor, actionButtonsIncomingTextColor: UIColor, actionButtonsOutgoingFillColor: UIColor, actionButtonsOutgoingStrokeColor: UIColor, actionButtonsOutgoingTextColor: UIColor, selectionControlBorderColor: UIColor, selectionControlFillColor: UIColor, selectionControlForegroundColor: UIColor, mediaHighlightOverlayColor: UIColor, deliveryFailedFillColor: UIColor, deliveryFailedForegroundColor: UIColor, incomingMediaPlaceholderColor: UIColor, outgoingMediaPlaceholderColor: UIColor) { + public init(incoming: PresentationThemeBubbleColor, outgoing: PresentationThemeBubbleColor, freeform: PresentationThemeBubbleColor, incomingPrimaryTextColor: UIColor, incomingSecondaryTextColor: UIColor, incomingLinkTextColor: UIColor, incomingLinkHighlightColor: UIColor, outgoingPrimaryTextColor: UIColor, outgoingSecondaryTextColor: UIColor, outgoingLinkTextColor: UIColor, outgoingLinkHighlightColor: UIColor, infoPrimaryTextColor: UIColor, infoLinkTextColor: UIColor, incomingAccentTextColor: UIColor, outgoingAccentTextColor: UIColor, incomingAccentControlColor: UIColor, outgoingAccentControlColor: UIColor, incomingMediaActiveControlColor: UIColor, outgoingMediaActiveControlColor: UIColor, incomingMediaInactiveControlColor: UIColor, outgoingMediaInactiveControlColor: UIColor, outgoingCheckColor: UIColor, incomingPendingActivityColor: UIColor, outgoingPendingActivityColor: UIColor, mediaDateAndStatusFillColor: UIColor, mediaDateAndStatusTextColor: UIColor, incomingFileTitleColor: UIColor, outgoingFileTitleColor: UIColor, incomingFileDescriptionColor: UIColor, outgoingFileDescriptionColor: UIColor, incomingFileDurationColor: UIColor, outgoingFileDurationColor: UIColor, shareButtonFillColor: PresentationThemeVariableColor, shareButtonStrokeColor: UIColor, shareButtonForegroundColor: UIColor, mediaOverlayControlBackgroundColor: UIColor, mediaOverlayControlForegroundColor: UIColor, actionButtonsIncomingFillColor: PresentationThemeVariableColor, actionButtonsIncomingStrokeColor: UIColor, actionButtonsIncomingTextColor: UIColor, actionButtonsOutgoingFillColor: PresentationThemeVariableColor, actionButtonsOutgoingStrokeColor: UIColor, actionButtonsOutgoingTextColor: UIColor, selectionControlBorderColor: UIColor, selectionControlFillColor: UIColor, selectionControlForegroundColor: UIColor, mediaHighlightOverlayColor: UIColor, deliveryFailedFillColor: UIColor, deliveryFailedForegroundColor: UIColor, incomingMediaPlaceholderColor: UIColor, outgoingMediaPlaceholderColor: UIColor) { self.incoming = incoming self.outgoing = outgoing self.freeform = freeform diff --git a/TelegramUI/PresentationThemeEssentialGraphics.swift b/TelegramUI/PresentationThemeEssentialGraphics.swift index 549c9e7d5e..9cf68975c2 100644 --- a/TelegramUI/PresentationThemeEssentialGraphics.swift +++ b/TelegramUI/PresentationThemeEssentialGraphics.swift @@ -40,6 +40,34 @@ private func generateClockMinImage(color: UIColor) -> UIImage? { }) } +private func chatBubbleActionButtonImage(fillColor: UIColor, strokeColor: UIColor, foregroundColor: UIColor, image: UIImage?, iconOffset: CGPoint = CGPoint()) -> UIImage? { + return generateImage(CGSize(width: 29.0, height: 29.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(fillColor.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) + let lineWidth: CGFloat = 1.0 + let halfLineWidth = lineWidth / 2.0 + var strokeAlpha: CGFloat = 0.0 + strokeColor.getRed(nil, green: nil, blue: nil, alpha: &strokeAlpha) + if !strokeAlpha.isZero { + context.setStrokeColor(strokeColor.cgColor) + context.setLineWidth(lineWidth) + context.strokeEllipse(in: CGRect(origin: CGPoint(x: halfLineWidth, y: halfLineWidth), size: CGSize(width: size.width - lineWidth, height: size.width - lineWidth))) + } + + if let image = image { + let imageRect = CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0) + iconOffset.x, y: floor((size.height - image.size.height) / 2.0) + iconOffset.y), size: image.size) + + context.translateBy(x: imageRect.midX, y: imageRect.midY) + context.scaleBy(x: 1.0, y: -1.0) + context.translateBy(x: -imageRect.midX, y: -imageRect.midY) + context.clip(to: imageRect, mask: image.cgImage!) + context.setFillColor(foregroundColor.cgColor) + context.fill(imageRect) + } + }) +} + public final class PrincipalThemeEssentialGraphics { public let chatMessageBackgroundIncomingImage: UIImage public let chatMessageBackgroundIncomingHighlightedImage: UIImage @@ -76,11 +104,6 @@ public final class PrincipalThemeEssentialGraphics { public let checkFreeFullImage: UIImage public let checkFreePartialImage: UIImage - public let chatServiceBubbleFillImage: UIImage - public let chatFreeformContentAdditionalInfoBackgroundImage: UIImage - public let chatEmptyItemBackgroundImage: UIImage - public let chatLoadingIndicatorBackgroundImage: UIImage - public let clockBubbleIncomingFrameImage: UIImage public let clockBubbleIncomingMinImage: UIImage public let clockBubbleOutgoingFrameImage: UIImage @@ -144,15 +167,6 @@ public final class PrincipalThemeEssentialGraphics { self.checkFreeFullImage = generateCheckImage(partial: false, color: serviceColor.primaryText)! self.checkFreePartialImage = generateCheckImage(partial: true, color: serviceColor.primaryText)! - self.chatServiceBubbleFillImage = generateImage(CGSize(width: 20.0, height: 20.0), contextGenerator: { size, context -> Void in - context.clear(CGRect(origin: CGPoint(), size: size)) - context.setFillColor(serviceColor.fill.cgColor) - context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) - })!.stretchableImage(withLeftCapWidth: 8, topCapHeight: 8) - self.chatFreeformContentAdditionalInfoBackgroundImage = generateStretchableFilledCircleImage(radius: 4.0, color: serviceColor.fill)! - self.chatEmptyItemBackgroundImage = generateStretchableFilledCircleImage(radius: 14.0, color: serviceColor.fill)! - self.chatLoadingIndicatorBackgroundImage = generateStretchableFilledCircleImage(diameter: 30.0, color: serviceColor.fill)! - self.clockBubbleIncomingFrameImage = generateClockFrameImage(color: theme.bubble.incomingPendingActivityColor)! self.clockBubbleIncomingMinImage = generateClockMinImage(color: theme.bubble.incomingPendingActivityColor)! self.clockBubbleOutgoingFrameImage = generateClockFrameImage(color: theme.bubble.outgoingPendingActivityColor)! @@ -165,7 +179,7 @@ public final class PrincipalThemeEssentialGraphics { self.clockFreeMinImage = generateClockMinImage(color: serviceColor.primaryText)! self.dateAndStatusMediaBackground = generateStretchableFilledCircleImage(diameter: 18.0, color: theme.bubble.mediaDateAndStatusFillColor)! - self.dateAndStatusFreeBackground = generateStretchableFilledCircleImage(diameter: 18.0, color: serviceColor.primaryText)! + self.dateAndStatusFreeBackground = generateStretchableFilledCircleImage(diameter: 18.0, color: serviceColor.dateFillStatic)! let impressionCountImage = UIImage(bundleImageName: "Chat/Message/ImpressionCount")! self.incomingDateAndStatusImpressionIcon = generateTintedImage(image: impressionCountImage, color: theme.bubble.incomingSecondaryTextColor)! @@ -190,3 +204,44 @@ public final class PrincipalThemeEssentialGraphics { self.radialIndicatorFileIconOutgoing = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/RadialProgressIconDocumentIncoming"), color: outgoing.fill)! } } + +public final class PrincipalThemeAdditionalGraphics { + public let chatServiceBubbleFillImage: UIImage + public let chatFreeformContentAdditionalInfoBackgroundImage: UIImage + public let chatEmptyItemBackgroundImage: UIImage + public let chatLoadingIndicatorBackgroundImage: UIImage + + public let chatBubbleShareButtonImage: UIImage + public let chatBubbleNavigateButtonImage: UIImage + public let chatBubbleActionButtonIncomingMiddleImage: UIImage + public let chatBubbleActionButtonIncomingBottomLeftImage: UIImage + public let chatBubbleActionButtonIncomingBottomRightImage: UIImage + public let chatBubbleActionButtonIncomingBottomSingleImage: UIImage + public let chatBubbleActionButtonOutgoingMiddleImage: UIImage + public let chatBubbleActionButtonOutgoingBottomLeftImage: UIImage + public let chatBubbleActionButtonOutgoingBottomRightImage: UIImage + public let chatBubbleActionButtonOutgoingBottomSingleImage: UIImage + + init(_ theme: PresentationThemeChat, wallpaper: TelegramWallpaper) { + let serviceColor = serviceMessageColorComponents(chatTheme: theme, wallpaper: wallpaper) + self.chatServiceBubbleFillImage = generateImage(CGSize(width: 20.0, height: 20.0), contextGenerator: { size, context -> Void in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(serviceColor.fill.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) + })!.stretchableImage(withLeftCapWidth: 8, topCapHeight: 8) + self.chatFreeformContentAdditionalInfoBackgroundImage = generateStretchableFilledCircleImage(radius: 4.0, color: serviceColor.fill)! + self.chatEmptyItemBackgroundImage = generateStretchableFilledCircleImage(radius: 14.0, color: serviceColor.fill)! + self.chatLoadingIndicatorBackgroundImage = generateStretchableFilledCircleImage(diameter: 30.0, color: serviceColor.fill)! + + self.chatBubbleShareButtonImage = chatBubbleActionButtonImage(fillColor: bubbleVariableColor(variableColor: theme.bubble.shareButtonFillColor, wallpaper: wallpaper), strokeColor: theme.bubble.shareButtonStrokeColor, foregroundColor: theme.bubble.shareButtonForegroundColor, image: UIImage(bundleImageName: "Chat/Message/ShareIcon"))! + self.chatBubbleNavigateButtonImage = chatBubbleActionButtonImage(fillColor: bubbleVariableColor(variableColor: theme.bubble.shareButtonFillColor, wallpaper: wallpaper), strokeColor: theme.bubble.shareButtonStrokeColor, foregroundColor: theme.bubble.shareButtonForegroundColor, image: UIImage(bundleImageName: "Chat/Message/NavigateToMessageIcon"), iconOffset: CGPoint(x: 0.0, y: 1.0))! + self.chatBubbleActionButtonIncomingMiddleImage = messageBubbleActionButtonImage(color: bubbleVariableColor(variableColor: theme.bubble.actionButtonsIncomingFillColor, wallpaper: wallpaper), strokeColor: theme.bubble.actionButtonsIncomingStrokeColor, position: .middle) + self.chatBubbleActionButtonIncomingBottomLeftImage = messageBubbleActionButtonImage(color: bubbleVariableColor(variableColor: theme.bubble.actionButtonsIncomingFillColor, wallpaper: wallpaper), strokeColor: theme.bubble.actionButtonsIncomingStrokeColor, position: .bottomLeft) + self.chatBubbleActionButtonIncomingBottomRightImage = messageBubbleActionButtonImage(color: bubbleVariableColor(variableColor: theme.bubble.actionButtonsIncomingFillColor, wallpaper: wallpaper), strokeColor: theme.bubble.actionButtonsIncomingStrokeColor, position: .bottomRight) + self.chatBubbleActionButtonIncomingBottomSingleImage = messageBubbleActionButtonImage(color: bubbleVariableColor(variableColor: theme.bubble.actionButtonsIncomingFillColor, wallpaper: wallpaper), strokeColor: theme.bubble.actionButtonsIncomingStrokeColor, position: .bottomSingle) + self.chatBubbleActionButtonOutgoingMiddleImage = messageBubbleActionButtonImage(color: bubbleVariableColor(variableColor: theme.bubble.actionButtonsOutgoingFillColor, wallpaper: wallpaper), strokeColor: theme.bubble.actionButtonsOutgoingStrokeColor, position: .middle) + self.chatBubbleActionButtonOutgoingBottomLeftImage = messageBubbleActionButtonImage(color: bubbleVariableColor(variableColor: theme.bubble.actionButtonsOutgoingFillColor, wallpaper: wallpaper), strokeColor: theme.bubble.actionButtonsOutgoingStrokeColor, position: .bottomLeft) + self.chatBubbleActionButtonOutgoingBottomRightImage = messageBubbleActionButtonImage(color: bubbleVariableColor(variableColor: theme.bubble.actionButtonsOutgoingFillColor, wallpaper: wallpaper), strokeColor: theme.bubble.actionButtonsOutgoingStrokeColor, position: .bottomRight) + self.chatBubbleActionButtonOutgoingBottomSingleImage = messageBubbleActionButtonImage(color: bubbleVariableColor(variableColor: theme.bubble.actionButtonsOutgoingFillColor, wallpaper: wallpaper), strokeColor: theme.bubble.actionButtonsOutgoingStrokeColor, position: .bottomSingle) + } +} diff --git a/TelegramUI/UrlHandling.swift b/TelegramUI/UrlHandling.swift index c7f25c19ed..9938f8fe14 100644 --- a/TelegramUI/UrlHandling.swift +++ b/TelegramUI/UrlHandling.swift @@ -252,10 +252,10 @@ func resolveUrl(account: Account, url: String) -> Signal { } } } - let baseTelegraPhPaths = ["telegra.ph"] + let baseTelegraPhPaths = ["telegra.ph/", "t.me/iv?"] for basePath in baseTelegraPhPaths { for scheme in schemes { - let basePrefix = scheme + basePath + "/" + let basePrefix = scheme + basePath if url.lowercased().hasPrefix(basePrefix) { return resolveInstantViewUrl(account: account, url: url) }