Story data saved experiment

This commit is contained in:
Isaac 2023-12-20 14:06:21 +04:00
parent 7c3432be3e
commit 9d30e0bac3
11 changed files with 140 additions and 40 deletions

View File

@ -1891,7 +1891,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
if let mediaId = info.media.id { if let mediaId = info.media.id {
validIds.append(mediaId) validIds.append(mediaId)
if self.preloadStoryResourceDisposables[mediaId] == nil { 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()
} }
} }
} }

View File

@ -73,7 +73,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
case skipReadHistory(PresentationTheme, Bool) case skipReadHistory(PresentationTheme, Bool)
case unidirectionalSwipeToReply(Bool) case unidirectionalSwipeToReply(Bool)
case dustEffect(Bool) case dustEffect(Bool)
case callUIV2(Bool) case alternativeStoryMedia(Bool)
case crashOnSlowQueries(PresentationTheme, Bool) case crashOnSlowQueries(PresentationTheme, Bool)
case crashOnMemoryPressure(PresentationTheme, Bool) case crashOnMemoryPressure(PresentationTheme, Bool)
case clearTips(PresentationTheme) case clearTips(PresentationTheme)
@ -125,7 +125,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
return DebugControllerSection.logging.rawValue return DebugControllerSection.logging.rawValue
case .webViewInspection, .resetWebViewCache: case .webViewInspection, .resetWebViewCache:
return DebugControllerSection.web.rawValue return DebugControllerSection.web.rawValue
case .keepChatNavigationStack, .skipReadHistory, .unidirectionalSwipeToReply, .dustEffect, .callUIV2, .crashOnSlowQueries, .crashOnMemoryPressure: case .keepChatNavigationStack, .skipReadHistory, .unidirectionalSwipeToReply, .dustEffect, .alternativeStoryMedia, .crashOnSlowQueries, .crashOnMemoryPressure:
return DebugControllerSection.experiments.rawValue 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: 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 return DebugControllerSection.experiments.rawValue
@ -180,7 +180,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
return 17 return 17
case .dustEffect: case .dustEffect:
return 18 return 18
case .callUIV2: case .alternativeStoryMedia:
return 19 return 19
case .crashOnSlowQueries: case .crashOnSlowQueries:
return 20 return 20
@ -959,11 +959,11 @@ private enum DebugControllerEntry: ItemListNodeEntry {
return settings return settings
}).start() }).start()
}) })
case let .callUIV2(value): case let .alternativeStoryMedia(value):
return ItemListSwitchItem(presentationData: presentationData, title: "Call UI V2", value: value, sectionId: self.section, style: .blocks, updated: { value in 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 let _ = updateExperimentalUISettingsInteractively(accountManager: arguments.sharedContext.accountManager, { settings in
var settings = settings var settings = settings
settings.callUIV2 = value settings.alternativeStoryMedia = value
return settings return settings
}).start() }).start()
}) })
@ -1427,7 +1427,7 @@ private func debugControllerEntries(sharedContext: SharedAccountContext, present
#endif #endif
entries.append(.unidirectionalSwipeToReply(experimentalSettings.unidirectionalSwipeToReply)) entries.append(.unidirectionalSwipeToReply(experimentalSettings.unidirectionalSwipeToReply))
entries.append(.dustEffect(experimentalSettings.dustEffect)) entries.append(.dustEffect(experimentalSettings.dustEffect))
entries.append(.callUIV2(experimentalSettings.callUIV2)) entries.append(.alternativeStoryMedia(experimentalSettings.alternativeStoryMedia))
} }
entries.append(.crashOnSlowQueries(presentationData.theme, experimentalSettings.crashOnLongQueries)) entries.append(.crashOnSlowQueries(presentationData.theme, experimentalSettings.crashOnLongQueries))
entries.append(.crashOnMemoryPressure(presentationData.theme, experimentalSettings.crashOnMemoryPressure)) entries.append(.crashOnMemoryPressure(presentationData.theme, experimentalSettings.crashOnMemoryPressure))

View File

@ -4638,6 +4638,7 @@ func replayFinalState(
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -4670,6 +4671,7 @@ func replayFinalState(
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,

View File

@ -321,6 +321,7 @@ private final class StoryStatsPublicForwardsContextImpl {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,

View File

@ -528,6 +528,7 @@ public final class EngineStoryViewListContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -571,6 +572,7 @@ public final class EngineStoryViewListContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -609,6 +611,7 @@ public final class EngineStoryViewListContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -714,6 +717,7 @@ public final class EngineStoryViewListContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,

View File

@ -244,6 +244,7 @@ public enum Stories {
case timestamp case timestamp
case expirationTimestamp case expirationTimestamp
case media case media
case alternativeMedia
case mediaAreas case mediaAreas
case text case text
case entities case entities
@ -266,6 +267,7 @@ public enum Stories {
public let timestamp: Int32 public let timestamp: Int32
public let expirationTimestamp: Int32 public let expirationTimestamp: Int32
public let media: Media? public let media: Media?
public let alternativeMedia: Media?
public let mediaAreas: [MediaArea] public let mediaAreas: [MediaArea]
public let text: String public let text: String
public let entities: [MessageTextEntity] public let entities: [MessageTextEntity]
@ -288,6 +290,7 @@ public enum Stories {
timestamp: Int32, timestamp: Int32,
expirationTimestamp: Int32, expirationTimestamp: Int32,
media: Media?, media: Media?,
alternativeMedia: Media?,
mediaAreas: [MediaArea], mediaAreas: [MediaArea],
text: String, text: String,
entities: [MessageTextEntity], entities: [MessageTextEntity],
@ -309,6 +312,7 @@ public enum Stories {
self.timestamp = timestamp self.timestamp = timestamp
self.expirationTimestamp = expirationTimestamp self.expirationTimestamp = expirationTimestamp
self.media = media self.media = media
self.alternativeMedia = alternativeMedia
self.mediaAreas = mediaAreas self.mediaAreas = mediaAreas
self.text = text self.text = text
self.entities = entities self.entities = entities
@ -339,6 +343,13 @@ public enum Stories {
} else { } else {
self.media = nil 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.mediaAreas = try container.decodeIfPresent([MediaArea].self, forKey: .mediaAreas) ?? []
self.text = try container.decode(String.self, forKey: .text) self.text = try container.decode(String.self, forKey: .text)
@ -371,6 +382,14 @@ public enum Stories {
let mediaData = encoder.makeData() let mediaData = encoder.makeData()
try container.encode(mediaData, forKey: .media) 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.mediaAreas, forKey: .mediaAreas)
try container.encode(self.text, forKey: .text) try container.encode(self.text, forKey: .text)
@ -410,6 +429,17 @@ public enum Stories {
return false 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 { if lhs.mediaAreas != rhs.mediaAreas {
return false return false
} }
@ -1153,6 +1183,7 @@ func _internal_uploadStoryImpl(
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -1334,6 +1365,7 @@ func _internal_editStoryPrivacy(account: Account, id: Int32, privacy: EngineStor
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -1364,6 +1396,7 @@ func _internal_editStoryPrivacy(account: Account, id: Int32, privacy: EngineStor
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -1557,6 +1590,7 @@ func _internal_updateStoriesArePinned(account: Account, peerId: PeerId, ids: [In
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -1586,6 +1620,7 @@ func _internal_updateStoriesArePinned(account: Account, peerId: PeerId, ids: [In
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -1774,11 +1809,22 @@ extension Stories.StoredItem {
mergedForwardInfo = forwardFrom.flatMap(Stories.Item.ForwardInfo.init(apiForwardInfo:)) 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( let item = Stories.Item(
id: id, id: id,
timestamp: date, timestamp: date,
expirationTimestamp: expireDate, expirationTimestamp: expireDate,
media: parsedMedia, media: parsedMedia,
alternativeMedia: parsedAlternativeMedia,
mediaAreas: mediaAreas?.compactMap(mediaAreaFromApiMediaArea) ?? [], mediaAreas: mediaAreas?.compactMap(mediaAreaFromApiMediaArea) ?? [],
text: caption ?? "", text: caption ?? "",
entities: entities.flatMap { entities in return messageTextEntitiesFromApiEntities(entities) } ?? [], entities: entities.flatMap { entities in return messageTextEntitiesFromApiEntities(entities) } ?? [],
@ -1842,6 +1888,7 @@ func _internal_getStoryById(accountPeerId: PeerId, postbox: Postbox, network: Ne
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -2323,6 +2370,7 @@ func _internal_setStoryReaction(account: Account, peerId: EnginePeer.Id, id: Int
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -2355,6 +2403,7 @@ func _internal_setStoryReaction(account: Account, peerId: EnginePeer.Id, id: Int
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,

View File

@ -60,6 +60,7 @@ public final class EngineStoryItem: Equatable {
public let timestamp: Int32 public let timestamp: Int32
public let expirationTimestamp: Int32 public let expirationTimestamp: Int32
public let media: EngineMedia public let media: EngineMedia
public let alternativeMedia: EngineMedia?
public let mediaAreas: [MediaArea] public let mediaAreas: [MediaArea]
public let text: String public let text: String
public let entities: [MessageTextEntity] public let entities: [MessageTextEntity]
@ -78,11 +79,12 @@ public final class EngineStoryItem: Equatable {
public let myReaction: MessageReaction.Reaction? public let myReaction: MessageReaction.Reaction?
public let forwardInfo: ForwardInfo? 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.id = id
self.timestamp = timestamp self.timestamp = timestamp
self.expirationTimestamp = expirationTimestamp self.expirationTimestamp = expirationTimestamp
self.media = media self.media = media
self.alternativeMedia = alternativeMedia
self.mediaAreas = mediaAreas self.mediaAreas = mediaAreas
self.text = text self.text = text
self.entities = entities self.entities = entities
@ -115,6 +117,9 @@ public final class EngineStoryItem: Equatable {
if lhs.media != rhs.media { if lhs.media != rhs.media {
return false return false
} }
if lhs.alternativeMedia != rhs.alternativeMedia {
return false
}
if lhs.mediaAreas != rhs.mediaAreas { if lhs.mediaAreas != rhs.mediaAreas {
return false return false
} }
@ -188,6 +193,7 @@ public extension EngineStoryItem {
timestamp: self.timestamp, timestamp: self.timestamp,
expirationTimestamp: self.expirationTimestamp, expirationTimestamp: self.expirationTimestamp,
media: self.media._asMedia(), media: self.media._asMedia(),
alternativeMedia: self.alternativeMedia?._asMedia(),
mediaAreas: self.mediaAreas, mediaAreas: self.mediaAreas,
text: self.text, text: self.text,
entities: self.entities, entities: self.entities,
@ -566,6 +572,7 @@ public final class PeerStoryListContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -710,6 +717,7 @@ public final class PeerStoryListContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -871,6 +879,7 @@ public final class PeerStoryListContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -918,6 +927,7 @@ public final class PeerStoryListContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -967,6 +977,7 @@ public final class PeerStoryListContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -1012,6 +1023,7 @@ public final class PeerStoryListContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -1181,6 +1193,7 @@ public final class PeerExpiringStoryListContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,

View File

@ -18,6 +18,7 @@ public final class StoryPreloadInfo {
public let peer: PeerReference public let peer: PeerReference
public let storyId: Int32 public let storyId: Int32
public let media: EngineMedia public let media: EngineMedia
public let alternativeMedia: EngineMedia?
public let reactions: [MessageReaction.Reaction] public let reactions: [MessageReaction.Reaction]
public let priority: Priority public let priority: Priority
@ -25,12 +26,14 @@ public final class StoryPreloadInfo {
peer: PeerReference, peer: PeerReference,
storyId: Int32, storyId: Int32,
media: EngineMedia, media: EngineMedia,
alternativeMedia: EngineMedia?,
reactions: [MessageReaction.Reaction], reactions: [MessageReaction.Reaction],
priority: Priority priority: Priority
) { ) {
self.peer = peer self.peer = peer
self.storyId = storyId self.storyId = storyId
self.media = media self.media = media
self.alternativeMedia = alternativeMedia
self.reactions = reactions self.reactions = reactions
self.priority = priority self.priority = priority
} }
@ -1136,6 +1139,7 @@ public extension TelegramEngine {
peer: peerReference, peer: peerReference,
storyId: itemAndPeer.item.id, storyId: itemAndPeer.item.id,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: itemAndPeer.item.alternativeMedia.flatMap(EngineMedia.init),
reactions: reactions, reactions: reactions,
priority: .top(position: nextPriority) priority: .top(position: nextPriority)
) )
@ -1168,6 +1172,7 @@ public extension TelegramEngine {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,

View File

@ -236,6 +236,7 @@ public final class StoryContentContextImpl: StoryContentContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -282,6 +283,7 @@ public final class StoryContentContextImpl: StoryContentContext {
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: Int32.max, expirationTimestamp: Int32.max,
media: EngineMedia(item.media), media: EngineMedia(item.media),
alternativeMedia: nil,
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -944,6 +946,7 @@ public final class StoryContentContextImpl: StoryContentContext {
peer: peerReference, peer: peerReference,
storyId: item.id, storyId: item.id,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
reactions: reactions, reactions: reactions,
priority: .top(position: nextPriority) 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 }) { for (id, info) in resultResources.sorted(by: { $0.value.priority < $1.value.priority }) {
validIds.append(id) validIds.append(id)
if self.preloadStoryResourceDisposables[id] == nil { 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, timestamp: itemValue.timestamp,
expirationTimestamp: itemValue.expirationTimestamp, expirationTimestamp: itemValue.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: itemValue.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: itemValue.mediaAreas, mediaAreas: itemValue.mediaAreas,
text: itemValue.text, text: itemValue.text,
entities: itemValue.entities, entities: itemValue.entities,
@ -1530,6 +1534,7 @@ public final class PeerStoryListContentContextImpl: StoryContentContext {
peer: peerReference, peer: peerReference,
storyId: item.id, storyId: item.id,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
reactions: reactions, reactions: reactions,
priority: .top(position: nextPriority) priority: .top(position: nextPriority)
) )
@ -1543,7 +1548,7 @@ public final class PeerStoryListContentContextImpl: StoryContentContext {
if let mediaId = info.media.id { if let mediaId = info.media.id {
validIds.append(mediaId) validIds.append(mediaId)
if self.preloadStoryResourceDisposables[mediaId] == nil { 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<Never, NoError> { public func preloadStoryMedia(context: AccountContext, info: StoryPreloadInfo) -> Signal<Never, NoError> {
var signals: [Signal<Never, NoError>] = [] var signals: [Signal<Never, NoError>] = []
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): case let .image(image):
if let representation = largestImageRepresentation(image.representations) { 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 |> ignoreValues
|> `catch` { _ -> Signal<Never, NoError> in |> `catch` { _ -> Signal<Never, NoError> in
return .complete() 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 |> ignoreValues
|> `catch` { _ -> Signal<Never, NoError> in |> `catch` { _ -> Signal<Never, NoError> in
return .complete() return .complete()
@ -1665,7 +1677,7 @@ public func preloadStoryMedia(context: AccountContext, peer: PeerReference, stor
var builtinReactions: [String] = [] var builtinReactions: [String] = []
var customReactions: [Int64] = [] var customReactions: [Int64] = []
for reaction in reactions { for reaction in info.reactions {
switch reaction { switch reaction {
case let .builtin(value): case let .builtin(value):
if !builtinReactions.contains(value) { if !builtinReactions.contains(value) {
@ -1716,8 +1728,6 @@ public func preloadStoryMedia(context: AccountContext, peer: PeerReference, stor
return Void() return Void()
} }
//let fileFetchPriorityDisposable = context.engine.resources.pushPriorityDownload(resourceId: file.resource.id.stringRepresentation, priority: 1)
let statusDisposable = statusSignal.start(completed: { let statusDisposable = statusSignal.start(completed: {
subscriber.putCompletion() subscriber.putCompletion()
}) })
@ -1726,7 +1736,6 @@ public func preloadStoryMedia(context: AccountContext, peer: PeerReference, stor
return ActionDisposable { return ActionDisposable {
statusDisposable.dispose() statusDisposable.dispose()
loadDisposable.dispose() loadDisposable.dispose()
//fileFetchPriorityDisposable.dispose()
} }
} }
}) })
@ -1771,12 +1780,9 @@ public func preloadStoryMedia(context: AccountContext, peer: PeerReference, stor
}) })
let loadDisposable = loadSignal.start() let loadDisposable = loadSignal.start()
//let fileFetchPriorityDisposable = context.engine.resources.pushPriorityDownload(resourceId: file.resource.id.stringRepresentation, priority: 1)
return ActionDisposable { return ActionDisposable {
statusDisposable.dispose() statusDisposable.dispose()
loadDisposable.dispose() loadDisposable.dispose()
//fileFetchPriorityDisposable.dispose()
} }
} }
}) })
@ -2038,6 +2044,7 @@ private func getCachedStory(storyId: StoryId, transaction: Transaction) -> Engin
timestamp: item.timestamp, timestamp: item.timestamp,
expirationTimestamp: item.expirationTimestamp, expirationTimestamp: item.expirationTimestamp,
media: EngineMedia(media), media: EngineMedia(media),
alternativeMedia: item.alternativeMedia.flatMap(EngineMedia.init),
mediaAreas: item.mediaAreas, mediaAreas: item.mediaAreas,
text: item.text, text: item.text,
entities: item.entities, entities: item.entities,
@ -2686,6 +2693,7 @@ public final class RepostStoriesContentContextImpl: StoryContentContext {
peer: peerReference, peer: peerReference,
storyId: item.id, storyId: item.id,
media: item.media, media: item.media,
alternativeMedia: item.alternativeMedia,
reactions: reactions, reactions: reactions,
priority: .top(position: nextPriority) 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 }) { for (id, info) in resultResources.sorted(by: { $0.value.priority < $1.value.priority }) {
validIds.append(id) validIds.append(id)
if self.preloadStoryResourceDisposables[id] == nil { 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()
} }
} }

View File

@ -574,16 +574,34 @@ final class StoryItemContentComponent: Component {
let peerReference = PeerReference(component.peer._asPeer()) let peerReference = PeerReference(component.peer._asPeer())
let selectedMedia: EngineMedia
var messageMedia: EngineMedia? var messageMedia: EngineMedia?
switch component.item.media { if component.context.sharedContext.immediateExperimentalUISettings.alternativeStoryMedia, let alternativeMedia = component.item.alternativeMedia {
case let .image(image): selectedMedia = alternativeMedia
messageMedia = .image(image)
case let .file(file): switch alternativeMedia {
messageMedia = .file(file) case let .image(image):
case .unsupported: messageMedia = .image(image)
self.contentLoaded = true case let .file(file):
default: messageMedia = .file(file)
break 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 var reloadMedia = false
@ -678,7 +696,7 @@ final class StoryItemContentComponent: Component {
strings: component.strings, strings: component.strings,
peer: component.peer, peer: component.peer,
storyId: component.item.id, storyId: component.item.id,
media: component.item.media, media: messageMedia,
size: availableSize, size: availableSize,
isCaptureProtected: component.item.isForwardingDisabled, isCaptureProtected: component.item.isForwardingDisabled,
attemptSynchronous: synchronousLoad, attemptSynchronous: synchronousLoad,
@ -720,7 +738,7 @@ final class StoryItemContentComponent: Component {
} }
} }
switch component.item.media { switch selectedMedia {
case .image, .file: case .image, .file:
if let unsupportedText = self.unsupportedText { if let unsupportedText = self.unsupportedText {
self.unsupportedText = nil self.unsupportedText = nil

View File

@ -55,7 +55,7 @@ public struct ExperimentalUISettings: Codable, Equatable {
public var crashOnMemoryPressure: Bool public var crashOnMemoryPressure: Bool
public var unidirectionalSwipeToReply: Bool public var unidirectionalSwipeToReply: Bool
public var dustEffect: Bool public var dustEffect: Bool
public var callUIV2: Bool public var alternativeStoryMedia: Bool
public var allowWebViewInspection: Bool public var allowWebViewInspection: Bool
public static var defaultSettings: ExperimentalUISettings { public static var defaultSettings: ExperimentalUISettings {
@ -90,7 +90,7 @@ public struct ExperimentalUISettings: Codable, Equatable {
crashOnMemoryPressure: false, crashOnMemoryPressure: false,
unidirectionalSwipeToReply: false, unidirectionalSwipeToReply: false,
dustEffect: false, dustEffect: false,
callUIV2: false, alternativeStoryMedia: false,
allowWebViewInspection: false allowWebViewInspection: false
) )
} }
@ -126,7 +126,7 @@ public struct ExperimentalUISettings: Codable, Equatable {
crashOnMemoryPressure: Bool, crashOnMemoryPressure: Bool,
unidirectionalSwipeToReply: Bool, unidirectionalSwipeToReply: Bool,
dustEffect: Bool, dustEffect: Bool,
callUIV2: Bool, alternativeStoryMedia: Bool,
allowWebViewInspection: Bool allowWebViewInspection: Bool
) { ) {
self.keepChatNavigationStack = keepChatNavigationStack self.keepChatNavigationStack = keepChatNavigationStack
@ -159,7 +159,7 @@ public struct ExperimentalUISettings: Codable, Equatable {
self.crashOnMemoryPressure = crashOnMemoryPressure self.crashOnMemoryPressure = crashOnMemoryPressure
self.unidirectionalSwipeToReply = unidirectionalSwipeToReply self.unidirectionalSwipeToReply = unidirectionalSwipeToReply
self.dustEffect = dustEffect self.dustEffect = dustEffect
self.callUIV2 = callUIV2 self.alternativeStoryMedia = alternativeStoryMedia
self.allowWebViewInspection = allowWebViewInspection self.allowWebViewInspection = allowWebViewInspection
} }
@ -196,7 +196,7 @@ public struct ExperimentalUISettings: Codable, Equatable {
self.crashOnMemoryPressure = try container.decodeIfPresent(Bool.self, forKey: "crashOnMemoryPressure") ?? false self.crashOnMemoryPressure = try container.decodeIfPresent(Bool.self, forKey: "crashOnMemoryPressure") ?? false
self.unidirectionalSwipeToReply = try container.decodeIfPresent(Bool.self, forKey: "unidirectionalSwipeToReply") ?? false self.unidirectionalSwipeToReply = try container.decodeIfPresent(Bool.self, forKey: "unidirectionalSwipeToReply") ?? false
self.dustEffect = try container.decodeIfPresent(Bool.self, forKey: "dustEffect_2") ?? 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 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.crashOnMemoryPressure, forKey: "crashOnMemoryPressure")
try container.encode(self.unidirectionalSwipeToReply, forKey: "unidirectionalSwipeToReply") try container.encode(self.unidirectionalSwipeToReply, forKey: "unidirectionalSwipeToReply")
try container.encode(self.dustEffect, forKey: "dustEffect_2") 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") try container.encode(self.allowWebViewInspection, forKey: "allowWebViewInspection")
} }
} }