diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index 35efd8da13..28071a2012 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -1891,7 +1891,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController if let mediaId = info.media.id { validIds.append(mediaId) if self.preloadStoryResourceDisposables[mediaId] == nil { - self.preloadStoryResourceDisposables[mediaId] = preloadStoryMedia(context: self.context, peer: info.peer, storyId: info.storyId, media: info.media, reactions: info.reactions).startStrict() + self.preloadStoryResourceDisposables[mediaId] = preloadStoryMedia(context: self.context, info: info).startStrict() } } } diff --git a/submodules/DebugSettingsUI/Sources/DebugController.swift b/submodules/DebugSettingsUI/Sources/DebugController.swift index d36df09e47..c9f31be081 100644 --- a/submodules/DebugSettingsUI/Sources/DebugController.swift +++ b/submodules/DebugSettingsUI/Sources/DebugController.swift @@ -73,7 +73,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { case skipReadHistory(PresentationTheme, Bool) case unidirectionalSwipeToReply(Bool) case dustEffect(Bool) - case callUIV2(Bool) + case alternativeStoryMedia(Bool) case crashOnSlowQueries(PresentationTheme, Bool) case crashOnMemoryPressure(PresentationTheme, Bool) case clearTips(PresentationTheme) @@ -125,7 +125,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { return DebugControllerSection.logging.rawValue case .webViewInspection, .resetWebViewCache: return DebugControllerSection.web.rawValue - case .keepChatNavigationStack, .skipReadHistory, .unidirectionalSwipeToReply, .dustEffect, .callUIV2, .crashOnSlowQueries, .crashOnMemoryPressure: + case .keepChatNavigationStack, .skipReadHistory, .unidirectionalSwipeToReply, .dustEffect, .alternativeStoryMedia, .crashOnSlowQueries, .crashOnMemoryPressure: return DebugControllerSection.experiments.rawValue case .clearTips, .resetNotifications, .crash, .resetData, .resetDatabase, .resetDatabaseAndCache, .resetHoles, .reindexUnread, .resetCacheIndex, .reindexCache, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .storiesExperiment, .storiesJpegExperiment, .playlistPlayback, .enableQuickReactionSwitch, .voiceConference, .experimentalCompatibility, .enableDebugDataDisplay, .acceleratedStickers, .inlineForums, .localTranscription, .enableReactionOverrides, .restorePurchases: return DebugControllerSection.experiments.rawValue @@ -180,7 +180,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { return 17 case .dustEffect: return 18 - case .callUIV2: + case .alternativeStoryMedia: return 19 case .crashOnSlowQueries: return 20 @@ -959,11 +959,11 @@ private enum DebugControllerEntry: ItemListNodeEntry { return settings }).start() }) - case let .callUIV2(value): - return ItemListSwitchItem(presentationData: presentationData, title: "Call UI V2", value: value, sectionId: self.section, style: .blocks, updated: { value in + case let .alternativeStoryMedia(value): + return ItemListSwitchItem(presentationData: presentationData, title: "Story Data Saver", value: value, sectionId: self.section, style: .blocks, updated: { value in let _ = updateExperimentalUISettingsInteractively(accountManager: arguments.sharedContext.accountManager, { settings in var settings = settings - settings.callUIV2 = value + settings.alternativeStoryMedia = value return settings }).start() }) @@ -1427,7 +1427,7 @@ private func debugControllerEntries(sharedContext: SharedAccountContext, present #endif entries.append(.unidirectionalSwipeToReply(experimentalSettings.unidirectionalSwipeToReply)) entries.append(.dustEffect(experimentalSettings.dustEffect)) - entries.append(.callUIV2(experimentalSettings.callUIV2)) + entries.append(.alternativeStoryMedia(experimentalSettings.alternativeStoryMedia)) } entries.append(.crashOnSlowQueries(presentationData.theme, experimentalSettings.crashOnLongQueries)) entries.append(.crashOnMemoryPressure(presentationData.theme, experimentalSettings.crashOnMemoryPressure)) diff --git a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift index 6a49ad4c1e..9853581311 100644 --- a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift @@ -4638,6 +4638,7 @@ func replayFinalState( timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -4670,6 +4671,7 @@ func replayFinalState( timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, diff --git a/submodules/TelegramCore/Sources/Statistics/StoryStatistics.swift b/submodules/TelegramCore/Sources/Statistics/StoryStatistics.swift index 7ad981a2c4..1c0b69c35e 100644 --- a/submodules/TelegramCore/Sources/Statistics/StoryStatistics.swift +++ b/submodules/TelegramCore/Sources/Statistics/StoryStatistics.swift @@ -321,6 +321,7 @@ private final class StoryStatsPublicForwardsContextImpl { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/EngineStoryViewListContext.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/EngineStoryViewListContext.swift index 1764f9fb4f..8d5d80b1b3 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/EngineStoryViewListContext.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/EngineStoryViewListContext.swift @@ -528,6 +528,7 @@ public final class EngineStoryViewListContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -571,6 +572,7 @@ public final class EngineStoryViewListContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -609,6 +611,7 @@ public final class EngineStoryViewListContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -714,6 +717,7 @@ public final class EngineStoryViewListContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift index 53792f22db..22654b8f7d 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift @@ -244,6 +244,7 @@ public enum Stories { case timestamp case expirationTimestamp case media + case alternativeMedia case mediaAreas case text case entities @@ -266,6 +267,7 @@ public enum Stories { public let timestamp: Int32 public let expirationTimestamp: Int32 public let media: Media? + public let alternativeMedia: Media? public let mediaAreas: [MediaArea] public let text: String public let entities: [MessageTextEntity] @@ -288,6 +290,7 @@ public enum Stories { timestamp: Int32, expirationTimestamp: Int32, media: Media?, + alternativeMedia: Media?, mediaAreas: [MediaArea], text: String, entities: [MessageTextEntity], @@ -309,6 +312,7 @@ public enum Stories { self.timestamp = timestamp self.expirationTimestamp = expirationTimestamp self.media = media + self.alternativeMedia = alternativeMedia self.mediaAreas = mediaAreas self.text = text self.entities = entities @@ -339,6 +343,13 @@ public enum Stories { } else { self.media = nil } + + if let alternativeMediaData = try container.decodeIfPresent(Data.self, forKey: .alternativeMedia) { + self.alternativeMedia = PostboxDecoder(buffer: MemoryBuffer(data: alternativeMediaData)).decodeRootObject() as? Media + } else { + self.alternativeMedia = nil + } + self.mediaAreas = try container.decodeIfPresent([MediaArea].self, forKey: .mediaAreas) ?? [] self.text = try container.decode(String.self, forKey: .text) @@ -371,6 +382,14 @@ public enum Stories { let mediaData = encoder.makeData() try container.encode(mediaData, forKey: .media) } + + if let alternativeMedia = self.alternativeMedia { + let encoder = PostboxEncoder() + encoder.encodeRootObject(alternativeMedia) + let alternativeMediaData = encoder.makeData() + try container.encode(alternativeMediaData, forKey: .alternativeMedia) + } + try container.encode(self.mediaAreas, forKey: .mediaAreas) try container.encode(self.text, forKey: .text) @@ -410,6 +429,17 @@ public enum Stories { return false } } + + if let lhsAlternativeMedia = lhs.alternativeMedia, let rhsAlternativeMedia = rhs.alternativeMedia { + if !lhsAlternativeMedia.isEqual(to: rhsAlternativeMedia) { + return false + } + } else { + if (lhs.alternativeMedia == nil) != (rhs.alternativeMedia == nil) { + return false + } + } + if lhs.mediaAreas != rhs.mediaAreas { return false } @@ -1153,6 +1183,7 @@ func _internal_uploadStoryImpl( timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -1334,6 +1365,7 @@ func _internal_editStoryPrivacy(account: Account, id: Int32, privacy: EngineStor timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -1364,6 +1396,7 @@ func _internal_editStoryPrivacy(account: Account, id: Int32, privacy: EngineStor timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -1557,6 +1590,7 @@ func _internal_updateStoriesArePinned(account: Account, peerId: PeerId, ids: [In timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -1586,6 +1620,7 @@ func _internal_updateStoriesArePinned(account: Account, peerId: PeerId, ids: [In timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -1774,11 +1809,22 @@ extension Stories.StoredItem { mergedForwardInfo = forwardFrom.flatMap(Stories.Item.ForwardInfo.init(apiForwardInfo:)) } + var parsedAlternativeMedia: Media? + switch media { + case let .messageMediaDocument(_, _, altDocument, _): + if let altDocument = altDocument { + parsedAlternativeMedia = telegramMediaFileFromApiDocument(altDocument) + } + default: + break + } + let item = Stories.Item( id: id, timestamp: date, expirationTimestamp: expireDate, media: parsedMedia, + alternativeMedia: parsedAlternativeMedia, mediaAreas: mediaAreas?.compactMap(mediaAreaFromApiMediaArea) ?? [], text: caption ?? "", entities: entities.flatMap { entities in return messageTextEntitiesFromApiEntities(entities) } ?? [], @@ -1842,6 +1888,7 @@ func _internal_getStoryById(accountPeerId: PeerId, postbox: Postbox, network: Ne timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -2323,6 +2370,7 @@ func _internal_setStoryReaction(account: Account, peerId: EnginePeer.Id, id: Int timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -2355,6 +2403,7 @@ func _internal_setStoryReaction(account: Account, peerId: EnginePeer.Id, id: Int timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift index 07d8b77419..6f9d330c65 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift @@ -60,6 +60,7 @@ public final class EngineStoryItem: Equatable { public let timestamp: Int32 public let expirationTimestamp: Int32 public let media: EngineMedia + public let alternativeMedia: EngineMedia? public let mediaAreas: [MediaArea] public let text: String public let entities: [MessageTextEntity] @@ -78,11 +79,12 @@ public final class EngineStoryItem: Equatable { public let myReaction: MessageReaction.Reaction? public let forwardInfo: ForwardInfo? - public init(id: Int32, timestamp: Int32, expirationTimestamp: Int32, media: EngineMedia, mediaAreas: [MediaArea], text: String, entities: [MessageTextEntity], views: Views?, privacy: EngineStoryPrivacy?, isPinned: Bool, isExpired: Bool, isPublic: Bool, isPending: Bool, isCloseFriends: Bool, isContacts: Bool, isSelectedContacts: Bool, isForwardingDisabled: Bool, isEdited: Bool, isMy: Bool, myReaction: MessageReaction.Reaction?, forwardInfo: ForwardInfo?) { + public init(id: Int32, timestamp: Int32, expirationTimestamp: Int32, media: EngineMedia, alternativeMedia: EngineMedia?, mediaAreas: [MediaArea], text: String, entities: [MessageTextEntity], views: Views?, privacy: EngineStoryPrivacy?, isPinned: Bool, isExpired: Bool, isPublic: Bool, isPending: Bool, isCloseFriends: Bool, isContacts: Bool, isSelectedContacts: Bool, isForwardingDisabled: Bool, isEdited: Bool, isMy: Bool, myReaction: MessageReaction.Reaction?, forwardInfo: ForwardInfo?) { self.id = id self.timestamp = timestamp self.expirationTimestamp = expirationTimestamp self.media = media + self.alternativeMedia = alternativeMedia self.mediaAreas = mediaAreas self.text = text self.entities = entities @@ -115,6 +117,9 @@ public final class EngineStoryItem: Equatable { if lhs.media != rhs.media { return false } + if lhs.alternativeMedia != rhs.alternativeMedia { + return false + } if lhs.mediaAreas != rhs.mediaAreas { return false } @@ -188,6 +193,7 @@ public extension EngineStoryItem { timestamp: self.timestamp, expirationTimestamp: self.expirationTimestamp, media: self.media._asMedia(), + alternativeMedia: self.alternativeMedia?._asMedia(), mediaAreas: self.mediaAreas, text: self.text, entities: self.entities, @@ -566,6 +572,7 @@ public final class PeerStoryListContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -710,6 +717,7 @@ public final class PeerStoryListContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -871,6 +879,7 @@ public final class PeerStoryListContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -918,6 +927,7 @@ public final class PeerStoryListContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -967,6 +977,7 @@ public final class PeerStoryListContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -1012,6 +1023,7 @@ public final class PeerStoryListContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -1181,6 +1193,7 @@ public final class PeerExpiringStoryListContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift index 2d0215fd49..b914bc4d31 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift @@ -18,6 +18,7 @@ public final class StoryPreloadInfo { public let peer: PeerReference public let storyId: Int32 public let media: EngineMedia + public let alternativeMedia: EngineMedia? public let reactions: [MessageReaction.Reaction] public let priority: Priority @@ -25,12 +26,14 @@ public final class StoryPreloadInfo { peer: PeerReference, storyId: Int32, media: EngineMedia, + alternativeMedia: EngineMedia?, reactions: [MessageReaction.Reaction], priority: Priority ) { self.peer = peer self.storyId = storyId self.media = media + self.alternativeMedia = alternativeMedia self.reactions = reactions self.priority = priority } @@ -1136,6 +1139,7 @@ public extension TelegramEngine { peer: peerReference, storyId: itemAndPeer.item.id, media: EngineMedia(media), + alternativeMedia: itemAndPeer.item.alternativeMedia.flatMap(EngineMedia.init), reactions: reactions, priority: .top(position: nextPriority) ) @@ -1168,6 +1172,7 @@ public extension TelegramEngine { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: item.media, + alternativeMedia: item.alternativeMedia, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift index 130f03e06c..5acf908a08 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift @@ -236,6 +236,7 @@ public final class StoryContentContextImpl: StoryContentContext { timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -282,6 +283,7 @@ public final class StoryContentContextImpl: StoryContentContext { timestamp: item.timestamp, expirationTimestamp: Int32.max, media: EngineMedia(item.media), + alternativeMedia: nil, mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -944,6 +946,7 @@ public final class StoryContentContextImpl: StoryContentContext { peer: peerReference, storyId: item.id, media: item.media, + alternativeMedia: item.alternativeMedia, reactions: reactions, priority: .top(position: nextPriority) ) @@ -955,7 +958,7 @@ public final class StoryContentContextImpl: StoryContentContext { for (id, info) in resultResources.sorted(by: { $0.value.priority < $1.value.priority }) { validIds.append(id) if self.preloadStoryResourceDisposables[id] == nil { - self.preloadStoryResourceDisposables[id] = preloadStoryMedia(context: context, peer: info.peer, storyId: info.storyId, media: info.media, reactions: info.reactions).startStrict() + self.preloadStoryResourceDisposables[id] = preloadStoryMedia(context: context, info: info).startStrict() } } @@ -1220,6 +1223,7 @@ public final class SingleStoryContentContextImpl: StoryContentContext { timestamp: itemValue.timestamp, expirationTimestamp: itemValue.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: itemValue.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: itemValue.mediaAreas, text: itemValue.text, entities: itemValue.entities, @@ -1530,6 +1534,7 @@ public final class PeerStoryListContentContextImpl: StoryContentContext { peer: peerReference, storyId: item.id, media: item.media, + alternativeMedia: item.alternativeMedia, reactions: reactions, priority: .top(position: nextPriority) ) @@ -1543,7 +1548,7 @@ public final class PeerStoryListContentContextImpl: StoryContentContext { if let mediaId = info.media.id { validIds.append(mediaId) if self.preloadStoryResourceDisposables[mediaId] == nil { - self.preloadStoryResourceDisposables[mediaId] = preloadStoryMedia(context: context, peer: info.peer, storyId: info.storyId, media: info.media, reactions: info.reactions).startStrict() + self.preloadStoryResourceDisposables[mediaId] = preloadStoryMedia(context: context, info: info).startStrict() } } } @@ -1629,13 +1634,20 @@ public final class PeerStoryListContentContextImpl: StoryContentContext { } } -public func preloadStoryMedia(context: AccountContext, peer: PeerReference, storyId: Int32, media: EngineMedia, reactions: [MessageReaction.Reaction]) -> Signal { +public func preloadStoryMedia(context: AccountContext, info: StoryPreloadInfo) -> Signal { var signals: [Signal] = [] - switch media { + let selectedMedia: EngineMedia + if context.sharedContext.immediateExperimentalUISettings.alternativeStoryMedia, let alternativeMedia = info.alternativeMedia { + selectedMedia = alternativeMedia + } else { + selectedMedia = info.media + } + + switch selectedMedia { case let .image(image): if let representation = largestImageRepresentation(image.representations) { - signals.append(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, userLocation: .peer(peer.id), userContentType: .story, reference: .media(media: .story(peer: peer, id: storyId, media: media._asMedia()), resource: representation.resource), range: nil) + signals.append(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, userLocation: .peer(info.peer.id), userContentType: .story, reference: .media(media: .story(peer: info.peer, id: info.storyId, media: selectedMedia._asMedia()), resource: representation.resource), range: nil) |> ignoreValues |> `catch` { _ -> Signal in return .complete() @@ -1652,7 +1664,7 @@ public func preloadStoryMedia(context: AccountContext, peer: PeerReference, stor } } - signals.append(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, userLocation: .peer(peer.id), userContentType: .story, reference: .media(media: .story(peer: peer, id: storyId, media: media._asMedia()), resource: file.resource), range: fetchRange) + signals.append(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, userLocation: .peer(info.peer.id), userContentType: .story, reference: .media(media: .story(peer: info.peer, id: info.storyId, media: selectedMedia._asMedia()), resource: file.resource), range: fetchRange) |> ignoreValues |> `catch` { _ -> Signal in return .complete() @@ -1665,7 +1677,7 @@ public func preloadStoryMedia(context: AccountContext, peer: PeerReference, stor var builtinReactions: [String] = [] var customReactions: [Int64] = [] - for reaction in reactions { + for reaction in info.reactions { switch reaction { case let .builtin(value): if !builtinReactions.contains(value) { @@ -1716,8 +1728,6 @@ public func preloadStoryMedia(context: AccountContext, peer: PeerReference, stor return Void() } - //let fileFetchPriorityDisposable = context.engine.resources.pushPriorityDownload(resourceId: file.resource.id.stringRepresentation, priority: 1) - let statusDisposable = statusSignal.start(completed: { subscriber.putCompletion() }) @@ -1726,7 +1736,6 @@ public func preloadStoryMedia(context: AccountContext, peer: PeerReference, stor return ActionDisposable { statusDisposable.dispose() loadDisposable.dispose() - //fileFetchPriorityDisposable.dispose() } } }) @@ -1771,12 +1780,9 @@ public func preloadStoryMedia(context: AccountContext, peer: PeerReference, stor }) let loadDisposable = loadSignal.start() - //let fileFetchPriorityDisposable = context.engine.resources.pushPriorityDownload(resourceId: file.resource.id.stringRepresentation, priority: 1) - return ActionDisposable { statusDisposable.dispose() loadDisposable.dispose() - //fileFetchPriorityDisposable.dispose() } } }) @@ -2038,6 +2044,7 @@ private func getCachedStory(storyId: StoryId, transaction: Transaction) -> Engin timestamp: item.timestamp, expirationTimestamp: item.expirationTimestamp, media: EngineMedia(media), + alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init), mediaAreas: item.mediaAreas, text: item.text, entities: item.entities, @@ -2686,6 +2693,7 @@ public final class RepostStoriesContentContextImpl: StoryContentContext { peer: peerReference, storyId: item.id, media: item.media, + alternativeMedia: item.alternativeMedia, reactions: reactions, priority: .top(position: nextPriority) ) @@ -2697,7 +2705,7 @@ public final class RepostStoriesContentContextImpl: StoryContentContext { for (id, info) in resultResources.sorted(by: { $0.value.priority < $1.value.priority }) { validIds.append(id) if self.preloadStoryResourceDisposables[id] == nil { - self.preloadStoryResourceDisposables[id] = preloadStoryMedia(context: context, peer: info.peer, storyId: info.storyId, media: info.media, reactions: info.reactions).startStrict() + self.preloadStoryResourceDisposables[id] = preloadStoryMedia(context: context, info: info).startStrict() } } diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift index 979bd22dc1..be2f161580 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift @@ -574,16 +574,34 @@ final class StoryItemContentComponent: Component { let peerReference = PeerReference(component.peer._asPeer()) + let selectedMedia: EngineMedia var messageMedia: EngineMedia? - switch component.item.media { - case let .image(image): - messageMedia = .image(image) - case let .file(file): - messageMedia = .file(file) - case .unsupported: - self.contentLoaded = true - default: - break + if component.context.sharedContext.immediateExperimentalUISettings.alternativeStoryMedia, let alternativeMedia = component.item.alternativeMedia { + selectedMedia = alternativeMedia + + switch alternativeMedia { + case let .image(image): + messageMedia = .image(image) + case let .file(file): + messageMedia = .file(file) + case .unsupported: + self.contentLoaded = true + default: + break + } + } else { + selectedMedia = component.item.media + + switch component.item.media { + case let .image(image): + messageMedia = .image(image) + case let .file(file): + messageMedia = .file(file) + case .unsupported: + self.contentLoaded = true + default: + break + } } var reloadMedia = false @@ -678,7 +696,7 @@ final class StoryItemContentComponent: Component { strings: component.strings, peer: component.peer, storyId: component.item.id, - media: component.item.media, + media: messageMedia, size: availableSize, isCaptureProtected: component.item.isForwardingDisabled, attemptSynchronous: synchronousLoad, @@ -720,7 +738,7 @@ final class StoryItemContentComponent: Component { } } - switch component.item.media { + switch selectedMedia { case .image, .file: if let unsupportedText = self.unsupportedText { self.unsupportedText = nil diff --git a/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift index c44cd0b0ea..ee0f1844e0 100644 --- a/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift +++ b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift @@ -55,7 +55,7 @@ public struct ExperimentalUISettings: Codable, Equatable { public var crashOnMemoryPressure: Bool public var unidirectionalSwipeToReply: Bool public var dustEffect: Bool - public var callUIV2: Bool + public var alternativeStoryMedia: Bool public var allowWebViewInspection: Bool public static var defaultSettings: ExperimentalUISettings { @@ -90,7 +90,7 @@ public struct ExperimentalUISettings: Codable, Equatable { crashOnMemoryPressure: false, unidirectionalSwipeToReply: false, dustEffect: false, - callUIV2: false, + alternativeStoryMedia: false, allowWebViewInspection: false ) } @@ -126,7 +126,7 @@ public struct ExperimentalUISettings: Codable, Equatable { crashOnMemoryPressure: Bool, unidirectionalSwipeToReply: Bool, dustEffect: Bool, - callUIV2: Bool, + alternativeStoryMedia: Bool, allowWebViewInspection: Bool ) { self.keepChatNavigationStack = keepChatNavigationStack @@ -159,7 +159,7 @@ public struct ExperimentalUISettings: Codable, Equatable { self.crashOnMemoryPressure = crashOnMemoryPressure self.unidirectionalSwipeToReply = unidirectionalSwipeToReply self.dustEffect = dustEffect - self.callUIV2 = callUIV2 + self.alternativeStoryMedia = alternativeStoryMedia self.allowWebViewInspection = allowWebViewInspection } @@ -196,7 +196,7 @@ public struct ExperimentalUISettings: Codable, Equatable { self.crashOnMemoryPressure = try container.decodeIfPresent(Bool.self, forKey: "crashOnMemoryPressure") ?? false self.unidirectionalSwipeToReply = try container.decodeIfPresent(Bool.self, forKey: "unidirectionalSwipeToReply") ?? false self.dustEffect = try container.decodeIfPresent(Bool.self, forKey: "dustEffect_2") ?? false - self.callUIV2 = try container.decodeIfPresent(Bool.self, forKey: "callUIV2") ?? false + self.alternativeStoryMedia = try container.decodeIfPresent(Bool.self, forKey: "alternativeStoryMedia") ?? false self.allowWebViewInspection = try container.decodeIfPresent(Bool.self, forKey: "allowWebViewInspection") ?? false } @@ -233,7 +233,7 @@ public struct ExperimentalUISettings: Codable, Equatable { try container.encode(self.crashOnMemoryPressure, forKey: "crashOnMemoryPressure") try container.encode(self.unidirectionalSwipeToReply, forKey: "unidirectionalSwipeToReply") try container.encode(self.dustEffect, forKey: "dustEffect_2") - try container.encode(self.callUIV2, forKey: "callUIV2") + try container.encode(self.alternativeStoryMedia, forKey: "alternativeStoryMedia") try container.encode(self.allowWebViewInspection, forKey: "allowWebViewInspection") } }