diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 996e945a77..145b58cdfa 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -10983,3 +10983,10 @@ Sorry for the inconvenience."; "Login.Announce.Info" = "Notify people on Telegram who know my phone number that I signed up."; "Login.Announce.Notify" = "Notify"; "Login.Announce.DontNotify" = "Do Not Notify"; + +"Premium.Stories.Quality.Title" = "Higher Quality"; +"Premium.Stories.Quality.Text" = "View video stories in double the resolution."; + +"Premium.MessageTags" = "Tags for Messages"; +"Premium.MessageTagsInfo" = "Organize your Saved Messages with tags for quicker access."; +"Premium.MessageTags.Proceed" = "About Telegram Premium"; diff --git a/submodules/AccountContext/Sources/Premium.swift b/submodules/AccountContext/Sources/Premium.swift index f4dbb4f557..8199157503 100644 --- a/submodules/AccountContext/Sources/Premium.swift +++ b/submodules/AccountContext/Sources/Premium.swift @@ -30,12 +30,14 @@ public enum PremiumIntroSource { case storiesFormatting case storiesExpirationDurations case storiesSuggestedReactions + case storiesHigherQuality case channelBoost(EnginePeer.Id) case nameColor case similarChannels case wallpapers case presence case readTime + case messageTags } public enum PremiumGiftSource: Equatable { @@ -65,6 +67,7 @@ public enum PremiumDemoSubject { case stories case colors case wallpapers + case messageTags } public enum PremiumLimitSubject { diff --git a/submodules/PremiumUI/Resources/tag.png b/submodules/PremiumUI/Resources/tag.png new file mode 100644 index 0000000000..a3a71e2629 Binary files /dev/null and b/submodules/PremiumUI/Resources/tag.png differ diff --git a/submodules/PremiumUI/Resources/tag.scn b/submodules/PremiumUI/Resources/tag.scn new file mode 100644 index 0000000000..03eef5673c Binary files /dev/null and b/submodules/PremiumUI/Resources/tag.scn differ diff --git a/submodules/PremiumUI/Sources/BadgeStarsView.swift b/submodules/PremiumUI/Sources/BadgeStarsView.swift index 6ca220ce3a..f8f80a116d 100644 --- a/submodules/PremiumUI/Sources/BadgeStarsView.swift +++ b/submodules/PremiumUI/Sources/BadgeStarsView.swift @@ -111,3 +111,57 @@ final class EmojiStarsView: UIView, PhoneDemoDecorationView { self.sceneView.frame = CGRect(origin: .zero, size: frame.size) } } + +final class TagStarsView: UIView, PhoneDemoDecorationView { + private let sceneView: SCNView + + private var leftParticles: SCNNode? + private var rightParticles: SCNNode? + + override init(frame: CGRect) { + self.sceneView = SCNView(frame: CGRect(origin: .zero, size: frame.size)) + self.sceneView.backgroundColor = .clear + if let url = getAppBundle().url(forResource: "tag", withExtension: "scn") { + self.sceneView.scene = try? SCNScene(url: url, options: nil) + } + self.sceneView.isUserInteractionEnabled = false + self.sceneView.preferredFramesPerSecond = 60 + + super.init(frame: frame) + + self.alpha = 0.0 + + self.addSubview(self.sceneView) + + self.leftParticles = self.sceneView.scene?.rootNode.childNode(withName: "leftParticles", recursively: false) + self.rightParticles = self.sceneView.scene?.rootNode.childNode(withName: "rightParticles", recursively: false) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setVisible(_ visible: Bool) { + if visible, let leftParticles = self.leftParticles, let rightParticles = self.rightParticles, leftParticles.parent == nil { + self.sceneView.scene?.rootNode.addChildNode(leftParticles) + self.sceneView.scene?.rootNode.addChildNode(rightParticles) + } + + let transition = ContainedViewLayoutTransition.animated(duration: 0.3, curve: .linear) + transition.updateAlpha(layer: self.layer, alpha: visible ? 0.5 : 0.0, completion: { [weak self] finished in + if let strongSelf = self, finished && !visible && strongSelf.leftParticles?.parent != nil { + strongSelf.leftParticles?.removeFromParentNode() + strongSelf.rightParticles?.removeFromParentNode() + } + }) + } + + func resetAnimation() { + } + + override func layoutSubviews() { + super.layoutSubviews() + + self.sceneView.frame = CGRect(origin: .zero, size: frame.size) + } +} diff --git a/submodules/PremiumUI/Sources/PhoneDemoComponent.swift b/submodules/PremiumUI/Sources/PhoneDemoComponent.swift index 51be389a87..5a918550c9 100644 --- a/submodules/PremiumUI/Sources/PhoneDemoComponent.swift +++ b/submodules/PremiumUI/Sources/PhoneDemoComponent.swift @@ -370,6 +370,7 @@ final class PhoneDemoComponent: Component { case badgeStars case emoji case hello + case tag } enum Model { @@ -539,6 +540,13 @@ final class PhoneDemoComponent: Component { self.decorationView = starsView self.decorationContainerView.addSubview(starsView) } + case .tag: + if let _ = self.decorationView as? TagStarsView { + } else { + let starsView = TagStarsView(frame: self.decorationContainerView.bounds) + self.decorationView = starsView + self.decorationContainerView.addSubview(starsView) + } } self.phoneView.setup(context: component.context, videoFile: component.videoFile, position: component.position) diff --git a/submodules/PremiumUI/Sources/PremiumDemoScreen.swift b/submodules/PremiumUI/Sources/PremiumDemoScreen.swift index 575aa94ab4..626ebc96b5 100644 --- a/submodules/PremiumUI/Sources/PremiumDemoScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumDemoScreen.swift @@ -981,6 +981,25 @@ private final class DemoSheetContent: CombinedComponent { ) ) ) + availableItems[.messageTags] = DemoPagerComponent.Item( + AnyComponentWithIdentity( + id: PremiumDemoScreen.Subject.messageTags, + component: AnyComponent( + PageComponent( + content: AnyComponent(PhoneDemoComponent( + context: component.context, + position: .top, + model: .island, + videoFile: configuration.videos["saved_tags"], + decoration: .tag + )), + title: strings.Premium_MessageTags, + text: strings.Premium_MessageTagsInfo, + textColor: textColor + ) + ) + ) + ) var items: [DemoPagerComponent.Item] = component.order.compactMap { availableItems[$0] } let index: Int @@ -1083,6 +1102,8 @@ private final class DemoSheetContent: CombinedComponent { buttonText = strings.Premium_Wallpaper_Proceed case .colors: buttonText = strings.Premium_Colors_Proceed + case .messageTags: + buttonText = strings.Premium_MessageTags_Proceed default: buttonText = strings.Common_OK } @@ -1118,9 +1139,9 @@ private final class DemoSheetContent: CombinedComponent { text = strings.Premium_ColorsInfo case .wallpapers: text = strings.Premium_WallpapersInfo - case .doubleLimits: - text = "" - case .stories: + case .messageTags: + text = strings.Premium_MessageTagsInfo + case .doubleLimits, .stories: text = "" } @@ -1338,6 +1359,7 @@ public class PremiumDemoScreen: ViewControllerComponentContainer { case stories case colors case wallpapers + case messageTags } public enum Source: Equatable { diff --git a/submodules/PremiumUI/Sources/PremiumGiftScreen.swift b/submodules/PremiumUI/Sources/PremiumGiftScreen.swift index f217d65bb1..528853b917 100644 --- a/submodules/PremiumUI/Sources/PremiumGiftScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumGiftScreen.swift @@ -429,6 +429,7 @@ private final class PremiumGiftScreenContentComponent: CombinedComponent { UIColor(rgb: 0xcb3e6d), UIColor(rgb: 0xbc4395), UIColor(rgb: 0xab4ac4), + UIColor(rgb: 0xa34cd7), UIColor(rgb: 0x9b4fed), UIColor(rgb: 0x8958ff), UIColor(rgb: 0x676bff), @@ -521,6 +522,8 @@ private final class PremiumGiftScreenContentComponent: CombinedComponent { demoSubject = .colors case .wallpapers: demoSubject = .wallpapers + case .messageTags: + demoSubject = .messageTags } let buttonText: String diff --git a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift index 28dec4dc42..a62e58ddec 100644 --- a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift @@ -229,6 +229,12 @@ public enum PremiumSource: Equatable { } else { return false } + case .storiesHigherQuality: + if case .storiesHigherQuality = rhs { + return true + } else { + return false + } case let .channelBoost(peerId): if case .channelBoost(peerId) = rhs { return true @@ -265,6 +271,12 @@ public enum PremiumSource: Equatable { } else { return false } + case .messageTags: + if case .messageTags = rhs { + return true + } else { + return false + } } } @@ -301,12 +313,14 @@ public enum PremiumSource: Equatable { case storiesFormatting case storiesExpirationDurations case storiesSuggestedReactions + case storiesHigherQuality case channelBoost(EnginePeer.Id) case nameColor case similarChannels case wallpapers case presence case readTime + case messageTags var identifier: String? { switch self { @@ -378,6 +392,8 @@ public enum PremiumSource: Equatable { return "stories__expiration_durations" case .storiesSuggestedReactions: return "stories__suggested_reactions" + case .storiesHigherQuality: + return "stories__quality" case let .channelBoost(peerId): return "channel_boost__\(peerId.id._internalGetInt64Value())" case .nameColor: @@ -390,6 +406,8 @@ public enum PremiumSource: Equatable { return "presence" case .readTime: return "read_time" + case .messageTags: + return "saved_tags" } } } @@ -412,6 +430,7 @@ public enum PremiumPerk: CaseIterable { case stories case colors case wallpapers + case messageTags public static var allCases: [PremiumPerk] { return [ @@ -431,7 +450,8 @@ public enum PremiumPerk: CaseIterable { .translation, .stories, .colors, - .wallpapers + .wallpapers, + .messageTags ] } @@ -481,6 +501,8 @@ public enum PremiumPerk: CaseIterable { return "peer_colors" case .wallpapers: return "wallpapers" + case .messageTags: + return "saved_tags" } } @@ -520,6 +542,8 @@ public enum PremiumPerk: CaseIterable { return strings.Premium_Colors case .wallpapers: return strings.Premium_Wallpapers + case .messageTags: + return strings.Premium_MessageTags } } @@ -559,6 +583,8 @@ public enum PremiumPerk: CaseIterable { return strings.Premium_ColorsInfo case .wallpapers: return strings.Premium_WallpapersInfo + case .messageTags: + return strings.Premium_MessageTagsInfo } } @@ -598,6 +624,8 @@ public enum PremiumPerk: CaseIterable { return "Premium/Perk/Colors" case .wallpapers: return "Premium/Perk/Wallpapers" + case .messageTags: + return "Premium/Perk/MessageTags" } } } @@ -606,22 +634,23 @@ struct PremiumIntroConfiguration { static var defaultValue: PremiumIntroConfiguration { return PremiumIntroConfiguration(perks: [ .stories, - .doubleLimits, .moreUpload, + .doubleLimits, + .voiceToText, .fasterDownload, .translation, - .voiceToText, - .noAds, + .animatedEmoji, .emojiStatus, + .messageTags, .colors, .wallpapers, - .uniqueReactions, - .premiumStickers, - .animatedEmoji, - .advancedChatManagement, .profileBadge, + .advancedChatManagement, + .noAds, + .appIcons, + .uniqueReactions, .animatedUserpics, - .appIcons + .premiumStickers ]) } @@ -657,6 +686,9 @@ struct PremiumIntroConfiguration { if !perks.contains(.colors) { perks.append(.colors) } + if !perks.contains(.messageTags) { + perks.append(.messageTags) + } #endif return PremiumIntroConfiguration(perks: perks) } else { @@ -1617,8 +1649,9 @@ private final class PremiumIntroScreenContentComponent: CombinedComponent { self.newPerksDisposable = combineLatest(queue: Queue.mainQueue(), ApplicationSpecificNotice.dismissedPremiumAppIconsBadge(accountManager: context.sharedContext.accountManager), ApplicationSpecificNotice.dismissedPremiumWallpapersBadge(accountManager: context.sharedContext.accountManager), - ApplicationSpecificNotice.dismissedPremiumColorsBadge(accountManager: context.sharedContext.accountManager) - ).startStrict(next: { [weak self] dismissedPremiumAppIconsBadge, dismissedPremiumWallpapersBadge, dismissedPremiumColorsBadge in + ApplicationSpecificNotice.dismissedPremiumColorsBadge(accountManager: context.sharedContext.accountManager), + ApplicationSpecificNotice.dismissedMessageTagsBadge(accountManager: context.sharedContext.accountManager) + ).startStrict(next: { [weak self] dismissedPremiumAppIconsBadge, dismissedPremiumWallpapersBadge, dismissedPremiumColorsBadge, dismissedMessageTagsBadge in guard let self else { return } @@ -1629,6 +1662,9 @@ private final class PremiumIntroScreenContentComponent: CombinedComponent { if !dismissedPremiumColorsBadge { newPerks.append(PremiumPerk.colors.identifier) } + if !dismissedMessageTagsBadge { + newPerks.append(PremiumPerk.messageTags.identifier) + } self.newPerks = newPerks self.updated() }) @@ -1808,6 +1844,7 @@ private final class PremiumIntroScreenContentComponent: CombinedComponent { UIColor(rgb: 0xcb3e6d), UIColor(rgb: 0xbc4395), UIColor(rgb: 0xab4ac4), + UIColor(rgb: 0xa34cd7), UIColor(rgb: 0x9b4fed), UIColor(rgb: 0x8958ff), UIColor(rgb: 0x676bff), @@ -2031,6 +2068,9 @@ private final class PremiumIntroScreenContentComponent: CombinedComponent { case .wallpapers: demoSubject = .wallpapers let _ = ApplicationSpecificNotice.setDismissedPremiumWallpapersBadge(accountManager: accountContext.sharedContext.accountManager).startStandalone() + case .messageTags: + demoSubject = .messageTags + let _ = ApplicationSpecificNotice.setDismissedMessageTagsBadge(accountManager: accountContext.sharedContext.accountManager).startStandalone() } let isPremium = state?.isPremium == true diff --git a/submodules/PremiumUI/Sources/PremiumLimitsListScreen.swift b/submodules/PremiumUI/Sources/PremiumLimitsListScreen.swift index 43617b719f..e743fe4bfd 100644 --- a/submodules/PremiumUI/Sources/PremiumLimitsListScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumLimitsListScreen.swift @@ -742,6 +742,25 @@ public class PremiumLimitsListScreen: ViewController { ) ) ) + availableItems[.messageTags] = DemoPagerComponent.Item( + AnyComponentWithIdentity( + id: PremiumDemoScreen.Subject.messageTags, + component: AnyComponent( + PageComponent( + content: AnyComponent(PhoneDemoComponent( + context: context, + position: .top, + model: .island, + videoFile: configuration.videos["saved_tags"], + decoration: .tag + )), + title: strings.Premium_MessageTags, + text: strings.Premium_MessageTagsInfo, + textColor: textColor + ) + ) + ) + ) if let order = controller.order { var items: [DemoPagerComponent.Item] = order.compactMap { availableItems[$0] } diff --git a/submodules/PremiumUI/Sources/StoriesPageComponent.swift b/submodules/PremiumUI/Sources/StoriesPageComponent.swift index 3196b390fc..3821086a4c 100644 --- a/submodules/PremiumUI/Sources/StoriesPageComponent.swift +++ b/submodules/PremiumUI/Sources/StoriesPageComponent.swift @@ -312,13 +312,14 @@ private final class StoriesListComponent: CombinedComponent { let strings = context.component.context.sharedContext.currentPresentationData.with { $0 }.strings let colors = [ - UIColor(rgb: 0x0275f3), - UIColor(rgb: 0x8698ff), - UIColor(rgb: 0xc871ff), - UIColor(rgb: 0xc356ad), - UIColor(rgb: 0xe85c44), - UIColor(rgb: 0xff932b), - UIColor(rgb: 0xe9af18) + UIColor(rgb: 0x007aff), + UIColor(rgb: 0x798aff), + UIColor(rgb: 0xac64f3), + UIColor(rgb: 0xc456ae), + UIColor(rgb: 0xe95d44), + UIColor(rgb: 0xf2822a), + UIColor(rgb: 0xe79519), + UIColor(rgb: 0xe7ad19) ] let titleColor = theme.list.itemPrimaryTextColor @@ -367,6 +368,20 @@ private final class StoriesListComponent: CombinedComponent { ) ) + items.append( + AnyComponentWithIdentity( + id: "quality", + component: AnyComponent(ParagraphComponent( + title: strings.Premium_Stories_Quality_Title, + titleColor: titleColor, + text: strings.Premium_Stories_Quality_Text, + textColor: textColor, + iconName: "Premium/Stories/Quality", + iconColor: colors[2] + )) + ) + ) + items.append( AnyComponentWithIdentity( id: "views", @@ -376,7 +391,7 @@ private final class StoriesListComponent: CombinedComponent { text: strings.Premium_Stories_Views_Text, textColor: textColor, iconName: "Premium/Stories/Views", - iconColor: colors[2] + iconColor: colors[3] )) ) ) @@ -390,7 +405,7 @@ private final class StoriesListComponent: CombinedComponent { text: strings.Premium_Stories_Expiration_Text, textColor: textColor, iconName: "Premium/Stories/Expire", - iconColor: colors[3] + iconColor: colors[4] )) ) ) @@ -404,7 +419,7 @@ private final class StoriesListComponent: CombinedComponent { text: strings.Premium_Stories_Save_Text, textColor: textColor, iconName: "Premium/Stories/Save", - iconColor: colors[4] + iconColor: colors[5] )) ) ) @@ -418,7 +433,7 @@ private final class StoriesListComponent: CombinedComponent { text: strings.Premium_Stories_Captions_Text, textColor: textColor, iconName: "Premium/Stories/Caption", - iconColor: colors[5] + iconColor: colors[6] )) ) ) @@ -432,7 +447,7 @@ private final class StoriesListComponent: CombinedComponent { text: strings.Premium_Stories_Format_Text, textColor: textColor, iconName: "Premium/Stories/Format", - iconColor: colors[6] + iconColor: colors[7] )) ) ) diff --git a/submodules/TelegramNotices/Sources/Notices.swift b/submodules/TelegramNotices/Sources/Notices.swift index 95dfbdca6b..61ce0ec8af 100644 --- a/submodules/TelegramNotices/Sources/Notices.swift +++ b/submodules/TelegramNotices/Sources/Notices.swift @@ -195,6 +195,7 @@ private enum ApplicationSpecificGlobalNotice: Int32 { case videoMessagesPlayOnceSuggestion = 61 case incomingVideoMessagePlayOnceTip = 62 case outgoingVideoMessagePlayOnceTip = 63 + case dismissedMessageTagsBadge = 64 var key: ValueBoxKey { let v = ValueBoxKey(length: 4) @@ -504,6 +505,10 @@ private struct ApplicationSpecificNoticeKeys { static func outgoingVideoMessagePlayOnceTip() -> NoticeEntryKey { return NoticeEntryKey(namespace: noticeNamespace(namespace: globalNamespace), key: ApplicationSpecificGlobalNotice.outgoingVideoMessagePlayOnceTip.key) } + + static func dismissedMessageTagsBadge() -> NoticeEntryKey { + return NoticeEntryKey(namespace: noticeNamespace(namespace: globalNamespace), key: ApplicationSpecificGlobalNotice.dismissedMessageTagsBadge.key) + } } public struct ApplicationSpecificNotice { @@ -2080,4 +2085,25 @@ public struct ApplicationSpecificNotice { return Int(previousValue) } } + + public static func setDismissedMessageTagsBadge(accountManager: AccountManager) -> Signal { + return accountManager.transaction { transaction -> Void in + if let entry = CodableEntry(ApplicationSpecificBoolNotice()) { + transaction.setNotice(ApplicationSpecificNoticeKeys.dismissedMessageTagsBadge(), entry) + } + } + |> ignoreValues + } + + public static func dismissedMessageTagsBadge(accountManager: AccountManager) -> Signal { + return accountManager.noticeEntry(key: ApplicationSpecificNoticeKeys.dismissedMessageTagsBadge()) + |> map { view -> Bool in + if let _ = view.value?.get(ApplicationSpecificBoolNotice.self) { + return true + } else { + return false + } + } + |> take(1) + } } diff --git a/submodules/TelegramUI/Components/SliderContextItem/Sources/SliderContextItem.swift b/submodules/TelegramUI/Components/SliderContextItem/Sources/SliderContextItem.swift index 16b3e0742e..5272830366 100644 --- a/submodules/TelegramUI/Components/SliderContextItem/Sources/SliderContextItem.swift +++ b/submodules/TelegramUI/Components/SliderContextItem/Sources/SliderContextItem.swift @@ -27,7 +27,7 @@ public final class SliderContextItem: ContextMenuCustomItem { private let textFont = Font.with(size: 17.0, design: .regular, traits: .monospacedNumbers) -private final class SliderContextItemNode: ASDisplayNode, ContextMenuCustomNode { +private final class SliderContextItemNode: ASDisplayNode, ContextMenuCustomNode, UIGestureRecognizerDelegate { private var presentationData: PresentationData private(set) var vibrancyEffectView: UIVisualEffectView? @@ -122,6 +122,8 @@ private final class SliderContextItemNode: ASDisplayNode, ContextMenuCustomNode override func didLoad() { super.didLoad() + self.view.disablesInteractiveTransitionGestureRecognizer = true + if let vibrancyEffectView = self.vibrancyEffectView { Queue.mainQueue().after(0.05) { if let effectNode = findEffectNode(node: self.supernode) { @@ -132,6 +134,7 @@ private final class SliderContextItemNode: ASDisplayNode, ContextMenuCustomNode } let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.panGesture(_:))) + panGestureRecognizer.delegate = self self.view.addGestureRecognizer(panGestureRecognizer) let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:))) @@ -201,7 +204,7 @@ private final class SliderContextItemNode: ASDisplayNode, ContextMenuCustomNode self.updateValue(transition: transition) }) } - + @objc private func panGesture(_ gestureRecognizer: UIPanGestureRecognizer) { let range = self.maxValue - self.minValue switch gestureRecognizer.state { diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift index 9f87f054d1..c509dd2235 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift @@ -5620,8 +5620,7 @@ public final class StoryItemSetContainerComponent: Component { guard let self else { return } - //TODO:localize - self.presentStoriesUpgradeScreen(source: .storiesStealthMode) + self.presentStoriesUpgradeScreen(source: .storiesHigherQuality) }) } diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Perk/MessageTags.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Premium/Perk/MessageTags.imageset/Contents.json new file mode 100644 index 0000000000..1e34c1570c --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Premium/Perk/MessageTags.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "tag_30 (2).pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Perk/MessageTags.imageset/tag_30 (2).pdf b/submodules/TelegramUI/Images.xcassets/Premium/Perk/MessageTags.imageset/tag_30 (2).pdf new file mode 100644 index 0000000000..a815495248 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Premium/Perk/MessageTags.imageset/tag_30 (2).pdf @@ -0,0 +1,164 @@ +%PDF-1.7 + +1 0 obj + << /Type /XObject + /Length 2 0 R + /Group << /Type /Group + /S /Transparency + >> + /Subtype /Form + /Resources << >> + /BBox [ 0.000000 0.000000 30.000000 30.000000 ] + >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 5.406738 8.000000 cm +0.000000 0.000000 0.000000 scn +16.973253 11.854660 m +19.015503 9.069774 l +19.918947 7.837805 19.918947 6.162195 19.015503 4.930227 c +16.973253 2.145341 l +15.984283 0.796747 14.411980 0.000000 12.739626 0.000000 c +3.500002 0.000000 l +1.567005 0.000000 0.000000 1.567004 0.000000 3.500001 c +0.000000 10.500000 l +0.000000 12.432997 1.567003 14.000000 3.500000 14.000000 c +12.739625 14.000000 l +14.411979 14.000000 15.984283 13.203254 16.973253 11.854660 c +h +14.350163 5.250000 m +15.316662 5.250000 16.100163 6.033502 16.100163 7.000000 c +16.100163 7.966498 15.316662 8.750000 14.350163 8.750000 c +13.383665 8.750000 12.600163 7.966498 12.600163 7.000000 c +12.600163 6.033502 13.383665 5.250000 14.350163 5.250000 c +h +f* +n +Q + +endstream +endobj + +2 0 obj + 809 +endobj + +3 0 obj + << /Type /XObject + /Length 4 0 R + /Group << /Type /Group + /S /Transparency + >> + /Subtype /Form + /Resources << >> + /BBox [ 0.000000 0.000000 30.000000 30.000000 ] + >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.000000 0.000000 0.000000 scn +0.000000 18.799999 m +0.000000 22.720367 0.000000 24.680552 0.762954 26.177933 c +1.434068 27.495068 2.504932 28.565931 3.822066 29.237045 c +5.319448 30.000000 7.279633 30.000000 11.200000 30.000000 c +18.799999 30.000000 l +22.720367 30.000000 24.680552 30.000000 26.177933 29.237045 c +27.495068 28.565931 28.565931 27.495068 29.237045 26.177933 c +30.000000 24.680552 30.000000 22.720367 30.000000 18.799999 c +30.000000 11.200001 l +30.000000 7.279633 30.000000 5.319448 29.237045 3.822067 c +28.565931 2.504932 27.495068 1.434069 26.177933 0.762955 c +24.680552 0.000000 22.720367 0.000000 18.799999 0.000000 c +11.200000 0.000000 l +7.279633 0.000000 5.319448 0.000000 3.822066 0.762955 c +2.504932 1.434069 1.434068 2.504932 0.762954 3.822067 c +0.000000 5.319448 0.000000 7.279633 0.000000 11.200001 c +0.000000 18.799999 l +h +f +n +Q + +endstream +endobj + +4 0 obj + 944 +endobj + +5 0 obj + << /XObject << /X1 1 0 R >> + /ExtGState << /E1 << /SMask << /Type /Mask + /G 3 0 R + /S /Alpha + >> + /Type /ExtGState + >> >> + >> +endobj + +6 0 obj + << /Length 7 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +/E1 gs +/X1 Do +Q + +endstream +endobj + +7 0 obj + 46 +endobj + +8 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 30.000000 30.000000 ] + /Resources 5 0 R + /Contents 6 0 R + /Parent 9 0 R + >> +endobj + +9 0 obj + << /Kids [ 8 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +10 0 obj + << /Pages 9 0 R + /Type /Catalog + >> +endobj + +xref +0 11 +0000000000 65535 f +0000000010 00000 n +0000001067 00000 n +0000001089 00000 n +0000002281 00000 n +0000002303 00000 n +0000002601 00000 n +0000002703 00000 n +0000002724 00000 n +0000002897 00000 n +0000002971 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 10 0 R + /Size 11 +>> +startxref +3031 +%%EOF \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Stories/Quality.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Premium/Stories/Quality.imageset/Contents.json new file mode 100644 index 0000000000..8f8aeb69e9 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Premium/Stories/Quality.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "hd_30.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Stories/Quality.imageset/hd_30.pdf b/submodules/TelegramUI/Images.xcassets/Premium/Stories/Quality.imageset/hd_30.pdf new file mode 100644 index 0000000000..fd38ff5908 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Premium/Stories/Quality.imageset/hd_30.pdf @@ -0,0 +1,161 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 3.084961 4.960083 cm +0.000000 0.000000 0.000000 scn +6.665000 20.079956 m +6.635606 20.079956 l +6.635600 20.079956 l +5.610404 20.079960 4.800312 20.079964 4.147855 20.026657 c +3.481411 19.972206 2.921088 19.858839 2.410632 19.598749 c +1.579897 19.175468 0.904487 18.500059 0.481207 17.669323 c +0.221116 17.158869 0.107750 16.598545 0.053300 15.932100 c +-0.000008 15.279644 -0.000005 14.469551 0.000000 13.444355 c +0.000000 13.444349 l +0.000000 13.414955 l +0.000000 6.664956 l +0.000000 6.635563 l +-0.000005 5.610363 -0.000008 4.800270 0.053300 4.147811 c +0.107750 3.481365 0.221116 2.921043 0.481207 2.410587 c +0.904487 1.579851 1.579897 0.904442 2.410632 0.481161 c +2.921088 0.221071 3.481411 0.107704 4.147856 0.053255 c +4.800318 -0.000055 5.610417 -0.000051 6.635624 -0.000046 c +6.665001 -0.000046 l +17.165001 -0.000046 l +17.194378 -0.000046 l +18.219585 -0.000051 19.029684 -0.000055 19.682146 0.053255 c +20.348591 0.107704 20.908913 0.221071 21.419369 0.481161 c +22.250105 0.904442 22.925514 1.579851 23.348795 2.410587 c +23.608885 2.921043 23.722252 3.481365 23.776701 4.147811 c +23.830011 4.800273 23.830008 5.610373 23.830002 6.635580 c +23.830002 6.664956 l +23.830002 13.414955 l +23.830002 13.444332 l +23.830008 14.469540 23.830011 15.279638 23.776701 15.932100 c +23.722252 16.598545 23.608885 17.158869 23.348795 17.669323 c +22.925514 18.500059 22.250105 19.175468 21.419369 19.598749 c +20.908913 19.858839 20.348591 19.972206 19.682146 20.026657 c +19.029688 20.079964 18.219595 20.079960 17.194395 20.079956 c +17.165001 20.079956 l +6.665000 20.079956 l +h +3.014440 18.413712 m +3.306153 18.562346 3.671964 18.653343 4.256160 18.701073 c +4.848119 18.749439 5.603929 18.749956 6.665000 18.749956 c +17.165001 18.749956 l +18.226072 18.749956 18.981882 18.749439 19.573841 18.701073 c +20.158037 18.653343 20.523848 18.562346 20.815561 18.413712 c +21.396042 18.117941 21.867987 17.645996 22.163755 17.065517 c +22.312391 16.773804 22.403387 16.407993 22.451118 15.823796 c +22.499483 15.231836 22.500000 14.476027 22.500000 13.414955 c +22.500000 6.664956 l +22.500000 5.603885 22.499483 4.848075 22.451118 4.256116 c +22.403387 3.671919 22.312391 3.306108 22.163755 3.014395 c +21.867987 2.433914 21.396042 1.961969 20.815561 1.666201 c +20.523848 1.517565 20.158037 1.426569 19.573841 1.378838 c +18.981882 1.330473 18.226072 1.329956 17.165001 1.329956 c +6.665001 1.329956 l +5.603929 1.329956 4.848119 1.330473 4.256160 1.378838 c +3.671964 1.426569 3.306153 1.517565 3.014440 1.666201 c +2.433959 1.961969 1.962015 2.433914 1.666245 3.014395 c +1.517610 3.306108 1.426613 3.671919 1.378883 4.256116 c +1.330518 4.848075 1.330000 5.603885 1.330000 6.664956 c +1.330000 13.414955 l +1.330000 14.476027 1.330518 15.231836 1.378883 15.823796 c +1.426613 16.407993 1.517610 16.773804 1.666245 17.065517 c +1.962015 17.645996 2.433959 18.117941 3.014440 18.413712 c +h +3.975623 6.325036 m +3.975623 5.885583 4.231971 5.617028 4.659217 5.617028 c +5.080359 5.617028 5.342811 5.885583 5.342811 6.325036 c +5.342811 9.614831 l +9.865516 9.614831 l +9.865516 6.325036 l +9.865516 5.885583 10.121863 5.617028 10.549109 5.617028 c +10.970252 5.617028 11.232703 5.885583 11.232703 6.325036 c +11.232703 13.911706 l +11.232703 14.351159 10.970252 14.619714 10.549109 14.619714 c +10.121863 14.619714 9.865516 14.351159 9.865516 13.911706 c +9.865516 10.798913 l +5.342811 10.798913 l +5.342811 13.911706 l +5.342811 14.351159 5.080359 14.619714 4.659217 14.619714 c +4.231971 14.619714 3.975623 14.351159 3.975623 13.911706 c +3.975623 6.325036 l +h +12.752635 6.422692 m +12.752635 5.983239 13.008983 5.714684 13.436229 5.714684 c +15.859324 5.714684 l +18.483837 5.714684 20.028027 7.350427 20.028027 10.133630 c +20.028027 12.910729 18.477734 14.522058 15.859324 14.522058 c +13.436229 14.522058 l +13.008983 14.522058 12.752635 14.253503 12.752635 13.814050 c +12.752635 6.422692 l +h +15.731151 6.898767 m +14.119823 6.898767 l +14.119823 13.344079 l +15.731151 13.344079 l +17.592724 13.344079 18.630322 12.196618 18.630322 10.121423 c +18.630322 8.040124 17.598827 6.898767 15.731151 6.898767 c +h +f* +n +Q + +endstream +endobj + +3 0 obj + 4117 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 30.000000 30.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000004207 00000 n +0000004230 00000 n +0000004403 00000 n +0000004477 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +4536 +%%EOF \ No newline at end of file diff --git a/submodules/TelegramUI/Sources/Chat/ChatControllerOpenMessageContextMenu.swift b/submodules/TelegramUI/Sources/Chat/ChatControllerOpenMessageContextMenu.swift index 9de0e8ea36..99e5dc4661 100644 --- a/submodules/TelegramUI/Sources/Chat/ChatControllerOpenMessageContextMenu.swift +++ b/submodules/TelegramUI/Sources/Chat/ChatControllerOpenMessageContextMenu.swift @@ -317,8 +317,8 @@ extension ChatControllerImpl { let context = self.context var replaceImpl: ((ViewController) -> Void)? - let controller = PremiumDemoScreen(context: context, subject: .uniqueReactions, action: { - let controller = PremiumIntroScreen(context: context, source: .reactions) + let controller = PremiumDemoScreen(context: context, subject: .messageTags, action: { + let controller = PremiumIntroScreen(context: context, source: .messageTags) replaceImpl?(controller) }) replaceImpl = { [weak controller] c in diff --git a/submodules/TelegramUI/Sources/ChatControllerOpenMessageReactionContextMenu.swift b/submodules/TelegramUI/Sources/ChatControllerOpenMessageReactionContextMenu.swift index 02a017c5ab..390195a52c 100644 --- a/submodules/TelegramUI/Sources/ChatControllerOpenMessageReactionContextMenu.swift +++ b/submodules/TelegramUI/Sources/ChatControllerOpenMessageReactionContextMenu.swift @@ -21,8 +21,8 @@ extension ChatControllerImpl { //TODO:localize let context = self.context var replaceImpl: ((ViewController) -> Void)? - let controller = PremiumDemoScreen(context: context, subject: .uniqueReactions, action: { - let controller = PremiumIntroScreen(context: context, source: .reactions) + let controller = PremiumDemoScreen(context: context, subject: .messageTags, action: { + let controller = PremiumIntroScreen(context: context, source: .messageTags) replaceImpl?(controller) }) replaceImpl = { [weak controller] c in diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index 385b3884a3..474592bfa7 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -1938,6 +1938,8 @@ public final class SharedAccountContextImpl: SharedAccountContext { mappedSource = .storiesExpirationDurations case .storiesSuggestedReactions: mappedSource = .storiesSuggestedReactions + case .storiesHigherQuality: + mappedSource = .storiesHigherQuality case let .channelBoost(peerId): mappedSource = .channelBoost(peerId) case .nameColor: @@ -1950,6 +1952,8 @@ public final class SharedAccountContextImpl: SharedAccountContext { mappedSource = .presence case .readTime: mappedSource = .readTime + case .messageTags: + mappedSource = .messageTags } let controller = PremiumIntroScreen(context: context, modal: modal, source: mappedSource, forceDark: forceDark) controller.wasDismissed = dismissed @@ -1993,6 +1997,8 @@ public final class SharedAccountContextImpl: SharedAccountContext { mappedSubject = .colors case .wallpapers: mappedSubject = .wallpapers + case .messageTags: + mappedSubject = .messageTags } return PremiumDemoScreen(context: context, subject: mappedSubject, action: action) }