mirror of
https://github.com/TelegramMessenger/Telegram-iOS.git
synced 2026-07-06 03:33:41 +02:00
Serialization update
This commit is contained in:
parent
f370102e44
commit
6c4070eb52
98 changed files with 1332 additions and 759 deletions
|
|
@ -36,22 +36,22 @@ public final class ReactionItem {
|
|||
}
|
||||
|
||||
public let reaction: ReactionItem.Reaction
|
||||
public let appearAnimation: TelegramMediaFile
|
||||
public let stillAnimation: TelegramMediaFile
|
||||
public let listAnimation: TelegramMediaFile
|
||||
public let largeListAnimation: TelegramMediaFile
|
||||
public let applicationAnimation: TelegramMediaFile?
|
||||
public let largeApplicationAnimation: TelegramMediaFile?
|
||||
public let appearAnimation: TelegramMediaFile.Accessor
|
||||
public let stillAnimation: TelegramMediaFile.Accessor
|
||||
public let listAnimation: TelegramMediaFile.Accessor
|
||||
public let largeListAnimation: TelegramMediaFile.Accessor
|
||||
public let applicationAnimation: TelegramMediaFile.Accessor?
|
||||
public let largeApplicationAnimation: TelegramMediaFile.Accessor?
|
||||
public let isCustom: Bool
|
||||
|
||||
public init(
|
||||
reaction: ReactionItem.Reaction,
|
||||
appearAnimation: TelegramMediaFile,
|
||||
stillAnimation: TelegramMediaFile,
|
||||
listAnimation: TelegramMediaFile,
|
||||
largeListAnimation: TelegramMediaFile,
|
||||
applicationAnimation: TelegramMediaFile?,
|
||||
largeApplicationAnimation: TelegramMediaFile?,
|
||||
appearAnimation: TelegramMediaFile.Accessor,
|
||||
stillAnimation: TelegramMediaFile.Accessor,
|
||||
listAnimation: TelegramMediaFile.Accessor,
|
||||
largeListAnimation: TelegramMediaFile.Accessor,
|
||||
applicationAnimation: TelegramMediaFile.Accessor?,
|
||||
largeApplicationAnimation: TelegramMediaFile.Accessor?,
|
||||
isCustom: Bool
|
||||
) {
|
||||
self.reaction = reaction
|
||||
|
|
@ -69,7 +69,7 @@ public final class ReactionItem {
|
|||
case let .builtin(value):
|
||||
return .builtin(value)
|
||||
case let .custom(fileId):
|
||||
return .custom(fileId: fileId, file: self.listAnimation)
|
||||
return .custom(fileId: fileId, file: self.listAnimation._parse())
|
||||
case .stars:
|
||||
return .stars
|
||||
}
|
||||
|
|
@ -455,21 +455,18 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
|
||||
public static func randomGenericReactionEffect(context: AccountContext) -> Signal<String?, NoError> {
|
||||
return context.engine.stickers.loadedStickerPack(reference: .emojiGenericAnimations, forceActualized: false)
|
||||
|> map { result -> [TelegramMediaFile]? in
|
||||
|> map { result -> TelegramMediaFile? in
|
||||
switch result {
|
||||
case let .result(_, items, _):
|
||||
return items.map(\.file)
|
||||
return items.randomElement()?.file._parse()
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|> filter { $0 != nil }
|
||||
|> take(1)
|
||||
|> mapToSignal { items -> Signal<String?, NoError> in
|
||||
guard let items = items else {
|
||||
return .single(nil)
|
||||
}
|
||||
guard let file = items.randomElement() else {
|
||||
|> mapToSignal { file -> Signal<String?, NoError> in
|
||||
guard let file else {
|
||||
return .single(nil)
|
||||
}
|
||||
return Signal { subscriber in
|
||||
|
|
@ -643,14 +640,9 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
let filterList: [String] = ["😖", "😫", "🫠", "😨", "❓"]
|
||||
for featuredEmojiPack in view.items.lazy.map({ $0.contents.get(FeaturedStickerPackItem.self)! }) {
|
||||
for item in featuredEmojiPack.topItems {
|
||||
for attribute in item.file.attributes {
|
||||
switch attribute {
|
||||
case let .CustomEmoji(_, _, alt, _):
|
||||
if filterList.contains(alt) {
|
||||
filteredFiles.append(item.file)
|
||||
}
|
||||
default:
|
||||
break
|
||||
if let alt = item.file.customEmojiAlt {
|
||||
if filterList.contains(alt) {
|
||||
filteredFiles.append(item.file._parse())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1687,9 +1679,9 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
)
|
||||
|
||||
if case .locked = item.icon {
|
||||
strongSelf.premiumReactionsSelected?(reactionItem.stillAnimation)
|
||||
strongSelf.premiumReactionsSelected?(reactionItem.stillAnimation._parse())
|
||||
} else if strongSelf.reactionsLocked {
|
||||
strongSelf.premiumReactionsSelected?(reactionItem.stillAnimation)
|
||||
strongSelf.premiumReactionsSelected?(reactionItem.stillAnimation._parse())
|
||||
} else {
|
||||
strongSelf.customReactionSource = (sourceView, sourceRect, sourceLayer, reactionItem)
|
||||
strongSelf.reactionSelected?(updateReaction, isLongPress)
|
||||
|
|
@ -1711,9 +1703,9 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
)
|
||||
strongSelf.customReactionSource = (sourceView, sourceRect, sourceLayer, reactionItem)
|
||||
if case .locked = item.icon {
|
||||
strongSelf.premiumReactionsSelected?(reactionItem.stillAnimation)
|
||||
strongSelf.premiumReactionsSelected?(reactionItem.stillAnimation._parse())
|
||||
} else if strongSelf.reactionsLocked {
|
||||
strongSelf.premiumReactionsSelected?(reactionItem.stillAnimation)
|
||||
strongSelf.premiumReactionsSelected?(reactionItem.stillAnimation._parse())
|
||||
} else {
|
||||
strongSelf.reactionSelected?(reactionItem.updateMessageReaction, isLongPress)
|
||||
}
|
||||
|
|
@ -1925,11 +1917,11 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
}
|
||||
}
|
||||
|
||||
let animationData = EntityKeyboardAnimationData(file: itemFile, partialReference: .none)
|
||||
let animationData = EntityKeyboardAnimationData(file: TelegramMediaFile.Accessor(itemFile), partialReference: .none)
|
||||
let resultItem = EmojiPagerContentComponent.Item(
|
||||
animationData: animationData,
|
||||
content: .animation(animationData),
|
||||
itemFile: itemFile,
|
||||
itemFile: TelegramMediaFile.Accessor(itemFile),
|
||||
subgroupId: nil,
|
||||
icon: icon,
|
||||
tintMode: tintMode
|
||||
|
|
@ -2037,7 +2029,7 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
localPacksSignal
|
||||
)
|
||||
|> map { view, availableReactions, hasPremium, foundPacks, foundEmoji, foundLocalPacks -> [EmojiPagerContentComponent.ItemGroup] in
|
||||
var result: [(String, TelegramMediaFile?, String)] = []
|
||||
var result: [(String, TelegramMediaFile.Accessor?, String)] = []
|
||||
|
||||
var allEmoticons: [String: String] = [:]
|
||||
for keyword in keywords {
|
||||
|
|
@ -2051,9 +2043,9 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
switch attribute {
|
||||
case let .CustomEmoji(_, _, alt, _):
|
||||
if !alt.isEmpty, let keyword = allEmoticons[alt] {
|
||||
result.append((alt, itemFile, keyword))
|
||||
result.append((alt, TelegramMediaFile.Accessor(itemFile), keyword))
|
||||
} else if alt == query {
|
||||
result.append((alt, itemFile, alt))
|
||||
result.append((alt, TelegramMediaFile.Accessor(itemFile), alt))
|
||||
}
|
||||
default:
|
||||
break
|
||||
|
|
@ -2065,18 +2057,13 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
guard let item = entry.item as? StickerPackItem else {
|
||||
continue
|
||||
}
|
||||
for attribute in item.file.attributes {
|
||||
switch attribute {
|
||||
case let .CustomEmoji(_, _, alt, _):
|
||||
if !item.file.isPremiumEmoji {
|
||||
if !alt.isEmpty, let keyword = allEmoticons[alt] {
|
||||
result.append((alt, item.file, keyword))
|
||||
} else if alt == query {
|
||||
result.append((alt, item.file, alt))
|
||||
}
|
||||
if !item.file.isPremiumEmoji {
|
||||
if let alt = item.file.customEmojiAlt {
|
||||
if !alt.isEmpty, let keyword = allEmoticons[alt] {
|
||||
result.append((alt, item.file, keyword))
|
||||
} else if alt == query {
|
||||
result.append((alt, item.file, alt))
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2294,11 +2281,11 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
}
|
||||
}
|
||||
|
||||
let animationData = EntityKeyboardAnimationData(file: itemFile, partialReference: .none)
|
||||
let animationData = EntityKeyboardAnimationData(file: TelegramMediaFile.Accessor(itemFile), partialReference: .none)
|
||||
let resultItem = EmojiPagerContentComponent.Item(
|
||||
animationData: animationData,
|
||||
content: .animation(animationData),
|
||||
itemFile: itemFile,
|
||||
itemFile: TelegramMediaFile.Accessor(itemFile),
|
||||
subgroupId: nil,
|
||||
icon: icon,
|
||||
tintMode: tintMode
|
||||
|
|
@ -2351,11 +2338,12 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
continue
|
||||
}
|
||||
existingIds.insert(itemFile.fileId)
|
||||
let animationData = EntityKeyboardAnimationData(file: itemFile)
|
||||
let animationData = EntityKeyboardAnimationData(file: TelegramMediaFile.Accessor(itemFile))
|
||||
let item = EmojiPagerContentComponent.Item(
|
||||
animationData: animationData,
|
||||
content: .animation(animationData),
|
||||
itemFile: itemFile, subgroupId: nil,
|
||||
itemFile: TelegramMediaFile.Accessor(itemFile),
|
||||
subgroupId: nil,
|
||||
icon: .none,
|
||||
tintMode: animationData.isTemplate ? .primary : .none
|
||||
)
|
||||
|
|
@ -2729,25 +2717,20 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
let additionalAnimationNode: DefaultAnimatedStickerNodeImpl?
|
||||
var genericAnimationView: AnimationView?
|
||||
|
||||
var additionalAnimation: TelegramMediaFile?
|
||||
var additionalAnimation: TelegramMediaFile.Accessor?
|
||||
if self.didTriggerExpandedReaction {
|
||||
additionalAnimation = itemNode.item.largeApplicationAnimation
|
||||
} else {
|
||||
additionalAnimation = itemNode.item.applicationAnimation
|
||||
|
||||
if additionalAnimation == nil && itemNode.item.isCustom {
|
||||
outer: for attribute in itemNode.item.stillAnimation.attributes {
|
||||
if case let .CustomEmoji(_, _, alt, _) = attribute {
|
||||
if let availableReactions = self.availableReactions {
|
||||
for availableReaction in availableReactions.reactions {
|
||||
if availableReaction.value == .builtin(alt) {
|
||||
additionalAnimation = availableReaction.aroundAnimation
|
||||
break outer
|
||||
}
|
||||
if let alt = itemNode.item.stillAnimation.customEmojiAlt {
|
||||
if let availableReactions = self.availableReactions {
|
||||
for availableReaction in availableReactions.reactions {
|
||||
if availableReaction.value == .builtin(alt) {
|
||||
additionalAnimation = availableReaction.aroundAnimation
|
||||
}
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2762,7 +2745,8 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
}
|
||||
}
|
||||
|
||||
additionalAnimationNodeValue.setup(source: AnimatedStickerResourceSource(account: itemNode.context.account, resource: additionalAnimation.resource), width: Int(effectFrame.width * 2.0), height: Int(effectFrame.height * 2.0), playbackMode: .once, mode: .direct(cachePathPrefix: self.context.account.postbox.mediaBox.shortLivedResourceCachePathPrefix(additionalAnimation.resource.id)))
|
||||
let additionalAnimationFile = additionalAnimation._parse()
|
||||
additionalAnimationNodeValue.setup(source: AnimatedStickerResourceSource(account: itemNode.context.account, resource: additionalAnimationFile.resource), width: Int(effectFrame.width * 2.0), height: Int(effectFrame.height * 2.0), playbackMode: .once, mode: .direct(cachePathPrefix: self.context.account.postbox.mediaBox.shortLivedResourceCachePathPrefix(additionalAnimationFile.resource.id)))
|
||||
additionalAnimationNodeValue.frame = effectFrame
|
||||
additionalAnimationNodeValue.updateLayout(size: effectFrame.size)
|
||||
self.addSubnode(additionalAnimationNodeValue)
|
||||
|
|
@ -2799,13 +2783,14 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
|
||||
for i in 1 ... 32 {
|
||||
let allLayers = view.allLayers(forKeypath: AnimationKeypath(keypath: "placeholder_\(i)"))
|
||||
let itemNodeListAnimationFile = itemNode.item.listAnimation._parse()
|
||||
for animationLayer in allLayers {
|
||||
let baseItemLayer = InlineStickerItemLayer(
|
||||
context: itemNode.context,
|
||||
userLocation: .other,
|
||||
attemptSynchronousLoad: false,
|
||||
emoji: ChatTextInputTextCustomEmojiAttribute(interactivelySelectedFromPackId: nil, fileId: itemNode.item.listAnimation.fileId.id, file: itemNode.item.listAnimation),
|
||||
file: itemNode.item.listAnimation,
|
||||
emoji: ChatTextInputTextCustomEmojiAttribute(interactivelySelectedFromPackId: nil, fileId: itemNode.item.listAnimation.fileId.id, file: itemNodeListAnimationFile),
|
||||
file: itemNodeListAnimationFile,
|
||||
cache: animationCache,
|
||||
renderer: animationRenderer,
|
||||
placeholderColor: UIColor(white: 0.0, alpha: 0.0),
|
||||
|
|
@ -3083,11 +3068,11 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
switch reaction {
|
||||
case let .reaction(reactionItem, icon):
|
||||
if case .custom = reactionItem.updateMessageReaction, let hasPremium = self.hasPremium, !hasPremium, !self.allPresetReactionsAreAvailable {
|
||||
self.premiumReactionsSelected?(reactionItem.stillAnimation)
|
||||
self.premiumReactionsSelected?(reactionItem.stillAnimation._parse())
|
||||
} else if self.reactionsLocked {
|
||||
self.premiumReactionsSelected?(reactionItem.stillAnimation)
|
||||
self.premiumReactionsSelected?(reactionItem.stillAnimation._parse())
|
||||
} else if case .locked = icon {
|
||||
self.premiumReactionsSelected?(reactionItem.stillAnimation)
|
||||
self.premiumReactionsSelected?(reactionItem.stillAnimation._parse())
|
||||
} else {
|
||||
self.reactionSelected?(reactionItem.updateMessageReaction, false)
|
||||
}
|
||||
|
|
@ -3274,9 +3259,9 @@ public final class ReactionContextNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
for (_, itemNode) in self.visibleItemNodes {
|
||||
if let itemNode = itemNode as? ReactionNode, itemNode.item.reaction == reaction {
|
||||
if case .custom = itemNode.item.updateMessageReaction, let hasPremium = self.hasPremium, !hasPremium {
|
||||
self.premiumReactionsSelected?(itemNode.item.stillAnimation)
|
||||
self.premiumReactionsSelected?(itemNode.item.stillAnimation._parse())
|
||||
} else if self.reactionsLocked {
|
||||
self.premiumReactionsSelected?(itemNode.item.stillAnimation)
|
||||
self.premiumReactionsSelected?(itemNode.item.stillAnimation._parse())
|
||||
} else {
|
||||
self.reactionSelected?(itemNode.item.updateMessageReaction, isLarge)
|
||||
}
|
||||
|
|
@ -3450,11 +3435,11 @@ public final class StandaloneReactionAnimation: ASDisplayNode {
|
|||
|
||||
var additionalAnimationResource: MediaResource?
|
||||
if isLarge && !forceSmallEffectAnimation {
|
||||
additionalAnimationResource = reaction.largeApplicationAnimation?.resource
|
||||
additionalAnimationResource = reaction.largeApplicationAnimation?._parse().resource
|
||||
} else if case .stars = reaction.reaction.rawValue {
|
||||
additionalAnimationResource = reaction.largeApplicationAnimation?.resource ?? reaction.applicationAnimation?.resource
|
||||
additionalAnimationResource = reaction.largeApplicationAnimation?._parse().resource ?? reaction.applicationAnimation?._parse().resource
|
||||
} else {
|
||||
additionalAnimationResource = reaction.applicationAnimation?.resource
|
||||
additionalAnimationResource = reaction.applicationAnimation?._parse().resource
|
||||
}
|
||||
if additionalAnimationResource == nil, let customEffectResource {
|
||||
additionalAnimationResource = customEffectResource
|
||||
|
|
@ -3540,12 +3525,13 @@ public final class StandaloneReactionAnimation: ASDisplayNode {
|
|||
for i in 1 ... 7 {
|
||||
let allLayers = view.allLayers(forKeypath: AnimationKeypath(keypath: "placeholder_\(i)"))
|
||||
for animationLayer in allLayers {
|
||||
let itemListAnimationFile = reaction.listAnimation._parse()
|
||||
let baseItemLayer = InlineStickerItemLayer(
|
||||
context: context,
|
||||
userLocation: .other,
|
||||
attemptSynchronousLoad: false,
|
||||
emoji: ChatTextInputTextCustomEmojiAttribute(interactivelySelectedFromPackId: nil, fileId: reaction.listAnimation.fileId.id, file: reaction.listAnimation),
|
||||
file: reaction.listAnimation,
|
||||
emoji: ChatTextInputTextCustomEmojiAttribute(interactivelySelectedFromPackId: nil, fileId: reaction.listAnimation.fileId.id, file: itemListAnimationFile),
|
||||
file: itemListAnimationFile,
|
||||
cache: animationCache,
|
||||
renderer: animationRenderer,
|
||||
placeholderColor: UIColor(white: 0.0, alpha: 0.0),
|
||||
|
|
@ -3898,9 +3884,9 @@ public final class StandaloneReactionAnimation: ASDisplayNode {
|
|||
|
||||
var additionalAnimation: TelegramMediaFile?
|
||||
if didTriggerExpandedReaction {
|
||||
additionalAnimation = item.largeApplicationAnimation
|
||||
additionalAnimation = item.largeApplicationAnimation?._parse()
|
||||
} else {
|
||||
additionalAnimation = item.applicationAnimation
|
||||
additionalAnimation = item.applicationAnimation?._parse()
|
||||
}
|
||||
|
||||
if let additionalAnimation = additionalAnimation {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue