From 7140c69dbf5f1b0745f84a5209f9f1a8efed4e1d Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 24 Sep 2021 11:59:21 +0300 Subject: [PATCH] Refactoring --- Telegram/SiriIntents/IntentHandler.swift | 2 +- submodules/InviteLinksUI/BUILD | 1 - .../Sources/InviteLinkEditController.swift | 3 +- .../Sources/InviteLinkInviteController.swift | 9 +- .../Sources/InviteLinkListController.swift | 62 +++---- .../Sources/InviteLinkViewController.swift | 35 ++-- .../ItemListPermanentInviteLinkItem.swift | 7 +- .../Sources/ItemListAvatarAndNameItem.swift | 2 +- .../Sources/LegacyMediaLocations.swift | 2 +- .../Sources/MediaResources.swift | 60 ++----- .../Sources/MapResources.swift | 12 +- .../Sources/VenueIconResources.swift | 12 +- submodules/ManagedAnimationNode/BUILD | 1 - .../Sources/ManagedAnimationNode.swift | 11 +- .../ExternalMusicAlbumArtResources.swift | 12 +- .../Sources/OpenInAppIconResources.swift | 12 +- .../Sources/SecureIdLocalResource.swift | 12 +- .../Sources/AvatarGalleryController.swift | 4 +- .../Sources/PeerInfoAvatarListNode.swift | 24 +-- submodules/Postbox/Sources/MediaBox.swift | 58 ++++--- .../Postbox/Sources/MediaResource.swift | 30 +--- .../Sources/SharedAccountMediaManager.swift | 2 +- .../StorageUsageController.swift | 12 +- .../Themes/ThemeGridControllerNode.swift | 2 +- .../Sources/SlotMachineAnimationNode.swift | 2 +- .../Sources/StickerResources.swift | 4 +- .../Sources/MacOS/MacInternalUpdater.swift | 2 +- .../Network/FetchedMediaResource.swift | 16 +- .../State/AccountStateManagementUtils.swift | 4 +- .../Sources/State/ApplyUpdateMessage.swift | 2 +- .../SyncCore_CloudFileMediaResource.swift | 154 +++-------------- .../SyncCore_SecureFileMediaResource.swift | 12 +- .../SyncCore/SyncCore_TelegramMediaFile.swift | 2 +- .../SyncCore_TelegramMediaImage.swift | 2 +- .../TelegramEngine/Data/PeerSummary.swift | 36 ++++ .../Messages/DeleteMessages.swift | 18 +- .../TelegramEngine/Messages/Media.swift | 12 -- .../Messages/ScheduledMessages.swift | 2 +- .../Peers/UpdateCachedPeerData.swift | 2 +- .../Resources/CollectCacheUsageStats.swift | 24 +-- .../Resources/TelegramEngineResources.swift | 158 +++++++++++++++++- .../TelegramUI/Sources/ChatController.swift | 4 +- ...atMessageInteractiveInstantVideoNode.swift | 4 +- .../TelegramUI/Sources/EmojiResources.swift | 24 +-- .../Sources/FetchCachedRepresentations.swift | 4 +- .../TelegramUI/Sources/FetchManager.swift | 4 +- .../TelegramUI/Sources/ICloudResources.swift | 12 +- .../Sources/ManagedDiceAnimationNode.swift | 6 +- .../Sources/NotificationContentContext.swift | 4 +- .../Sources/PeerInfo/PeerInfoHeaderNode.swift | 8 +- .../SoftwareVideoLayerFrameManager.swift | 2 +- .../Sources/YoutubeEmbedImplementation.swift | 12 +- 52 files changed, 421 insertions(+), 502 deletions(-) diff --git a/Telegram/SiriIntents/IntentHandler.swift b/Telegram/SiriIntents/IntentHandler.swift index 8362b55ec1..9f07db0c5a 100644 --- a/Telegram/SiriIntents/IntentHandler.swift +++ b/Telegram/SiriIntents/IntentHandler.swift @@ -1317,7 +1317,7 @@ private func mapPeersToFriends(accountId: AccountRecordId, accountPeerId: PeerId } } } else if let resource = smallestImageRepresentation(peer.profileImageRepresentations)?.resource, let path = mediaBox.completedResourcePath(resource) { - let cachedPath = mediaBox.cachedRepresentationPathForId(resource.id.uniqueId, representationId: "intents.png", keepDuration: .shortLived) + let cachedPath = mediaBox.cachedRepresentationPathForId(resource.id.stringRepresentation, representationId: "intents.png", keepDuration: .shortLived) if let _ = fileSize(cachedPath) { do { let data = try Data(contentsOf: URL(fileURLWithPath: cachedPath), options: .alwaysMapped) diff --git a/submodules/InviteLinksUI/BUILD b/submodules/InviteLinksUI/BUILD index 073baefda8..e43bd900f0 100644 --- a/submodules/InviteLinksUI/BUILD +++ b/submodules/InviteLinksUI/BUILD @@ -13,7 +13,6 @@ swift_library( "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", "//submodules/AsyncDisplayKit:AsyncDisplayKit", "//submodules/Display:Display", - "//submodules/Postbox:Postbox", "//submodules/TelegramCore:TelegramCore", "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/AccountContext:AccountContext", diff --git a/submodules/InviteLinksUI/Sources/InviteLinkEditController.swift b/submodules/InviteLinksUI/Sources/InviteLinkEditController.swift index abc08f378c..6e2e6e80f4 100644 --- a/submodules/InviteLinksUI/Sources/InviteLinkEditController.swift +++ b/submodules/InviteLinksUI/Sources/InviteLinkEditController.swift @@ -3,7 +3,6 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit -import Postbox import TelegramCore import TelegramPresentationData import TelegramUIPreferences @@ -321,7 +320,7 @@ private struct InviteLinkEditControllerState: Equatable { var updating = false } -public func inviteLinkEditController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, peerId: PeerId, invite: ExportedInvitation?, completion: ((ExportedInvitation?) -> Void)? = nil) -> ViewController { +public func inviteLinkEditController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, peerId: EnginePeer.Id, invite: ExportedInvitation?, completion: ((ExportedInvitation?) -> Void)? = nil) -> ViewController { var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)? let actionsDisposable = DisposableSet() diff --git a/submodules/InviteLinksUI/Sources/InviteLinkInviteController.swift b/submodules/InviteLinksUI/Sources/InviteLinkInviteController.swift index 5f901ff199..c96d8e411e 100644 --- a/submodules/InviteLinksUI/Sources/InviteLinkInviteController.swift +++ b/submodules/InviteLinksUI/Sources/InviteLinkInviteController.swift @@ -4,7 +4,6 @@ import SwiftSignalKit import TelegramPresentationData import AppBundle import AsyncDisplayKit -import Postbox import TelegramCore import Display import AccountContext @@ -158,13 +157,13 @@ public final class InviteLinkInviteController: ViewController { private var animatedIn = false private let context: AccountContext - private let peerId: PeerId + private let peerId: EnginePeer.Id private weak var parentNavigationController: NavigationController? private var presentationData: PresentationData private var presentationDataDisposable: Disposable? - public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, peerId: PeerId, parentNavigationController: NavigationController?) { + public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, peerId: EnginePeer.Id, parentNavigationController: NavigationController?) { self.context = context self.peerId = peerId self.parentNavigationController = parentNavigationController @@ -251,7 +250,7 @@ public final class InviteLinkInviteController: ViewController { private weak var controller: InviteLinkInviteController? private let context: AccountContext - private let peerId: PeerId + private let peerId: EnginePeer.Id private let invitesContext: PeerExportedInvitationsContext private var interaction: InviteLinkInviteInteraction? @@ -278,7 +277,7 @@ public final class InviteLinkInviteController: ViewController { private var revokeDisposable = MetaDisposable() - init(context: AccountContext, presentationData: PresentationData, peerId: PeerId, controller: InviteLinkInviteController) { + init(context: AccountContext, presentationData: PresentationData, peerId: EnginePeer.Id, controller: InviteLinkInviteController) { self.context = context self.peerId = peerId diff --git a/submodules/InviteLinksUI/Sources/InviteLinkListController.swift b/submodules/InviteLinksUI/Sources/InviteLinkListController.swift index 14eb5afa78..406b48f794 100644 --- a/submodules/InviteLinksUI/Sources/InviteLinkListController.swift +++ b/submodules/InviteLinksUI/Sources/InviteLinkListController.swift @@ -3,7 +3,6 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit -import Postbox import TelegramCore import TelegramPresentationData import TelegramUIPreferences @@ -59,7 +58,7 @@ private enum InviteLinksListEntry: ItemListNodeEntry { case header(PresentationTheme, String) case mainLinkHeader(PresentationTheme, String) - case mainLink(PresentationTheme, ExportedInvitation?, [Peer], Int32, Bool) + case mainLink(PresentationTheme, ExportedInvitation?, [EnginePeer], Int32, Bool) case mainLinkOtherInfo(PresentationTheme, String) case linksHeader(PresentationTheme, String) @@ -135,7 +134,7 @@ private enum InviteLinksListEntry: ItemListNodeEntry { return false } case let .mainLink(lhsTheme, lhsInvite, lhsPeers, lhsImportersCount, lhsIsPublic): - if case let .mainLink(rhsTheme, rhsInvite, rhsPeers, rhsImportersCount, rhsIsPublic) = rhs, lhsTheme === rhsTheme, lhsInvite == rhsInvite, arePeerArraysEqual(lhsPeers, rhsPeers), lhsImportersCount == rhsImportersCount, lhsIsPublic == rhsIsPublic { + if case let .mainLink(rhsTheme, rhsInvite, rhsPeers, rhsImportersCount, rhsIsPublic) = rhs, lhsTheme === rhsTheme, lhsInvite == rhsInvite, lhsPeers == rhsPeers, lhsImportersCount == rhsImportersCount, lhsIsPublic == rhsIsPublic { return true } else { return false @@ -268,12 +267,12 @@ private enum InviteLinksListEntry: ItemListNodeEntry { } } -private func inviteLinkListControllerEntries(presentationData: PresentationData, view: PeerView, invites: [ExportedInvitation]?, revokedInvites: [ExportedInvitation]?, importers: PeerInvitationImportersState?, creators: [ExportedInvitationCreator], admin: ExportedInvitationCreator?, tick: Int32) -> [InviteLinksListEntry] { +private func inviteLinkListControllerEntries(presentationData: PresentationData, exportedInvitation: EngineExportedPeerInvitation?, peer: EnginePeer?, invites: [ExportedInvitation]?, revokedInvites: [ExportedInvitation]?, importers: PeerInvitationImportersState?, creators: [ExportedInvitationCreator], admin: ExportedInvitationCreator?, tick: Int32) -> [InviteLinksListEntry] { var entries: [InviteLinksListEntry] = [] if admin == nil { let helpText: String - if let peer = peerViewMainPeer(view) as? TelegramChannel, case .broadcast = peer.info { + if case let .channel(peer) = peer, case .broadcast = peer.info { helpText = presentationData.strings.InviteLink_CreatePrivateLinkHelpChannel } else { helpText = presentationData.strings.InviteLink_CreatePrivateLinkHelp @@ -283,14 +282,12 @@ private func inviteLinkListControllerEntries(presentationData: PresentationData, let mainInvite: ExportedInvitation? var isPublic = false - if let peer = peerViewMainPeer(view), let address = peer.addressName, !address.isEmpty && admin == nil { - mainInvite = ExportedInvitation(link: "t.me/\(address)", isPermanent: true, isRevoked: false, adminId: PeerId(0), date: 0, startDate: nil, expireDate: nil, usageLimit: nil, count: nil) + if let peer = peer, let address = peer.addressName, !address.isEmpty && admin == nil { + mainInvite = ExportedInvitation(link: "t.me/\(address)", isPermanent: true, isRevoked: false, adminId: EnginePeer.Id(0), date: 0, startDate: nil, expireDate: nil, usageLimit: nil, count: nil) isPublic = true } else if let invites = invites, let invite = invites.first(where: { $0.isPermanent && !$0.isRevoked }) { mainInvite = invite - } else if let invite = (view.cachedData as? CachedChannelData)?.exportedInvitation, admin == nil { - mainInvite = invite - } else if let invite = (view.cachedData as? CachedGroupData)?.exportedInvitation, admin == nil { + } else if let invite = exportedInvitation, admin == nil { mainInvite = invite } else { mainInvite = nil @@ -307,9 +304,9 @@ private func inviteLinkListControllerEntries(presentationData: PresentationData, importersCount = 0 } - entries.append(.mainLink(presentationData.theme, mainInvite, importers?.importers.prefix(3).compactMap { $0.peer.peer } ?? [], importersCount, isPublic)) - if let adminPeer = admin?.peer.peer, let peer = peerViewMainPeer(view) { - let string = presentationData.strings.InviteLink_OtherPermanentLinkInfo(EnginePeer(adminPeer).displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder), EnginePeer(peer).displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)) + entries.append(.mainLink(presentationData.theme, mainInvite, importers?.importers.prefix(3).compactMap { $0.peer.peer.flatMap(EnginePeer.init) } ?? [], importersCount, isPublic)) + if let adminPeer = admin?.peer.peer, let peer = peer { + let string = presentationData.strings.InviteLink_OtherPermanentLinkInfo(EnginePeer(adminPeer).displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder), peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)) entries.append(.mainLinkOtherInfo(presentationData.theme, string.string)) } @@ -393,7 +390,7 @@ private struct InviteLinkListControllerState: Equatable { var revokingPrivateLink: Bool } -public func inviteLinkListController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, peerId: PeerId, admin: ExportedInvitationCreator?) -> ViewController { +public func inviteLinkListController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, peerId: EnginePeer.Id, admin: ExportedInvitationCreator?) -> ViewController { var pushControllerImpl: ((ViewController) -> Void)? var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)? var presentInGlobalOverlayImpl: ((ViewController) -> Void)? @@ -742,9 +739,6 @@ public func inviteLinkListController(context: AccountContext, updatedPresentatio presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) }) - let peerView = context.account.viewTracker.peerView(peerId) - |> deliverOnMainQueue - let mainLink: Signal if let _ = admin { mainLink = invitesContext.state @@ -752,16 +746,9 @@ public func inviteLinkListController(context: AccountContext, updatedPresentatio return .single(state.invitations.first(where: { $0.isPermanent && !$0.isRevoked })) } } else { - mainLink = peerView - |> mapToSignal { view -> Signal in - if let cachedData = view.cachedData as? CachedGroupData, let exportedInvitation = cachedData.exportedInvitation { - return .single(exportedInvitation) - } else if let cachedData = view.cachedData as? CachedChannelData, let exportedInvitation = cachedData.exportedInvitation { - return .single(exportedInvitation) - } else { - return .single(nil) - } - } + mainLink = context.engine.data.subscribe( + TelegramEngine.EngineData.Item.Peer.ExportedInvitation(id: peerId) + ) } let importersState = Promise(nil) @@ -789,9 +776,22 @@ public func inviteLinkListController(context: AccountContext, updatedPresentatio let previousCreators = Atomic<[ExportedInvitationCreator]?>(value: nil) let presentationData = updatedPresentationData?.signal ?? context.sharedContext.presentationData - let signal = combineLatest(presentationData, peerView, importersContext, importersState.get(), invitesContext.state, revokedInvitesContext.state, creators, timerPromise.get()) - |> deliverOnMainQueue - |> map { presentationData, view, importersContext, importers, invites, revokedInvites, creators, tick -> (ItemListControllerState, (ItemListNodeState, Any)) in + let signal = combineLatest(queue: .mainQueue(), + presentationData, + context.engine.data.subscribe( + TelegramEngine.EngineData.Item.Peer.ExportedInvitation(id: peerId) + ), + context.engine.data.subscribe( + TelegramEngine.EngineData.Item.Peer.Peer(id: peerId) + ), + importersContext, + importersState.get(), + invitesContext.state, + revokedInvitesContext.state, + creators, + timerPromise.get() + ) + |> map { presentationData, exportedInvitation, peer, importersContext, importers, invites, revokedInvites, creators, tick -> (ItemListControllerState, (ItemListNodeState, Any)) in let previousInvites = previousInvites.swap(invites) let previousRevokedInvites = previousRevokedInvites.swap(revokedInvites) let previousCreators = previousCreators.swap(creators) @@ -820,7 +820,7 @@ public func inviteLinkListController(context: AccountContext, updatedPresentatio } let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: title, leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) - let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: inviteLinkListControllerEntries(presentationData: presentationData, view: view, invites: invites.hasLoadedOnce ? invites.invitations : nil, revokedInvites: revokedInvites.hasLoadedOnce ? revokedInvites.invitations : nil, importers: importers, creators: creators, admin: admin, tick: tick), style: .blocks, emptyStateItem: nil, crossfadeState: crossfade, animateChanges: animateChanges) + let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: inviteLinkListControllerEntries(presentationData: presentationData, exportedInvitation: exportedInvitation, peer: peer, invites: invites.hasLoadedOnce ? invites.invitations : nil, revokedInvites: revokedInvites.hasLoadedOnce ? revokedInvites.invitations : nil, importers: importers, creators: creators, admin: admin, tick: tick), style: .blocks, emptyStateItem: nil, crossfadeState: crossfade, animateChanges: animateChanges) return (controllerState, (listState, arguments)) } diff --git a/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift b/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift index 54053c4597..fd3bac1755 100644 --- a/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift +++ b/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift @@ -4,7 +4,6 @@ import SwiftSignalKit import TelegramPresentationData import AppBundle import AsyncDisplayKit -import Postbox import TelegramCore import Display import AccountContext @@ -23,13 +22,13 @@ import UndoUI class InviteLinkViewInteraction { let context: AccountContext - let openPeer: (PeerId) -> Void + let openPeer: (EnginePeer.Id) -> Void let copyLink: (ExportedInvitation) -> Void let shareLink: (ExportedInvitation) -> Void let editLink: (ExportedInvitation) -> Void let contextAction: (ExportedInvitation, ASDisplayNode, ContextGesture?) -> Void - init(context: AccountContext, openPeer: @escaping (PeerId) -> Void, copyLink: @escaping (ExportedInvitation) -> Void, shareLink: @escaping (ExportedInvitation) -> Void, editLink: @escaping (ExportedInvitation) -> Void, contextAction: @escaping (ExportedInvitation, ASDisplayNode, ContextGesture?) -> Void) { + init(context: AccountContext, openPeer: @escaping (EnginePeer.Id) -> Void, copyLink: @escaping (ExportedInvitation) -> Void, shareLink: @escaping (ExportedInvitation) -> Void, editLink: @escaping (ExportedInvitation) -> Void, contextAction: @escaping (ExportedInvitation, ASDisplayNode, ContextGesture?) -> Void) { self.context = context self.openPeer = openPeer self.copyLink = copyLink @@ -53,15 +52,15 @@ private enum InviteLinkViewEntryId: Hashable { case creatorHeader case creator case importerHeader - case importer(PeerId) + case importer(EnginePeer.Id) } private enum InviteLinkViewEntry: Comparable, Identifiable { case link(PresentationTheme, ExportedInvitation) case creatorHeader(PresentationTheme, String) - case creator(PresentationTheme, PresentationDateTimeFormat, Peer, Int32) + case creator(PresentationTheme, PresentationDateTimeFormat, EnginePeer, Int32) case importerHeader(PresentationTheme, String, String, Bool) - case importer(Int32, PresentationTheme, PresentationDateTimeFormat, Peer, Int32, Bool) + case importer(Int32, PresentationTheme, PresentationDateTimeFormat, EnginePeer, Int32, Bool) var stableId: InviteLinkViewEntryId { switch self { @@ -93,7 +92,7 @@ private enum InviteLinkViewEntry: Comparable, Identifiable { return false } case let .creator(lhsTheme, lhsDateTimeFormat, lhsPeer, lhsDate): - if case let .creator(rhsTheme, rhsDateTimeFormat, rhsPeer, rhsDate) = rhs, lhsTheme === rhsTheme, lhsDateTimeFormat == rhsDateTimeFormat, arePeersEqual(lhsPeer, rhsPeer), lhsDate == rhsDate { + if case let .creator(rhsTheme, rhsDateTimeFormat, rhsPeer, rhsDate) = rhs, lhsTheme === rhsTheme, lhsDateTimeFormat == rhsDateTimeFormat, lhsPeer == rhsPeer, lhsDate == rhsDate { return true } else { return false @@ -105,7 +104,7 @@ private enum InviteLinkViewEntry: Comparable, Identifiable { return false } case let .importer(lhsIndex, lhsTheme, lhsDateTimeFormat, lhsPeer, lhsDate, lhsLoading): - if case let .importer(rhsIndex, rhsTheme, rhsDateTimeFormat, rhsPeer, rhsDate, rhsLoading) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsDateTimeFormat == rhsDateTimeFormat, arePeersEqual(lhsPeer, rhsPeer), lhsDate == rhsDate, lhsLoading == rhsLoading { + if case let .importer(rhsIndex, rhsTheme, rhsDateTimeFormat, rhsPeer, rhsDate, rhsLoading) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsDateTimeFormat == rhsDateTimeFormat, lhsPeer == rhsPeer, lhsDate == rhsDate, lhsLoading == rhsLoading { return true } else { return false @@ -172,7 +171,7 @@ private enum InviteLinkViewEntry: Comparable, Identifiable { return SectionHeaderItem(presentationData: ItemListPresentationData(presentationData), title: title) case let .creator(_, dateTimeFormat, peer, date): let dateString = stringForFullDate(timestamp: date, strings: presentationData.strings, dateTimeFormat: dateTimeFormat) - return ItemListPeerItem(presentationData: ItemListPresentationData(presentationData), dateTimeFormat: dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, context: interaction.context, peer: EnginePeer(peer), height: .generic, nameStyle: .distinctBold, presence: nil, text: .text(dateString, .secondary), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: peer.id != account.peerId, sectionId: 0, action: { + return ItemListPeerItem(presentationData: ItemListPresentationData(presentationData), dateTimeFormat: dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, context: interaction.context, peer: peer, height: .generic, nameStyle: .distinctBold, presence: nil, text: .text(dateString, .secondary), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: peer.id != account.peerId, sectionId: 0, action: { interaction.openPeer(peer.id) }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, hasTopStripe: false, noInsets: true, tag: nil) case let .importerHeader(_, title, subtitle, expired): @@ -189,7 +188,7 @@ private enum InviteLinkViewEntry: Comparable, Identifiable { return SectionHeaderItem(presentationData: ItemListPresentationData(presentationData), title: title, additionalText: additionalText) case let .importer(_, _, dateTimeFormat, peer, date, loading): let dateString = stringForFullDate(timestamp: date, strings: presentationData.strings, dateTimeFormat: dateTimeFormat) - return ItemListPeerItem(presentationData: ItemListPresentationData(presentationData), dateTimeFormat: dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, context: interaction.context, peer: EnginePeer(peer), height: .generic, nameStyle: .distinctBold, presence: nil, text: .text(dateString, .secondary), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: peer.id != account.peerId, sectionId: 0, action: { + return ItemListPeerItem(presentationData: ItemListPresentationData(presentationData), dateTimeFormat: dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, context: interaction.context, peer: peer, height: .generic, nameStyle: .distinctBold, presence: nil, text: .text(dateString, .secondary), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: peer.id != account.peerId, sectionId: 0, action: { interaction.openPeer(peer.id) }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, hasTopStripe: false, noInsets: true, tag: nil, shimmering: loading ? ItemListPeerItemShimmering(alternationIndex: 0) : nil) } @@ -233,7 +232,7 @@ public final class InviteLinkViewController: ViewController { private var animatedIn = false private let context: AccountContext - private let peerId: PeerId + private let peerId: EnginePeer.Id private let invite: ExportedInvitation private let invitationsContext: PeerExportedInvitationsContext? private let revokedInvitationsContext: PeerExportedInvitationsContext? @@ -243,7 +242,7 @@ public final class InviteLinkViewController: ViewController { private var presentationDataDisposable: Disposable? fileprivate var presentationDataPromise = Promise() - public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, peerId: PeerId, invite: ExportedInvitation, invitationsContext: PeerExportedInvitationsContext?, revokedInvitationsContext: PeerExportedInvitationsContext?, importersContext: PeerInvitationImportersContext?) { + public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, peerId: EnginePeer.Id, invite: ExportedInvitation, invitationsContext: PeerExportedInvitationsContext?, revokedInvitationsContext: PeerExportedInvitationsContext?, importersContext: PeerInvitationImportersContext?) { self.context = context self.peerId = peerId self.invite = invite @@ -338,7 +337,7 @@ public final class InviteLinkViewController: ViewController { private weak var controller: InviteLinkViewController? private let context: AccountContext - private let peerId: PeerId + private let peerId: EnginePeer.Id private let invite: ExportedInvitation private let importersContext: PeerInvitationImportersContext @@ -369,7 +368,7 @@ public final class InviteLinkViewController: ViewController { private var validLayout: ContainerViewLayout? - init(context: AccountContext, presentationData: PresentationData, peerId: PeerId, invite: ExportedInvitation, importersContext: PeerInvitationImportersContext?, controller: InviteLinkViewController) { + init(context: AccountContext, presentationData: PresentationData, peerId: EnginePeer.Id, invite: ExportedInvitation, importersContext: PeerInvitationImportersContext?, controller: InviteLinkViewController) { self.context = context self.peerId = peerId self.invite = invite @@ -581,7 +580,7 @@ public final class InviteLinkViewController: ViewController { entries.append(.link(presentationData.theme, invite)) entries.append(.creatorHeader(presentationData.theme, presentationData.strings.InviteLink_CreatedBy.uppercased())) - entries.append(.creator(presentationData.theme, presentationData.dateTimeFormat, creatorPeer, invite.date)) + entries.append(.creator(presentationData.theme, presentationData.dateTimeFormat, EnginePeer(creatorPeer), invite.date)) if !state.importers.isEmpty || (state.isLoadingMore && state.count > 0) { let subtitle: String @@ -605,16 +604,16 @@ public final class InviteLinkViewController: ViewController { if state.importers.isEmpty && state.isLoadingMore { count = min(4, state.count) loading = true - let fakeUser = TelegramUser(id: PeerId(namespace: .max, id: PeerId.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) + let fakeUser = TelegramUser(id: EnginePeer.Id(namespace: .max, id: EnginePeer.Id.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) for i in 0 ..< count { - entries.append(.importer(Int32(i), presentationData.theme, presentationData.dateTimeFormat, fakeUser, 0, true)) + entries.append(.importer(Int32(i), presentationData.theme, presentationData.dateTimeFormat, EnginePeer.user(fakeUser), 0, true)) } } else { count = min(4, Int32(state.importers.count)) loading = false for importer in state.importers { if let peer = importer.peer.peer { - entries.append(.importer(index, presentationData.theme, presentationData.dateTimeFormat, peer, importer.date, false)) + entries.append(.importer(index, presentationData.theme, presentationData.dateTimeFormat, EnginePeer(peer), importer.date, false)) } index += 1 } diff --git a/submodules/InviteLinksUI/Sources/ItemListPermanentInviteLinkItem.swift b/submodules/InviteLinksUI/Sources/ItemListPermanentInviteLinkItem.swift index a95c3d01c0..c42a6a3d8f 100644 --- a/submodules/InviteLinksUI/Sources/ItemListPermanentInviteLinkItem.swift +++ b/submodules/InviteLinksUI/Sources/ItemListPermanentInviteLinkItem.swift @@ -3,7 +3,6 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit -import Postbox import AccountContext import TelegramPresentationData import ItemListUI @@ -31,7 +30,7 @@ public class ItemListPermanentInviteLinkItem: ListViewItem, ItemListItem { let presentationData: ItemListPresentationData let invite: ExportedInvitation? let count: Int32 - let peers: [Peer] + let peers: [EnginePeer] let displayButton: Bool let displayImporters: Bool let buttonColor: UIColor? @@ -48,7 +47,7 @@ public class ItemListPermanentInviteLinkItem: ListViewItem, ItemListItem { presentationData: ItemListPresentationData, invite: ExportedInvitation?, count: Int32, - peers: [Peer], + peers: [EnginePeer], displayButton: Bool, displayImporters: Bool, buttonColor: UIColor?, @@ -322,7 +321,7 @@ public class ItemListPermanentInviteLinkItemNode: ListViewItemNode, ItemListItem let (invitedPeersLayout, invitedPeersApply) = makeInvitedPeersLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: subtitle, font: titleFont, textColor: subtitleColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - params.rightInset - 20.0 - leftInset - rightInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) - let avatarsContent = avatarsContext.update(peers: item.peers.map(EnginePeer.init), animated: false) + let avatarsContent = avatarsContext.update(peers: item.peers, animated: false) let verticalInset: CGFloat = 16.0 let fieldHeight: CGFloat = 52.0 diff --git a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift index 850998868f..d6b146c2dd 100644 --- a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift +++ b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift @@ -1084,7 +1084,7 @@ public class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNo var hidden = false if let item = self.item, let context = item.context, let peer = item.peer, let hiddenAvatarRepresentation = context.hiddenAvatarRepresentation { for representation in peer.profileImageRepresentations { - if representation.resource.id.isEqual(to: hiddenAvatarRepresentation.resource.id) { + if representation.resource.id == hiddenAvatarRepresentation.resource.id { hidden = true } } diff --git a/submodules/LegacyUI/Sources/LegacyMediaLocations.swift b/submodules/LegacyUI/Sources/LegacyMediaLocations.swift index d45e9120ac..16adf50083 100644 --- a/submodules/LegacyUI/Sources/LegacyMediaLocations.swift +++ b/submodules/LegacyUI/Sources/LegacyMediaLocations.swift @@ -5,7 +5,7 @@ import TelegramCore public func legacyImageLocationUri(resource: MediaResource) -> String? { if let resource = resource as? CloudPeerPhotoSizeMediaResource { - return resource.id.uniqueId + return resource.id.stringRepresentation } return nil } diff --git a/submodules/LocalMediaResources/Sources/MediaResources.swift b/submodules/LocalMediaResources/Sources/MediaResources.swift index a7c0272aeb..c35ee6a7ce 100644 --- a/submodules/LocalMediaResources/Sources/MediaResources.swift +++ b/submodules/LocalMediaResources/Sources/MediaResources.swift @@ -28,7 +28,7 @@ public final class VideoMediaResourceAdjustments: PostboxCoding, Equatable { } } -public struct VideoLibraryMediaResourceId: MediaResourceId { +public struct VideoLibraryMediaResourceId { public let localIdentifier: String public let adjustmentsDigest: MemoryBuffer? @@ -43,14 +43,6 @@ public struct VideoLibraryMediaResourceId: MediaResourceId { public var hashValue: Int { return self.localIdentifier.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? VideoLibraryMediaResourceId { - return self.localIdentifier == to.localIdentifier && self.adjustmentsDigest == to.adjustmentsDigest - } else { - return false - } - } } public enum VideoLibraryMediaResourceConversion: PostboxCoding, Equatable { @@ -131,7 +123,7 @@ public final class VideoLibraryMediaResource: TelegramMediaResource { case let .compress(adjustments): adjustmentsDigest = adjustments?.digest } - return VideoLibraryMediaResourceId(localIdentifier: self.localIdentifier, adjustmentsDigest: adjustmentsDigest) + return MediaResourceId(VideoLibraryMediaResourceId(localIdentifier: self.localIdentifier, adjustmentsDigest: adjustmentsDigest).uniqueId) } public func isEqual(to: MediaResource) -> Bool { @@ -143,7 +135,7 @@ public final class VideoLibraryMediaResource: TelegramMediaResource { } } -public struct LocalFileVideoMediaResourceId: MediaResourceId { +public struct LocalFileVideoMediaResourceId { public let randomId: Int64 public var uniqueId: String { @@ -153,14 +145,6 @@ public struct LocalFileVideoMediaResourceId: MediaResourceId { public var hashValue: Int { return self.randomId.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? LocalFileVideoMediaResourceId { - return self.randomId == to.randomId - } else { - return false - } - } } public final class LocalFileVideoMediaResource: TelegramMediaResource { @@ -195,7 +179,7 @@ public final class LocalFileVideoMediaResource: TelegramMediaResource { } public var id: MediaResourceId { - return LocalFileVideoMediaResourceId(randomId: self.randomId) + return MediaResourceId(LocalFileVideoMediaResourceId(randomId: self.randomId).uniqueId) } public func isEqual(to: MediaResource) -> Bool { @@ -207,7 +191,7 @@ public final class LocalFileVideoMediaResource: TelegramMediaResource { } } -public struct PhotoLibraryMediaResourceId: MediaResourceId { +public struct PhotoLibraryMediaResourceId { public let localIdentifier: String public let resourceId: Int64 @@ -222,14 +206,6 @@ public struct PhotoLibraryMediaResourceId: MediaResourceId { public var hashValue: Int { return self.localIdentifier.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? PhotoLibraryMediaResourceId { - return self.localIdentifier == to.localIdentifier - } else { - return false - } - } } public class PhotoLibraryMediaResource: TelegramMediaResource { @@ -252,7 +228,7 @@ public class PhotoLibraryMediaResource: TelegramMediaResource { } public var id: MediaResourceId { - return PhotoLibraryMediaResourceId(localIdentifier: self.localIdentifier, resourceId: self.uniqueId) + return MediaResourceId(PhotoLibraryMediaResourceId(localIdentifier: self.localIdentifier, resourceId: self.uniqueId).uniqueId) } public func isEqual(to: MediaResource) -> Bool { @@ -264,7 +240,7 @@ public class PhotoLibraryMediaResource: TelegramMediaResource { } } -public struct LocalFileGifMediaResourceId: MediaResourceId { +public struct LocalFileGifMediaResourceId { public let randomId: Int64 public var uniqueId: String { @@ -274,14 +250,6 @@ public struct LocalFileGifMediaResourceId: MediaResourceId { public var hashValue: Int { return self.randomId.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? LocalFileGifMediaResourceId { - return self.randomId == to.randomId - } else { - return false - } - } } public final class LocalFileGifMediaResource: TelegramMediaResource { @@ -308,7 +276,7 @@ public final class LocalFileGifMediaResource: TelegramMediaResource { } public var id: MediaResourceId { - return LocalFileGifMediaResourceId(randomId: self.randomId) + return MediaResourceId(LocalFileGifMediaResourceId(randomId: self.randomId).uniqueId) } public func isEqual(to: MediaResource) -> Bool { @@ -321,7 +289,7 @@ public final class LocalFileGifMediaResource: TelegramMediaResource { } -public struct BundleResourceId: MediaResourceId { +public struct BundleResourceId { public let nameHash: Int64 public var uniqueId: String { @@ -331,14 +299,6 @@ public struct BundleResourceId: MediaResourceId { public var hashValue: Int { return self.nameHash.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? BundleResourceId { - return self.nameHash == to.nameHash - } else { - return false - } - } } public class BundleResource: TelegramMediaResource { @@ -361,7 +321,7 @@ public class BundleResource: TelegramMediaResource { } public var id: MediaResourceId { - return BundleResourceId(nameHash: self.nameHash) + return MediaResourceId(BundleResourceId(nameHash: self.nameHash).uniqueId) } public func isEqual(to: MediaResource) -> Bool { diff --git a/submodules/LocationResources/Sources/MapResources.swift b/submodules/LocationResources/Sources/MapResources.swift index 1e699daacc..2299669217 100644 --- a/submodules/LocationResources/Sources/MapResources.swift +++ b/submodules/LocationResources/Sources/MapResources.swift @@ -6,7 +6,7 @@ import TelegramCore import MapKit import SwiftSignalKit -public struct MapSnapshotMediaResourceId: MediaResourceId { +public struct MapSnapshotMediaResourceId { public let latitude: Double public let longitude: Double public let width: Int32 @@ -19,14 +19,6 @@ public struct MapSnapshotMediaResourceId: MediaResourceId { public var hashValue: Int { return self.uniqueId.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? MapSnapshotMediaResourceId { - return self.latitude == to.latitude && self.longitude == to.longitude && self.width == to.width && self.height == to.height - } else { - return false - } - } } public class MapSnapshotMediaResource: TelegramMediaResource { @@ -57,7 +49,7 @@ public class MapSnapshotMediaResource: TelegramMediaResource { } public var id: MediaResourceId { - return MapSnapshotMediaResourceId(latitude: self.latitude, longitude: self.longitude, width: self.width, height: self.height) + return MediaResourceId(MapSnapshotMediaResourceId(latitude: self.latitude, longitude: self.longitude, width: self.width, height: self.height).uniqueId) } public func isEqual(to: MediaResource) -> Bool { diff --git a/submodules/LocationResources/Sources/VenueIconResources.swift b/submodules/LocationResources/Sources/VenueIconResources.swift index 4232c67d23..8dd18eeca5 100644 --- a/submodules/LocationResources/Sources/VenueIconResources.swift +++ b/submodules/LocationResources/Sources/VenueIconResources.swift @@ -6,7 +6,7 @@ import TelegramCore import SwiftSignalKit import AppBundle -public struct VenueIconResourceId: MediaResourceId { +public struct VenueIconResourceId { public let type: String public init(type: String) { @@ -20,14 +20,6 @@ public struct VenueIconResourceId: MediaResourceId { public var hashValue: Int { return self.type.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? VenueIconResourceId { - return self.type == to.type - } else { - return false - } - } } public class VenueIconResource: TelegramMediaResource { @@ -46,7 +38,7 @@ public class VenueIconResource: TelegramMediaResource { } public var id: MediaResourceId { - return VenueIconResourceId(type: self.type) + return MediaResourceId(VenueIconResourceId(type: self.type).uniqueId) } public func isEqual(to: MediaResource) -> Bool { diff --git a/submodules/ManagedAnimationNode/BUILD b/submodules/ManagedAnimationNode/BUILD index 77b05b16f6..2cdef0d224 100644 --- a/submodules/ManagedAnimationNode/BUILD +++ b/submodules/ManagedAnimationNode/BUILD @@ -13,7 +13,6 @@ swift_library( "//submodules/Display:Display", "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", "//submodules/AsyncDisplayKit:AsyncDisplayKit", - "//submodules/Postbox:Postbox", "//submodules/TelegramCore:TelegramCore", "//submodules/GZip:GZip", "//submodules/rlottie:RLottieBinding", diff --git a/submodules/ManagedAnimationNode/Sources/ManagedAnimationNode.swift b/submodules/ManagedAnimationNode/Sources/ManagedAnimationNode.swift index d584c7a7e9..e5a7c6acbe 100644 --- a/submodules/ManagedAnimationNode/Sources/ManagedAnimationNode.swift +++ b/submodules/ManagedAnimationNode/Sources/ManagedAnimationNode.swift @@ -2,7 +2,6 @@ import Foundation import UIKit import Display import AsyncDisplayKit -import Postbox import TelegramCore import RLottieBinding import AppBundle @@ -79,14 +78,14 @@ public enum ManagedAnimationFrameRange: Equatable { public enum ManagedAnimationSource: Equatable { case local(String) - case resource(Account, MediaResource) + case resource(Account, EngineMediaResource) var cacheKey: String { switch self { case let .local(name): return name case let .resource(_, resource): - return resource.id.uniqueId + return resource.id.stringRepresentation } } @@ -95,11 +94,11 @@ public enum ManagedAnimationSource: Equatable { case let .local(name): return getAppBundle().path(forResource: name, ofType: "tgs") case let .resource(account, resource): - return account.postbox.mediaBox.completedResourcePath(resource) + return account.postbox.mediaBox.completedResourcePath(resource._asResource()) } } - public static func == (lhs: ManagedAnimationSource, rhs: ManagedAnimationSource) -> Bool { + public static func ==(lhs: ManagedAnimationSource, rhs: ManagedAnimationSource) -> Bool { switch lhs { case let .local(lhsPath): if case let .local(rhsPath) = rhs, lhsPath == rhsPath { @@ -108,7 +107,7 @@ public enum ManagedAnimationSource: Equatable { return false } case let .resource(lhsAccount, lhsResource): - if case let .resource(rhsAccount, rhsResource) = rhs, lhsAccount === rhsAccount, lhsResource.isEqual(to: rhsResource) { + if case let .resource(rhsAccount, rhsResource) = rhs, lhsAccount === rhsAccount, lhsResource == rhsResource { return true } else { return false diff --git a/submodules/MusicAlbumArtResources/Sources/ExternalMusicAlbumArtResources.swift b/submodules/MusicAlbumArtResources/Sources/ExternalMusicAlbumArtResources.swift index f43869369d..79c7528d51 100644 --- a/submodules/MusicAlbumArtResources/Sources/ExternalMusicAlbumArtResources.swift +++ b/submodules/MusicAlbumArtResources/Sources/ExternalMusicAlbumArtResources.swift @@ -5,7 +5,7 @@ import SwiftSignalKit import Postbox import UrlEscaping -public struct ExternalMusicAlbumArtResourceId: MediaResourceId { +public struct ExternalMusicAlbumArtResourceId { public let title: String public let performer: String public let isThumbnail: Bool @@ -23,14 +23,6 @@ public struct ExternalMusicAlbumArtResourceId: MediaResourceId { public var hashValue: Int { return self.title.hashValue &* 31 &+ self.performer.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? ExternalMusicAlbumArtResourceId { - return self.title == to.title && self.performer == to.performer && self.isThumbnail == to.isThumbnail - } else { - return false - } - } } public class ExternalMusicAlbumArtResource: TelegramMediaResource { @@ -57,7 +49,7 @@ public class ExternalMusicAlbumArtResource: TelegramMediaResource { } public var id: MediaResourceId { - return ExternalMusicAlbumArtResourceId(title: self.title, performer: self.performer, isThumbnail: self.isThumbnail) + return MediaResourceId(ExternalMusicAlbumArtResourceId(title: self.title, performer: self.performer, isThumbnail: self.isThumbnail).uniqueId) } public func isEqual(to: MediaResource) -> Bool { diff --git a/submodules/OpenInExternalAppUI/Sources/OpenInAppIconResources.swift b/submodules/OpenInExternalAppUI/Sources/OpenInAppIconResources.swift index 4c5379f68c..21948e5567 100644 --- a/submodules/OpenInExternalAppUI/Sources/OpenInAppIconResources.swift +++ b/submodules/OpenInExternalAppUI/Sources/OpenInAppIconResources.swift @@ -4,7 +4,7 @@ import TelegramCore import SwiftSignalKit import Postbox -public struct OpenInAppIconResourceId: MediaResourceId { +public struct OpenInAppIconResourceId { public let appStoreId: Int64 public var uniqueId: String { @@ -14,14 +14,6 @@ public struct OpenInAppIconResourceId: MediaResourceId { public var hashValue: Int { return self.appStoreId.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? OpenInAppIconResourceId { - return self.appStoreId == to.appStoreId - } else { - return false - } - } } public class OpenInAppIconResource: TelegramMediaResource { @@ -48,7 +40,7 @@ public class OpenInAppIconResource: TelegramMediaResource { } public var id: MediaResourceId { - return OpenInAppIconResourceId(appStoreId: self.appStoreId) + return MediaResourceId(OpenInAppIconResourceId(appStoreId: self.appStoreId).uniqueId) } public func isEqual(to: MediaResource) -> Bool { diff --git a/submodules/PassportUI/Sources/SecureIdLocalResource.swift b/submodules/PassportUI/Sources/SecureIdLocalResource.swift index 66aaaa049b..468d7f0ce3 100644 --- a/submodules/PassportUI/Sources/SecureIdLocalResource.swift +++ b/submodules/PassportUI/Sources/SecureIdLocalResource.swift @@ -5,7 +5,7 @@ import TelegramCore import SwiftSignalKit import Display -public struct SecureIdLocalImageResourceId: MediaResourceId { +public struct SecureIdLocalImageResourceId { public let id: Int64 public var uniqueId: String { @@ -15,14 +15,6 @@ public struct SecureIdLocalImageResourceId: MediaResourceId { public var hashValue: Int { return self.id.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? SecureIdLocalImageResourceId { - return self.id == to.id - } else { - return false - } - } } public class SecureIdLocalImageResource: TelegramMediaResource { @@ -45,7 +37,7 @@ public class SecureIdLocalImageResource: TelegramMediaResource { } public var id: MediaResourceId { - return SecureIdLocalImageResourceId(id: self.localId) + return MediaResourceId(SecureIdLocalImageResourceId(id: self.localId).uniqueId) } public func isEqual(to: MediaResource) -> Bool { diff --git a/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift b/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift index 4d8a4370af..dca7f94c2f 100644 --- a/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift +++ b/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift @@ -76,12 +76,12 @@ public enum AvatarGalleryEntry: Equatable { switch self { case let .topImage(representations, _, _, _, _, _): if let last = representations.last { - return .resource(last.representation.resource.id.uniqueId) + return .resource(last.representation.resource.id.stringRepresentation) } return .topImage case let .image(id, _, representations, _, _, _, _, _, _, _): if let last = representations.last { - return .resource(last.representation.resource.id.uniqueId) + return .resource(last.representation.resource.id.stringRepresentation) } return .image(id) } diff --git a/submodules/PeerInfoAvatarListNode/Sources/PeerInfoAvatarListNode.swift b/submodules/PeerInfoAvatarListNode/Sources/PeerInfoAvatarListNode.swift index a65e7a42bb..66973b6a39 100644 --- a/submodules/PeerInfoAvatarListNode/Sources/PeerInfoAvatarListNode.swift +++ b/submodules/PeerInfoAvatarListNode/Sources/PeerInfoAvatarListNode.swift @@ -77,7 +77,7 @@ private class PeerInfoAvatarListLoadingStripNode: ASImageNode { } } -private struct CustomListItemResourceId: MediaResourceId { +private struct CustomListItemResourceId { public var uniqueId: String { return "customNode" } @@ -85,14 +85,6 @@ private struct CustomListItemResourceId: MediaResourceId { public var hashValue: Int { return 0 } - - public func isEqual(to: MediaResourceId) -> Bool { - if to is CustomListItemResourceId { - return true - } else { - return false - } - } } public enum PeerInfoAvatarListItem: Equatable { @@ -100,16 +92,16 @@ public enum PeerInfoAvatarListItem: Equatable { case topImage([ImageRepresentationWithReference], [VideoRepresentationWithReference], Data?) case image(TelegramMediaImageReference?, [ImageRepresentationWithReference], [VideoRepresentationWithReference], Data?) - var id: WrappedMediaResourceId { + var id: MediaResourceId { switch self { case .custom: - return WrappedMediaResourceId(CustomListItemResourceId()) + return MediaResourceId(CustomListItemResourceId().uniqueId) case let .topImage(representations, _, _): let representation = largestImageRepresentation(representations.map { $0.representation }) ?? representations[representations.count - 1].representation - return WrappedMediaResourceId(representation.resource.id) + return representation.resource.id case let .image(_, representations, _, _): let representation = largestImageRepresentation(representations.map { $0.representation }) ?? representations[representations.count - 1].representation - return WrappedMediaResourceId(representation.resource.id) + return representation.resource.id } } @@ -465,7 +457,7 @@ public final class PeerInfoAvatarListContainerNode: ASDisplayNode { public let highlightContainerNode: ASDisplayNode public private(set) var galleryEntries: [AvatarGalleryEntry] = [] private var items: [PeerInfoAvatarListItem] = [] - private var itemNodes: [WrappedMediaResourceId: PeerInfoAvatarListItemNode] = [:] + private var itemNodes: [MediaResourceId: PeerInfoAvatarListItemNode] = [:] private var stripNodes: [ASImageNode] = [] private var activeStripNode: ASImageNode private var loadingStripNode: PeerInfoAvatarListLoadingStripNode @@ -1131,7 +1123,7 @@ public final class PeerInfoAvatarListContainerNode: ASDisplayNode { public var updateCustomItemsOnlySynchronously = false private func updateItems(size: CGSize, update: Bool = false, transition: ContainedViewLayoutTransition, stripTransition: ContainedViewLayoutTransition, synchronous: Bool = false) { - var validIds: [WrappedMediaResourceId] = [] + var validIds: [MediaResourceId] = [] var addedItemNodesForAdditiveTransition: [PeerInfoAvatarListItemNode] = [] var additiveTransitionOffset: CGFloat = 0.0 var itemsAdded = false @@ -1185,7 +1177,7 @@ public final class PeerInfoAvatarListContainerNode: ASDisplayNode { for itemNode in addedItemNodesForAdditiveTransition { transition.animatePositionAdditive(node: itemNode, offset: CGPoint(x: additiveTransitionOffset, y: 0.0)) } - var removeIds: [WrappedMediaResourceId] = [] + var removeIds: [MediaResourceId] = [] for (id, _) in self.itemNodes { if !validIds.contains(id) { removeIds.append(id) diff --git a/submodules/Postbox/Sources/MediaBox.swift b/submodules/Postbox/Sources/MediaBox.swift index 46be289cc3..e82cd05ec7 100644 --- a/submodules/Postbox/Sources/MediaBox.swift +++ b/submodules/Postbox/Sources/MediaBox.swift @@ -102,7 +102,7 @@ private struct CachedMediaResourceRepresentationKey: Hashable { let representation: CachedMediaResourceRepresentation static func ==(lhs: CachedMediaResourceRepresentationKey, rhs: CachedMediaResourceRepresentationKey) -> Bool { - return lhs.resourceId.isEqual(to: rhs.resourceId) && lhs.representation.isEqual(to: rhs.representation) + return lhs.resourceId == rhs.resourceId && lhs.representation.isEqual(to: rhs.representation) } func hash(into hasher: inout Hasher) { @@ -150,11 +150,11 @@ public final class MediaBox { private let cacheQueue = Queue() private let timeBasedCleanup: TimeBasedCleanup - private var statusContexts: [WrappedMediaResourceId: ResourceStatusContext] = [:] + private var statusContexts: [MediaResourceId: ResourceStatusContext] = [:] private var cachedRepresentationContexts: [CachedMediaResourceRepresentationKey: CachedMediaResourceRepresentationContext] = [:] - private var fileContexts: [WrappedMediaResourceId: MediaBoxFileContext] = [:] - private var keepResourceContexts: [WrappedMediaResourceId: MediaBoxKeepResourceContext] = [:] + private var fileContexts: [MediaResourceId: MediaBoxFileContext] = [:] + private var keepResourceContexts: [MediaResourceId: MediaBoxKeepResourceContext] = [:] private var wrappedFetchResource = Promise<(MediaResource, Signal<[(Range, MediaBoxFetchPriority)], NoError>, MediaResourceFetchParameters?) -> Signal>() public var preFetchedResourcePath: (MediaResource) -> String? = { _ in return nil } @@ -203,7 +203,7 @@ public final class MediaBox { } private func fileNameForId(_ id: MediaResourceId) -> String { - return "\(id.uniqueId)" + return "\(id.stringRepresentation)" } private func fileNameForId(_ id: String) -> String { @@ -287,7 +287,7 @@ public final class MediaBox { } public func moveResourceData(from: MediaResourceId, to: MediaResourceId) { - if from.isEqual(to: to) { + if from == to { return } self.dataQueue.async { @@ -301,7 +301,7 @@ public final class MediaBox { } public func copyResourceData(from: MediaResourceId, to: MediaResourceId, synchronous: Bool = false) { - if from.isEqual(to: to) { + if from == to { return } let begin = { @@ -348,7 +348,7 @@ public final class MediaBox { } self.statusQueue.async { - let resourceId = WrappedMediaResourceId(resource.id) + let resourceId = resource.id let statusContext: ResourceStatusContext var statusUpdateDisposable: MetaDisposable? if let current = self.statusContexts[resourceId] { @@ -402,10 +402,10 @@ public final class MediaBox { disposable.set(ActionDisposable { [weak statusContext] in self.statusQueue.async { - if let current = self.statusContexts[WrappedMediaResourceId(resource.id)], current === statusContext { + if let current = self.statusContexts[resource.id], current === statusContext { current.subscribers.remove(index) if current.subscribers.isEmpty { - self.statusContexts.removeValue(forKey: WrappedMediaResourceId(resource.id)) + self.statusContexts.removeValue(forKey: resource.id) current.disposable.dispose() } } @@ -538,7 +538,7 @@ public final class MediaBox { private func fileContext(for resource: MediaResource) -> (MediaBoxFileContext, () -> Void)? { assert(self.dataQueue.isCurrent()) - let resourceId = WrappedMediaResourceId(resource.id) + let resourceId = resource.id var context: MediaBoxFileContext? if let current = self.fileContexts[resourceId] { @@ -769,22 +769,22 @@ public final class MediaBox { let dataQueue = self.dataQueue self.dataQueue.async { let context: MediaBoxKeepResourceContext - if let current = self.keepResourceContexts[WrappedMediaResourceId(id)] { + if let current = self.keepResourceContexts[id] { context = current } else { context = MediaBoxKeepResourceContext() - self.keepResourceContexts[WrappedMediaResourceId(id)] = context + self.keepResourceContexts[id] = context } let index = context.subscribers.add(Void()) disposable.set(ActionDisposable { [weak self, weak context] in dataQueue.async { - guard let strongSelf = self, let context = context, let currentContext = strongSelf.keepResourceContexts[WrappedMediaResourceId(id)], currentContext === context else { + guard let strongSelf = self, let context = context, let currentContext = strongSelf.keepResourceContexts[id], currentContext === context else { return } currentContext.subscribers.remove(index) if currentContext.isEmpty { - strongSelf.keepResourceContexts.removeValue(forKey: WrappedMediaResourceId(id)) + strongSelf.keepResourceContexts.removeValue(forKey: id) } } }) @@ -977,12 +977,12 @@ public final class MediaBox { } } - public func collectResourceCacheUsage(_ ids: [MediaResourceId]) -> Signal<[WrappedMediaResourceId: Int64], NoError> { + public func collectResourceCacheUsage(_ ids: [MediaResourceId]) -> Signal<[MediaResourceId: Int64], NoError> { return Signal { subscriber in self.dataQueue.async { - var result: [WrappedMediaResourceId: Int64] = [:] + var result: [MediaResourceId: Int64] = [:] for id in ids { - let wrappedId = WrappedMediaResourceId(id) + let wrappedId = id let paths = self.storePathsForId(id) if let size = fileSize(paths.complete) { result[wrappedId] = Int64(size) @@ -997,16 +997,16 @@ public final class MediaBox { } } - public func collectOtherResourceUsage(excludeIds: Set, combinedExcludeIds: Set) -> Signal<(Int64, [String], Int64), NoError> { + public func collectOtherResourceUsage(excludeIds: Set, combinedExcludeIds: Set) -> Signal<(Int64, [String], Int64), NoError> { return Signal { subscriber in self.dataQueue.async { var result: Int64 = 0 var excludeNames = Set() for id in combinedExcludeIds { - let partial = "\(self.fileNameForId(id.id))_partial" - let meta = "\(self.fileNameForId(id.id))_meta" - let complete = self.fileNameForId(id.id) + let partial = "\(self.fileNameForId(id))_partial" + let meta = "\(self.fileNameForId(id))_meta" + let complete = self.fileNameForId(id) excludeNames.insert(meta) excludeNames.insert(partial) @@ -1044,7 +1044,7 @@ public final class MediaBox { var excludePrefixes = Set() for id in excludeIds { - let cachedRepresentationPrefix = self.fileNameForId(id.id) + let cachedRepresentationPrefix = self.fileNameForId(id) excludePrefixes.insert(cachedRepresentationPrefix) } @@ -1091,7 +1091,7 @@ public final class MediaBox { self.dataQueue.async { var keepPrefixes: [String] = [] for id in self.keepResourceContexts.keys { - let resourcePaths = self.fileNamesForId(id.id) + let resourcePaths = self.fileNamesForId(id) keepPrefixes.append(resourcePaths.partial) keepPrefixes.append(resourcePaths.complete) } @@ -1111,7 +1111,7 @@ public final class MediaBox { } } - public func removeCachedResources(_ ids: Set, force: Bool = false) -> Signal { + public func removeCachedResources(_ ids: Set, force: Bool = false) -> Signal { return Signal { subscriber in self.dataQueue.async { for id in ids { @@ -1123,14 +1123,14 @@ public final class MediaBox { continue } } - let paths = self.storePathsForId(id.id) + let paths = self.storePathsForId(id) unlink(paths.complete) unlink(paths.partial) unlink(paths.partial + ".meta") self.fileContexts.removeValue(forKey: id) } - let uniqueIds = Set(ids.map { $0.id.uniqueId }) + let uniqueIds = Set(ids.map { $0.stringRepresentation }) var pathsToDelete: [String] = [] @@ -1161,14 +1161,12 @@ public final class MediaBox { } } - - public func allFileContexts() -> Signal<[(partial: String, complete: String)], NoError> { return Signal { subscriber in self.dataQueue.async { var result: [(partial: String, complete: String)] = [] for (id, _) in self.fileContexts { - let paths = self.storePathsForId(id.id) + let paths = self.storePathsForId(id) result.append((partial: paths.partial, complete: paths.complete)) } subscriber.putNext(result) diff --git a/submodules/Postbox/Sources/MediaResource.swift b/submodules/Postbox/Sources/MediaResource.swift index db25d91a3d..95f07dcef0 100644 --- a/submodules/Postbox/Sources/MediaResource.swift +++ b/submodules/Postbox/Sources/MediaResource.swift @@ -1,33 +1,11 @@ import Foundation -public protocol MediaResourceId { - var uniqueId: String { get } - var hashValue: Int { get } - func isEqual(to: MediaResourceId) -> Bool -} +public struct MediaResourceId: Equatable, Hashable { + public var stringRepresentation: String -public struct WrappedMediaResourceId: Hashable { - public let id: MediaResourceId - - public init(_ id: MediaResourceId) { - self.id = id + public init(_ stringRepresentation: String) { + self.stringRepresentation = stringRepresentation } - - public static func ==(lhs: WrappedMediaResourceId, rhs: WrappedMediaResourceId) -> Bool { - return lhs.id.isEqual(to: rhs.id) - } - -// public var hashValue: Int { -// return self.id.hashValue -// } - - public func hash(into hasher: inout Hasher) { - hasher.combine(self.id.hashValue) - } -} - -public func anyHashableFromMediaResourceId(_ id: MediaResourceId) -> AnyHashable { - return AnyHashable(WrappedMediaResourceId(id)) } public protocol MediaResource { diff --git a/submodules/Postbox/Sources/SharedAccountMediaManager.swift b/submodules/Postbox/Sources/SharedAccountMediaManager.swift index d96aa0232b..96eac06782 100644 --- a/submodules/Postbox/Sources/SharedAccountMediaManager.swift +++ b/submodules/Postbox/Sources/SharedAccountMediaManager.swift @@ -8,7 +8,7 @@ final class SharedAccountMediaManager { } private func fileNameForId(_ id: MediaResourceId) -> String { - return "\(id.uniqueId)" + return "\(id.stringRepresentation)" } private func pathForId(_ id: MediaResourceId) -> String { diff --git a/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift b/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift index 7e84bb7ede..b6bd4802fd 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift @@ -565,11 +565,11 @@ public func storageUsageController(context: AccountContext, cacheUsagePromise: P media[peerId] = categories } - var clearResourceIds = Set() + var clearResourceIds = Set() for id in clearMediaIds { if let ids = stats.mediaResourceIds[id] { for resourceId in ids { - clearResourceIds.insert(WrappedMediaResourceId(resourceId)) + clearResourceIds.insert(resourceId) } } } @@ -774,11 +774,11 @@ public func storageUsageController(context: AccountContext, cacheUsagePromise: P } } - var clearResourceIds = Set() + var clearResourceIds = Set() for id in clearMediaIds { if let ids = stats.mediaResourceIds[id] { for resourceId in ids { - clearResourceIds.insert(WrappedMediaResourceId(resourceId)) + clearResourceIds.insert(resourceId) } } } @@ -901,11 +901,11 @@ public func storageUsageController(context: AccountContext, cacheUsagePromise: P } } - var clearResourceIds = Set() + var clearResourceIds = Set() for id in clearMediaIds { if let ids = stats.mediaResourceIds[id] { for resourceId in ids { - clearResourceIds.insert(WrappedMediaResourceId(resourceId)) + clearResourceIds.insert(resourceId) } } } diff --git a/submodules/SettingsUI/Sources/Themes/ThemeGridControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeGridControllerNode.swift index cb9dd1e9f7..fad8b08ef3 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeGridControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeGridControllerNode.swift @@ -66,7 +66,7 @@ struct ThemeGridControllerEntry: Comparable, Identifiable { return .file(file.id, file.settings.colors, file.settings.intensity ?? 0) case let .image(representations, _): if let largest = largestImageRepresentation(representations) { - return .image(largest.resource.id.uniqueId) + return .image(largest.resource.id.stringRepresentation) } else { return .image("") } diff --git a/submodules/SlotMachineAnimationNode/Sources/SlotMachineAnimationNode.swift b/submodules/SlotMachineAnimationNode/Sources/SlotMachineAnimationNode.swift index e14f224e66..41e3e0db1f 100644 --- a/submodules/SlotMachineAnimationNode/Sources/SlotMachineAnimationNode.swift +++ b/submodules/SlotMachineAnimationNode/Sources/SlotMachineAnimationNode.swift @@ -312,7 +312,7 @@ class DiceAnimatedStickerNode: ASDisplayNode { case let .local(animationName): source = AnimatedStickerNodeLocalFileSource(name: animationName) case let .resource(account, resource): - source = AnimatedStickerResourceSource(account: account, resource: resource) + source = AnimatedStickerResourceSource(account: account, resource: resource._asResource()) } let playbackMode: AnimatedStickerPlaybackMode diff --git a/submodules/StickerResources/Sources/StickerResources.swift b/submodules/StickerResources/Sources/StickerResources.swift index a600bf4bca..ea6cf010ad 100644 --- a/submodules/StickerResources/Sources/StickerResources.swift +++ b/submodules/StickerResources/Sources/StickerResources.swift @@ -75,7 +75,7 @@ private func chatMessageStickerDatas(postbox: Postbox, file: TelegramMediaFile, } var fetchThumbnail: Disposable? - if !thumbnailResource.id.isEqual(to: resource.id) { + if thumbnailResource.id != resource.id { fetchThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() } let disposable = (combineLatest(thumbnailData, fullSizeData) @@ -126,7 +126,7 @@ public func chatMessageAnimatedStickerDatas(postbox: Postbox, file: TelegramMedi } var fetchThumbnail: Disposable? - if !thumbnailResource.id.isEqual(to: resource.id) { + if thumbnailResource.id != resource.id { fetchThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() } let disposable = (combineLatest(thumbnailData, fullSizeData) diff --git a/submodules/TelegramCore/Sources/MacOS/MacInternalUpdater.swift b/submodules/TelegramCore/Sources/MacOS/MacInternalUpdater.swift index ee2d9f5345..2863c172f1 100644 --- a/submodules/TelegramCore/Sources/MacOS/MacInternalUpdater.swift +++ b/submodules/TelegramCore/Sources/MacOS/MacInternalUpdater.swift @@ -116,7 +116,7 @@ public func downloadAppUpdate(account: Account, source: String, messageId: Int32 var dataDisposable: Disposable? var fetchDisposable: Disposable? var statusDisposable: Disposable? - let removeDisposable = account.postbox.mediaBox.removeCachedResources(Set([WrappedMediaResourceId(media.resource.id)])).start(completed: { + let removeDisposable = account.postbox.mediaBox.removeCachedResources(Set([media.resource.id])).start(completed: { let reference = MediaResourceReference.media(media: .message(message: MessageReference(message), media: media), resource: media.resource) fetchDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: reference).start() diff --git a/submodules/TelegramCore/Sources/Network/FetchedMediaResource.swift b/submodules/TelegramCore/Sources/Network/FetchedMediaResource.swift index 5bcfc3659f..065ce3e7ab 100644 --- a/submodules/TelegramCore/Sources/Network/FetchedMediaResource.swift +++ b/submodules/TelegramCore/Sources/Network/FetchedMediaResource.swift @@ -78,7 +78,7 @@ private func areResourcesEqual(_ lhs: MediaResource, _ rhs: MediaResource) -> Bo return true } } - return lhs.id.isEqual(to: rhs.id) + return lhs.id == rhs.id } private func findMediaResource(media: Media, previousMedia: Media?, resource: MediaResource) -> TelegramMediaResource? { @@ -89,12 +89,12 @@ private func findMediaResource(media: Media, previousMedia: Media?, resource: Me return representation.resource } } - if representation.resource.id.isEqual(to: resource.id) { + if representation.resource.id == resource.id { return representation.resource } } for representation in image.videoRepresentations { - if representation.resource.id.isEqual(to: resource.id) { + if representation.resource.id == resource.id { return representation.resource } } @@ -622,7 +622,7 @@ func revalidateMediaResourceReference(postbox: Postbox, network: Network, revali return .single(RevalidatedMediaResource(updatedResource: representation.resource, updatedReference: nil)) } } - if representation.resource.id.isEqual(to: resource.id) { + if representation.resource.id == resource.id { return .single(RevalidatedMediaResource(updatedResource: representation.resource, updatedReference: nil)) } } @@ -645,7 +645,7 @@ func revalidateMediaResourceReference(postbox: Postbox, network: Network, revali return .fail(.generic) } for representation in author.profileImageRepresentations { - if representation.resource.id.isEqual(to: resource.id) { + if representation.resource.id == resource.id { return .single(RevalidatedMediaResource(updatedResource: representation.resource, updatedReference: .avatar(peer: authorReference, resource: representation.resource))) } } @@ -667,7 +667,7 @@ func revalidateMediaResourceReference(postbox: Postbox, network: Network, revali switch wallpaper { case let .image(representations, _): for representation in representations { - if representation.resource.id.isEqual(to: resource.id) { + if representation.resource.id == resource.id { return .single(RevalidatedMediaResource(updatedResource: representation.resource, updatedReference: nil)) } } @@ -685,7 +685,7 @@ func revalidateMediaResourceReference(postbox: Postbox, network: Network, revali return revalidationContext.stickerPack(postbox: postbox, network: network, background: info.preferBackgroundReferenceRevalidation, stickerPack: packReference) |> mapToSignal { result -> Signal in if let thumbnail = result.0.thumbnail { - if thumbnail.resource.id.isEqual(to: resource.id) { + if thumbnail.resource.id == resource.id { return .single(RevalidatedMediaResource(updatedResource: thumbnail.resource, updatedReference: nil)) } if let _ = thumbnail.resource as? CloudStickerPackThumbnailMediaResource, let _ = resource as? CloudStickerPackThumbnailMediaResource { @@ -698,7 +698,7 @@ func revalidateMediaResourceReference(postbox: Postbox, network: Network, revali return revalidationContext.themes(postbox: postbox, network: network, background: info.preferBackgroundReferenceRevalidation) |> mapToSignal { themes -> Signal in for theme in themes { - if let file = theme.file, file.resource.id.isEqual(to: resource.id) { + if let file = theme.file, file.resource.id == resource.id { return .single(RevalidatedMediaResource(updatedResource: file.resource, updatedReference: nil)) } } diff --git a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift index 0265b043b2..7224d9f0c6 100644 --- a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift @@ -2599,7 +2599,7 @@ func replayFinalState( } } case let .DeleteMessagesWithGlobalIds(ids): - var resourceIds: [WrappedMediaResourceId] = [] + var resourceIds: [MediaResourceId] = [] transaction.deleteMessagesWithGlobalIds(ids, forEachMedia: { media in addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds) }) @@ -2616,7 +2616,7 @@ func replayFinalState( if let message = transaction.getMessage(id) { updatePeerChatInclusionWithMinTimestamp(transaction: transaction, id: id.peerId, minTimestamp: message.timestamp, forceRootGroupIfNotExists: false) } - var resourceIds: [WrappedMediaResourceId] = [] + var resourceIds: [MediaResourceId] = [] transaction.deleteMessagesInRange(peerId: id.peerId, namespace: id.namespace, minId: 1, maxId: id.id, forEachMedia: { media in addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds) }) diff --git a/submodules/TelegramCore/Sources/State/ApplyUpdateMessage.swift b/submodules/TelegramCore/Sources/State/ApplyUpdateMessage.swift index 50997bc665..4de1450257 100644 --- a/submodules/TelegramCore/Sources/State/ApplyUpdateMessage.swift +++ b/submodules/TelegramCore/Sources/State/ApplyUpdateMessage.swift @@ -32,7 +32,7 @@ func applyMediaResourceChanges(from: Media, to: Media, postbox: Postbox, force: if let fromPreview = smallestImageRepresentation(fromFile.previewRepresentations), let toPreview = smallestImageRepresentation(toFile.previewRepresentations) { copyOrMoveResourceData(from: fromPreview.resource, to: toPreview.resource, mediaBox: postbox.mediaBox) } - if let fromVideoThumbnail = fromFile.videoThumbnails.first, let toVideoThumbnail = toFile.videoThumbnails.first, fromVideoThumbnail.resource.id.uniqueId != toVideoThumbnail.resource.id.uniqueId { + if let fromVideoThumbnail = fromFile.videoThumbnails.first, let toVideoThumbnail = toFile.videoThumbnails.first, fromVideoThumbnail.resource.id != toVideoThumbnail.resource.id { copyOrMoveResourceData(from: fromVideoThumbnail.resource, to: toVideoThumbnail.resource, mediaBox: postbox.mediaBox) } if (force || fromFile.size == toFile.size || fromFile.resource.size == toFile.resource.size) && fromFile.mimeType == toFile.mimeType { diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_CloudFileMediaResource.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_CloudFileMediaResource.swift index e83573796a..b7f03e1974 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_CloudFileMediaResource.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_CloudFileMediaResource.swift @@ -1,7 +1,7 @@ import Foundation import Postbox -public struct CloudFileMediaResourceId: MediaResourceId, Hashable, Equatable { +public struct CloudFileMediaResourceId: Hashable, Equatable { let datacenterId: Int let volumeId: Int64 let localId: Int32 @@ -17,14 +17,6 @@ public struct CloudFileMediaResourceId: MediaResourceId, Hashable, Equatable { public var uniqueId: String { return "telegram-cloud-file-\(self.datacenterId)-\(self.volumeId)-\(self.localId)-\(self.secret)" } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? CloudFileMediaResourceId { - return self == to - } else { - return false - } - } } public final class CloudFileMediaResource: TelegramMediaResource { @@ -36,7 +28,7 @@ public final class CloudFileMediaResource: TelegramMediaResource { public let fileReference: Data? public var id: MediaResourceId { - return CloudFileMediaResourceId(datacenterId: self.datacenterId, volumeId: self.volumeId, localId: self.localId, secret: self.secret) + return MediaResourceId(CloudFileMediaResourceId(datacenterId: self.datacenterId, volumeId: self.volumeId, localId: self.localId, secret: self.secret).uniqueId) } public init(datacenterId: Int, volumeId: Int64, localId: Int32, secret: Int64, size: Int?, fileReference: Data?) { @@ -87,7 +79,7 @@ public final class CloudFileMediaResource: TelegramMediaResource { } } -public struct CloudPhotoSizeMediaResourceId: MediaResourceId, Hashable, Equatable { +public struct CloudPhotoSizeMediaResourceId: Hashable, Equatable { let datacenterId: Int32 let photoId: Int64 let sizeSpec: String @@ -101,14 +93,6 @@ public struct CloudPhotoSizeMediaResourceId: MediaResourceId, Hashable, Equatabl public var uniqueId: String { return "telegram-cloud-photo-size-\(self.datacenterId)-\(self.photoId)-\(self.sizeSpec)" } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? CloudPhotoSizeMediaResourceId { - return self == to - } else { - return false - } - } } public final class CloudPhotoSizeMediaResource: TelegramMediaResource { @@ -120,7 +104,7 @@ public final class CloudPhotoSizeMediaResource: TelegramMediaResource { public let fileReference: Data? public var id: MediaResourceId { - return CloudPhotoSizeMediaResourceId(datacenterId: Int32(self.datacenterId), photoId: self.photoId, sizeSpec: self.sizeSpec) + return MediaResourceId(CloudPhotoSizeMediaResourceId(datacenterId: Int32(self.datacenterId), photoId: self.photoId, sizeSpec: self.sizeSpec).uniqueId) } public init(datacenterId: Int32, photoId: Int64, accessHash: Int64, sizeSpec: String, size: Int?, fileReference: Data?) { @@ -171,7 +155,7 @@ public final class CloudPhotoSizeMediaResource: TelegramMediaResource { } } -public struct CloudDocumentSizeMediaResourceId: MediaResourceId, Hashable, Equatable { +public struct CloudDocumentSizeMediaResourceId: Hashable, Equatable { let datacenterId: Int32 let documentId: Int64 let sizeSpec: String @@ -185,14 +169,6 @@ public struct CloudDocumentSizeMediaResourceId: MediaResourceId, Hashable, Equat public var uniqueId: String { return "telegram-cloud-document-size-\(self.datacenterId)-\(self.documentId)-\(self.sizeSpec)" } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? CloudDocumentSizeMediaResourceId { - return self == to - } else { - return false - } - } } public final class CloudDocumentSizeMediaResource: TelegramMediaResource { @@ -203,7 +179,7 @@ public final class CloudDocumentSizeMediaResource: TelegramMediaResource { public let fileReference: Data? public var id: MediaResourceId { - return CloudDocumentSizeMediaResourceId(datacenterId: Int32(self.datacenterId), documentId: self.documentId, sizeSpec: self.sizeSpec) + return MediaResourceId(CloudDocumentSizeMediaResourceId(datacenterId: Int32(self.datacenterId), documentId: self.documentId, sizeSpec: self.sizeSpec).uniqueId) } public init(datacenterId: Int32, documentId: Int64, accessHash: Int64, sizeSpec: String, fileReference: Data?) { @@ -248,7 +224,7 @@ public enum CloudPeerPhotoSizeSpec: Int32 { case fullSize } -public struct CloudPeerPhotoSizeMediaResourceId: MediaResourceId, Hashable, Equatable { +public struct CloudPeerPhotoSizeMediaResourceId: Hashable, Equatable { let datacenterId: Int32 let photoId: Int64? let sizeSpec: CloudPeerPhotoSizeSpec @@ -270,14 +246,6 @@ public struct CloudPeerPhotoSizeMediaResourceId: MediaResourceId, Hashable, Equa return "telegram-peer-photo-size-\(self.datacenterId)-\(self.sizeSpec.rawValue)-\(self.volumeId ?? 0)-\(self.localId ?? 0)" } } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? CloudPeerPhotoSizeMediaResourceId { - return self == to - } else { - return false - } - } } public final class CloudPeerPhotoSizeMediaResource: TelegramMediaResource { @@ -288,7 +256,7 @@ public final class CloudPeerPhotoSizeMediaResource: TelegramMediaResource { public let localId: Int32? public var id: MediaResourceId { - return CloudPeerPhotoSizeMediaResourceId(datacenterId: Int32(self.datacenterId), photoId: self.photoId, sizeSpec: self.sizeSpec, volumeId: self.volumeId, localId: self.localId) + return MediaResourceId(CloudPeerPhotoSizeMediaResourceId(datacenterId: Int32(self.datacenterId), photoId: self.photoId, sizeSpec: self.sizeSpec, volumeId: self.volumeId, localId: self.localId).uniqueId) } public init(datacenterId: Int32, photoId: Int64?, sizeSpec: CloudPeerPhotoSizeSpec, volumeId: Int64?, localId: Int32?) { @@ -336,7 +304,7 @@ public final class CloudPeerPhotoSizeMediaResource: TelegramMediaResource { } } -public struct CloudStickerPackThumbnailMediaResourceId: MediaResourceId, Hashable, Equatable { +public struct CloudStickerPackThumbnailMediaResourceId: Hashable, Equatable { let datacenterId: Int32 let thumbVersion: Int32? let volumeId: Int64? @@ -356,14 +324,6 @@ public struct CloudStickerPackThumbnailMediaResourceId: MediaResourceId, Hashabl return "telegram-stickerpackthumbnail-\(self.datacenterId)-\(self.volumeId ?? 0)-\(self.localId ?? 0)" } } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? CloudStickerPackThumbnailMediaResourceId { - return self == to - } else { - return false - } - } } public final class CloudStickerPackThumbnailMediaResource: TelegramMediaResource { @@ -373,7 +333,7 @@ public final class CloudStickerPackThumbnailMediaResource: TelegramMediaResource public let localId: Int32? public var id: MediaResourceId { - return CloudStickerPackThumbnailMediaResourceId(datacenterId: Int32(self.datacenterId), thumbVersion: self.thumbVersion, volumeId: self.volumeId, localId: self.localId) + return MediaResourceId(CloudStickerPackThumbnailMediaResourceId(datacenterId: Int32(self.datacenterId), thumbVersion: self.thumbVersion, volumeId: self.volumeId, localId: self.localId).uniqueId) } public init(datacenterId: Int32, thumbVersion: Int32?, volumeId: Int64?, localId: Int32?) { @@ -418,7 +378,7 @@ public final class CloudStickerPackThumbnailMediaResource: TelegramMediaResource } } -public struct CloudDocumentMediaResourceId: MediaResourceId, Hashable, Equatable { +public struct CloudDocumentMediaResourceId: Hashable, Equatable { public let datacenterId: Int public let fileId: Int64 @@ -430,14 +390,6 @@ public struct CloudDocumentMediaResourceId: MediaResourceId, Hashable, Equatable public var uniqueId: String { return "telegram-cloud-document-\(self.datacenterId)-\(self.fileId)" } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? CloudDocumentMediaResourceId { - return self == to - } else { - return false - } - } } public final class CloudDocumentMediaResource: TelegramMediaResource { @@ -449,7 +401,7 @@ public final class CloudDocumentMediaResource: TelegramMediaResource { public let fileName: String? public var id: MediaResourceId { - return CloudDocumentMediaResourceId(datacenterId: self.datacenterId, fileId: self.fileId) + return MediaResourceId(CloudDocumentMediaResourceId(datacenterId: self.datacenterId, fileId: self.fileId).uniqueId) } public init(datacenterId: Int, fileId: Int64, accessHash: Int64, size: Int?, fileReference: Data?, fileName: String?) { @@ -504,20 +456,12 @@ public final class CloudDocumentMediaResource: TelegramMediaResource { } } -public struct LocalFileMediaResourceId: MediaResourceId, Hashable, Equatable { +public struct LocalFileMediaResourceId: Hashable, Equatable { public let fileId: Int64 public var uniqueId: String { return "telegram-local-file-\(self.fileId)" } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? LocalFileMediaResourceId { - return self == to - } else { - return false - } - } } public class LocalFileMediaResource: TelegramMediaResource, Codable { @@ -569,7 +513,7 @@ public class LocalFileMediaResource: TelegramMediaResource, Codable { } public var id: MediaResourceId { - return LocalFileMediaResourceId(fileId: self.fileId) + return MediaResourceId(LocalFileMediaResourceId(fileId: self.fileId).uniqueId) } public func isEqual(to: MediaResource) -> Bool { @@ -581,20 +525,12 @@ public class LocalFileMediaResource: TelegramMediaResource, Codable { } } -public struct LocalFileReferenceMediaResourceId: MediaResourceId, Hashable, Equatable { +public struct LocalFileReferenceMediaResourceId: Hashable, Equatable { public let randomId: Int64 public var uniqueId: String { return "local-file-\(self.randomId)" } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? LocalFileReferenceMediaResourceId { - return self == to - } else { - return false - } - } } public class LocalFileReferenceMediaResource: TelegramMediaResource { @@ -629,7 +565,7 @@ public class LocalFileReferenceMediaResource: TelegramMediaResource { } public var id: MediaResourceId { - return LocalFileReferenceMediaResourceId(randomId: self.randomId) + return MediaResourceId(LocalFileReferenceMediaResourceId(randomId: self.randomId).uniqueId) } public func isEqual(to: MediaResource) -> Bool { @@ -641,17 +577,9 @@ public class LocalFileReferenceMediaResource: TelegramMediaResource { } } -public struct HttpReferenceMediaResourceId: MediaResourceId, Hashable, Equatable { +public struct HttpReferenceMediaResourceId: Hashable, Equatable { public let url: String - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? HttpReferenceMediaResourceId { - return self == to - } else { - return false - } - } - public var uniqueId: String { return "http-\(persistentHash32(self.url))" } @@ -685,7 +613,7 @@ public final class HttpReferenceMediaResource: TelegramMediaResource { } public var id: MediaResourceId { - return HttpReferenceMediaResourceId(url: self.url) + return MediaResourceId(HttpReferenceMediaResourceId(url: self.url).uniqueId) } public func isEqual(to: MediaResource) -> Bool { @@ -697,19 +625,11 @@ public final class HttpReferenceMediaResource: TelegramMediaResource { } } -public struct WebFileReferenceMediaResourceId: MediaResourceId, Hashable, Equatable { +public struct WebFileReferenceMediaResourceId: Hashable, Equatable { public let url: String public let accessHash: Int64 public let size: Int32 - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? WebFileReferenceMediaResourceId { - return self == to - } else { - return false - } - } - public var uniqueId: String { return "proxy-\(persistentHash32(self.url))-\(size)-\(accessHash)" } @@ -739,7 +659,7 @@ public final class WebFileReferenceMediaResource: TelegramMediaResource { } public var id: MediaResourceId { - return WebFileReferenceMediaResourceId(url: self.url, accessHash: accessHash, size: self.size) + return MediaResourceId(WebFileReferenceMediaResourceId(url: self.url, accessHash: accessHash, size: self.size).uniqueId) } public func isEqual(to: MediaResource) -> Bool { @@ -752,7 +672,7 @@ public final class WebFileReferenceMediaResource: TelegramMediaResource { } -public struct SecretFileMediaResourceId: MediaResourceId, Hashable, Equatable { +public struct SecretFileMediaResourceId: Hashable, Equatable { public let fileId: Int64 public let datacenterId: Int32 @@ -764,14 +684,6 @@ public struct SecretFileMediaResourceId: MediaResourceId, Hashable, Equatable { self.fileId = fileId self.datacenterId = datacenterId } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? SecretFileMediaResourceId { - return self == to - } else { - return false - } - } } public final class SecretFileMediaResource: TelegramMediaResource { @@ -813,7 +725,7 @@ public final class SecretFileMediaResource: TelegramMediaResource { } public var id: MediaResourceId { - return SecretFileMediaResourceId(fileId: self.fileId, datacenterId: Int32(self.datacenterId)) + return MediaResourceId(SecretFileMediaResourceId(fileId: self.fileId, datacenterId: Int32(self.datacenterId)).uniqueId) } public func isEqual(to: MediaResource) -> Bool { @@ -843,7 +755,7 @@ public final class SecretFileMediaResource: TelegramMediaResource { } } -public struct EmptyMediaResourceId: MediaResourceId { +public struct EmptyMediaResourceId { public var uniqueId: String { return "empty-resource" } @@ -851,10 +763,6 @@ public struct EmptyMediaResourceId: MediaResourceId { public var hashValue: Int { return 0 } - - public func isEqual(to: MediaResourceId) -> Bool { - return to is EmptyMediaResourceId - } } public final class EmptyMediaResource: TelegramMediaResource { @@ -868,7 +776,7 @@ public final class EmptyMediaResource: TelegramMediaResource { } public var id: MediaResourceId { - return EmptyMediaResourceId() + return MediaResourceId(EmptyMediaResourceId().uniqueId) } public func isEqual(to: MediaResource) -> Bool { @@ -876,7 +784,7 @@ public final class EmptyMediaResource: TelegramMediaResource { } } -public struct WallpaperDataResourceId: MediaResourceId { +public struct WallpaperDataResourceId { public var uniqueId: String { return "wallpaper-\(self.slug)" } @@ -890,16 +798,6 @@ public struct WallpaperDataResourceId: MediaResourceId { public init(slug: String) { self.slug = slug } - - public func isEqual(to: MediaResourceId) -> Bool { - guard let to = to as? WallpaperDataResourceId else { - return false - } - if self.slug != to.slug { - return false - } - return true - } } public final class WallpaperDataResource: TelegramMediaResource { @@ -918,7 +816,7 @@ public final class WallpaperDataResource: TelegramMediaResource { } public var id: MediaResourceId { - return WallpaperDataResourceId(slug: self.slug) + return MediaResourceId(WallpaperDataResourceId(slug: self.slug).uniqueId) } public func isEqual(to: MediaResource) -> Bool { diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_SecureFileMediaResource.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_SecureFileMediaResource.swift index b55fcbab4d..46ab2166cd 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_SecureFileMediaResource.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_SecureFileMediaResource.swift @@ -1,7 +1,7 @@ import Foundation import Postbox -public struct SecureFileMediaResourceId: MediaResourceId { +public struct SecureFileMediaResourceId { public let fileId: Int64 public init(fileId: Int64) { @@ -15,21 +15,13 @@ public struct SecureFileMediaResourceId: MediaResourceId { public var hashValue: Int { return self.fileId.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? SecureFileMediaResourceId { - return self.fileId == to.fileId - } else { - return false - } - } } public final class SecureFileMediaResource: TelegramMediaResource { public let file: SecureIdFileReference public var id: MediaResourceId { - return SecureFileMediaResourceId(fileId: self.file.id) + return MediaResourceId(SecureFileMediaResourceId(fileId: self.file.id).uniqueId) } public var datacenterId: Int { diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaFile.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaFile.swift index d0430b1b78..5bfa7765c0 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaFile.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaFile.swift @@ -554,7 +554,7 @@ public final class TelegramMediaFile: Media, Equatable, Codable { return false } - if !self.resource.id.isEqual(to: other.resource.id) { + if self.resource.id != other.resource.id { return false } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaImage.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaImage.swift index 11c9c10d8c..c520f68477 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaImage.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaImage.swift @@ -340,7 +340,7 @@ public final class TelegramMediaImageRepresentation: PostboxCoding, Equatable, C if self.dimensions != other.dimensions { return false } - if !self.resource.id.isEqual(to: other.resource.id) { + if self.resource.id != other.resource.id { return false } if self.progressiveSizes != other.progressiveSizes { diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Data/PeerSummary.swift b/submodules/TelegramCore/Sources/TelegramEngine/Data/PeerSummary.swift index 405e09cd03..aa94a11570 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Data/PeerSummary.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Data/PeerSummary.swift @@ -1,6 +1,8 @@ import SwiftSignalKit import Postbox +public typealias EngineExportedPeerInvitation = ExportedInvitation + public extension TelegramEngine.EngineData.Item { enum Peer { public struct Peer: TelegramEngineDataItem, TelegramEngineMapKeyDataItem, PostboxViewDataItem { @@ -192,5 +194,39 @@ public extension TelegramEngine.EngineData.Item { } } } + + public struct ExportedInvitation: TelegramEngineDataItem, PostboxViewDataItem { + public typealias Result = Optional + + fileprivate var id: EnginePeer.Id + public var mapKey: EnginePeer.Id { + return self.id + } + + public init(id: EnginePeer.Id) { + self.id = id + } + + var key: PostboxViewKey { + return .cachedPeerData(peerId: self.id) + } + + func extract(view: PostboxView) -> Result { + guard let view = view as? CachedPeerDataView else { + preconditionFailure() + } + guard let cachedPeerData = view.cachedPeerData else { + return nil + } + switch cachedPeerData { + case let channel as CachedChannelData: + return channel.exportedInvitation + case let group as CachedGroupData: + return group.exportedInvitation + default: + return nil + } + } + } } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/DeleteMessages.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/DeleteMessages.swift index a2883c8696..7aacae2e6a 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/DeleteMessages.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/DeleteMessages.swift @@ -3,27 +3,27 @@ import Postbox import SwiftSignalKit import TelegramApi -func addMessageMediaResourceIdsToRemove(media: Media, resourceIds: inout [WrappedMediaResourceId]) { +func addMessageMediaResourceIdsToRemove(media: Media, resourceIds: inout [MediaResourceId]) { if let image = media as? TelegramMediaImage { for representation in image.representations { - resourceIds.append(WrappedMediaResourceId(representation.resource.id)) + resourceIds.append(representation.resource.id) } } else if let file = media as? TelegramMediaFile { for representation in file.previewRepresentations { - resourceIds.append(WrappedMediaResourceId(representation.resource.id)) + resourceIds.append(representation.resource.id) } - resourceIds.append(WrappedMediaResourceId(file.resource.id)) + resourceIds.append(file.resource.id) } } -func addMessageMediaResourceIdsToRemove(message: Message, resourceIds: inout [WrappedMediaResourceId]) { +func addMessageMediaResourceIdsToRemove(message: Message, resourceIds: inout [MediaResourceId]) { for media in message.media { addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds) } } public func _internal_deleteMessages(transaction: Transaction, mediaBox: MediaBox, ids: [MessageId], deleteMedia: Bool = true, manualAddMessageThreadStatsDifference: ((MessageId, Int, Int) -> Void)? = nil) { - var resourceIds: [WrappedMediaResourceId] = [] + var resourceIds: [MediaResourceId] = [] if deleteMedia { for id in ids { if id.peerId.namespace == Namespaces.Peer.SecretChat { @@ -57,7 +57,7 @@ public func _internal_deleteMessages(transaction: Transaction, mediaBox: MediaBo } func _internal_deleteAllMessagesWithAuthor(transaction: Transaction, mediaBox: MediaBox, peerId: PeerId, authorId: PeerId, namespace: MessageId.Namespace) { - var resourceIds: [WrappedMediaResourceId] = [] + var resourceIds: [MediaResourceId] = [] transaction.removeAllMessagesWithAuthor(peerId, authorId: authorId, namespace: namespace, forEachMedia: { media in addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds) }) @@ -67,7 +67,7 @@ func _internal_deleteAllMessagesWithAuthor(transaction: Transaction, mediaBox: M } func _internal_deleteAllMessagesWithForwardAuthor(transaction: Transaction, mediaBox: MediaBox, peerId: PeerId, forwardAuthorId: PeerId, namespace: MessageId.Namespace) { - var resourceIds: [WrappedMediaResourceId] = [] + var resourceIds: [MediaResourceId] = [] transaction.removeAllMessagesWithForwardAuthor(peerId, forwardAuthorId: forwardAuthorId, namespace: namespace, forEachMedia: { media in addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds) }) @@ -78,7 +78,7 @@ func _internal_deleteAllMessagesWithForwardAuthor(transaction: Transaction, medi func _internal_clearHistory(transaction: Transaction, mediaBox: MediaBox, peerId: PeerId, namespaces: MessageIdNamespaces) { if peerId.namespace == Namespaces.Peer.SecretChat { - var resourceIds: [WrappedMediaResourceId] = [] + var resourceIds: [MediaResourceId] = [] transaction.withAllMessages(peerId: peerId, { message in addMessageMediaResourceIdsToRemove(message: message, resourceIds: &resourceIds) return true diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/Media.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/Media.swift index 7006a32de6..54a7f7ecf7 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/Media.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/Media.swift @@ -1,17 +1,5 @@ import Postbox -public final class EngineMediaResource { - private let resource: MediaResource - - public init(_ resource: MediaResource) { - self.resource = resource - } - - public func _asResource() -> MediaResource { - return self.resource - } -} - public enum EngineMedia { public typealias Id = MediaId diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/ScheduledMessages.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/ScheduledMessages.swift index a8de35803b..ef1b48f563 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/ScheduledMessages.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/ScheduledMessages.swift @@ -103,7 +103,7 @@ func managedApplyPendingScheduledMessagesActions(postbox: Postbox, network: Netw }) |> then( postbox.transaction { transaction -> Void in - var resourceIds: [WrappedMediaResourceId] = [] + var resourceIds: [MediaResourceId] = [] transaction.deleteMessages([entry.id], forEachMedia: { media in addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds) }) diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift index 5a0c0c34a7..dd88d1b926 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift @@ -544,7 +544,7 @@ func _internal_fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPee }) if let minAvailableMessageId = minAvailableMessageId, minAvailableMessageIdUpdated { - var resourceIds: [WrappedMediaResourceId] = [] + var resourceIds: [MediaResourceId] = [] transaction.deleteMessagesInRange(peerId: peerId, namespace: minAvailableMessageId.namespace, minId: 1, maxId: minAvailableMessageId.id, forEachMedia: { media in addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds) }) diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Resources/CollectCacheUsageStats.swift b/submodules/TelegramCore/Sources/TelegramEngine/Resources/CollectCacheUsageStats.swift index ac0113da3b..fcd2900a7f 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Resources/CollectCacheUsageStats.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Resources/CollectCacheUsageStats.swift @@ -47,7 +47,7 @@ private enum CollectCacheUsageStatsError { private final class CacheUsageStatsState { var media: [PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]] = [:] var mediaResourceIds: [MediaId: [MediaResourceId]] = [:] - var allResourceIds = Set() + var allResourceIds = Set() var lowerBound: MessageIndex? var upperBound: MessageIndex? } @@ -61,10 +61,10 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a let state = Atomic(value: initialState) - let excludeResourceIds = account.postbox.transaction { transaction -> Set in - var result = Set() + let excludeResourceIds = account.postbox.transaction { transaction -> Set in + var result = Set() transaction.enumeratePreferencesEntries({ entry in - result.formUnion(entry.relatedResources.map(WrappedMediaResourceId.init)) + result.formUnion(entry.relatedResources) return true }) return result @@ -85,7 +85,7 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a } } - var resourceIdToMediaId: [WrappedMediaResourceId: (MediaId, PeerCacheUsageCategory)] = [:] + var resourceIdToMediaId: [MediaResourceId: (MediaId, PeerCacheUsageCategory)] = [:] var mediaResourceIds: [MediaId: [MediaResourceId]] = [:] var resourceIds: [MediaResourceId] = [] for (id, media) in mediaRefs { @@ -112,7 +112,7 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a if let image = media as? TelegramMediaImage { for representation in image.representations { resourceIds.append(representation.resource.id) - resourceIdToMediaId[WrappedMediaResourceId(representation.resource.id)] = (id, .image) + resourceIdToMediaId[representation.resource.id] = (id, .image) mediaResourceIds[id]!.append(representation.resource.id) } } else if let file = media as? TelegramMediaFile { @@ -131,11 +131,11 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a } for representation in file.previewRepresentations { resourceIds.append(representation.resource.id) - resourceIdToMediaId[WrappedMediaResourceId(representation.resource.id)] = (id, category) + resourceIdToMediaId[representation.resource.id] = (id, category) mediaResourceIds[id]!.append(representation.resource.id) } resourceIds.append(file.resource.id) - resourceIdToMediaId[WrappedMediaResourceId(file.resource.id)] = (id, category) + resourceIdToMediaId[file.resource.id] = (id, category) mediaResourceIds[id]!.append(file.resource.id) } } @@ -165,13 +165,13 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a for (id, ids) in mediaResourceIds { state.mediaResourceIds[id] = ids for resourceId in ids { - state.allResourceIds.insert(WrappedMediaResourceId(resourceId)) + state.allResourceIds.insert(resourceId) } } } if updatedLowerBound == nil { if peerId != nil { - let (finalMedia, finalMediaResourceIds, _) = state.with { state -> ([PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]], [MediaId: [MediaResourceId]], Set) in + let (finalMedia, finalMediaResourceIds, _) = state.with { state -> ([PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]], [MediaId: [MediaResourceId]], Set) in return (state.media, state.mediaResourceIds, state.allResourceIds) } return account.postbox.transaction { transaction -> CacheUsageStats in @@ -191,7 +191,7 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a } } - let (finalMedia, finalMediaResourceIds, allResourceIds) = state.with { state -> ([PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]], [MediaId: [MediaResourceId]], Set) in + let (finalMedia, finalMediaResourceIds, allResourceIds) = state.with { state -> ([PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]], [MediaId: [MediaResourceId]], Set) in return (state.media, state.mediaResourceIds, state.allResourceIds) } @@ -290,6 +290,6 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a } } -func _internal_clearCachedMediaResources(account: Account, mediaResourceIds: Set) -> Signal { +func _internal_clearCachedMediaResources(account: Account, mediaResourceIds: Set) -> Signal { return account.postbox.mediaBox.removeCachedResources(mediaResourceIds) } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Resources/TelegramEngineResources.swift b/submodules/TelegramCore/Sources/TelegramEngine/Resources/TelegramEngineResources.swift index 726005cae6..5dcfd5b96e 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Resources/TelegramEngineResources.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Resources/TelegramEngineResources.swift @@ -1,6 +1,150 @@ +import Foundation import SwiftSignalKit import Postbox +public final class EngineMediaResource: Equatable { + public struct ByteRange { + public enum Priority { + case `default` + case elevated + case maximum + } + + public var range: Range + public var priority: Priority + + public init(range: Range, priority: Priority) { + self.range = range + self.priority = priority + } + } + + public final class Fetch { + public enum Result { + case dataPart(resourceOffset: Int, data: Data, range: Range, complete: Bool) + case resourceSizeUpdated(Int) + case progressUpdated(Float) + case replaceHeader(data: Data, range: Range) + case moveLocalFile(path: String) + case moveTempFile(file: TempBoxFile) + case copyLocalItem(MediaResourceDataFetchCopyLocalItem) + case reset + } + + public enum Error { + case generic + } + + public let signal: ( + Signal<[EngineMediaResource.ByteRange], NoError> + ) -> Signal + + public init(_ signal: @escaping ( + Signal<[EngineMediaResource.ByteRange], NoError> + ) -> Signal) { + self.signal = signal + } + } + + public final class ResourceData { + public let path: String + public let availableSize: Int + public let isComplete: Bool + + public init( + path: String, + availableSize: Int, + isComplete: Bool + ) { + self.path = path + self.availableSize = availableSize + self.isComplete = isComplete + } + } + + public struct Id: Equatable, Hashable { + public var stringRepresentation: String + + public init(_ stringRepresentation: String) { + self.stringRepresentation = stringRepresentation + } + + public init(_ id: MediaResourceId) { + self.stringRepresentation = id.stringRepresentation + } + } + + private let resource: MediaResource + + public init(_ resource: MediaResource) { + self.resource = resource + } + + public func _asResource() -> MediaResource { + return self.resource + } + + public var id: Id { + return Id(self.resource.id) + } + + public static func ==(lhs: EngineMediaResource, rhs: EngineMediaResource) -> Bool { + return lhs.resource.isEqual(to: rhs.resource) + } +} + +public extension MediaResource { + func fetch(engine: TelegramEngine, parameters: MediaResourceFetchParameters?) -> EngineMediaResource.Fetch { + return EngineMediaResource.Fetch { ranges in + return Signal { subscriber in + return engine.account.postbox.mediaBox.fetchResource!( + self, + ranges |> map { ranges -> [(Range, MediaBoxFetchPriority)] in + return ranges.map { range -> (Range, MediaBoxFetchPriority) in + let mappedPriority: MediaBoxFetchPriority + switch range.priority { + case .default: + mappedPriority = .default + case .elevated: + mappedPriority = .elevated + case .maximum: + mappedPriority = .maximum + } + return (range.range, mappedPriority) + } + }, + parameters + ).start(next: { result in + let mappedResult: EngineMediaResource.Fetch.Result + switch result { + case let .dataPart(resourceOffset, data, range, complete): + mappedResult = .dataPart(resourceOffset: resourceOffset, data: data, range: range, complete: complete) + case let .resourceSizeUpdated(size): + mappedResult = .resourceSizeUpdated(size) + case let .progressUpdated(progress): + mappedResult = .progressUpdated(progress) + case let .replaceHeader(data, range): + mappedResult = .replaceHeader(data: data, range: range) + case let .moveLocalFile(path): + mappedResult = .moveLocalFile(path: path) + case let .moveTempFile(file): + mappedResult = .moveTempFile(file: file) + case let .copyLocalItem(item): + mappedResult = .copyLocalItem(item) + case .reset: + mappedResult = .reset + } + subscriber.putNext(mappedResult) + }, error: { _ in + subscriber.putError(.generic) + }, completed: { + subscriber.putCompletion() + }) + } + } + } +} + public extension TelegramEngine { final class Resources { private let account: Account @@ -17,8 +161,20 @@ public extension TelegramEngine { return _internal_collectCacheUsageStats(account: self.account, peerId: peerId, additionalCachePaths: additionalCachePaths, logFilesPath: logFilesPath) } - public func clearCachedMediaResources(mediaResourceIds: Set) -> Signal { + public func clearCachedMediaResources(mediaResourceIds: Set) -> Signal { return _internal_clearCachedMediaResources(account: self.account, mediaResourceIds: mediaResourceIds) } + + public func data(id: String) -> Signal { + preconditionFailure() + } + + public func fetch(id: String, fetch: EngineMediaResource.Fetch) -> Signal { + preconditionFailure() + } + + public func cancelAllFetches(id: String) { + preconditionFailure() + } } } diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 36cb6e6be9..c4b36cc6b4 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -9075,11 +9075,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G media[peerId] = categories } - var clearResourceIds = Set() + var clearResourceIds = Set() for id in clearMediaIds { if let ids = stats.mediaResourceIds[id] { for resourceId in ids { - clearResourceIds.insert(WrappedMediaResourceId(resourceId)) + clearResourceIds.insert(resourceId) } } } diff --git a/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift index cfc01ba572..37d268c64f 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift @@ -179,14 +179,14 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { if let file = media as? TelegramMediaFile { updatedFile = file if let previousFile = previousFile { - updatedMedia = !previousFile.resource.id.isEqual(to: file.resource.id) + updatedMedia = previousFile.resource.id != file.resource.id } else if previousFile == nil { updatedMedia = true } } else if let webPage = media as? TelegramMediaWebpage, case let .Loaded(content) = webPage.content, let file = content.file { updatedFile = file if let previousFile = previousFile { - updatedMedia = !previousFile.resource.id.isEqual(to: file.resource.id) + updatedMedia = previousFile.resource.id != file.resource.id } else if previousFile == nil { updatedMedia = true } diff --git a/submodules/TelegramUI/Sources/EmojiResources.swift b/submodules/TelegramUI/Sources/EmojiResources.swift index a16daab35d..888ea99591 100644 --- a/submodules/TelegramUI/Sources/EmojiResources.swift +++ b/submodules/TelegramUI/Sources/EmojiResources.swift @@ -10,7 +10,7 @@ import Emoji import AppBundle import AccountContext -public struct EmojiThumbnailResourceId: MediaResourceId { +public struct EmojiThumbnailResourceId { public let emoji: String public var uniqueId: String { @@ -20,14 +20,6 @@ public struct EmojiThumbnailResourceId: MediaResourceId { public var hashValue: Int { return self.emoji.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? EmojiThumbnailResourceId { - return self.emoji == to.emoji - } else { - return false - } - } } public class EmojiThumbnailResource: TelegramMediaResource { @@ -46,7 +38,7 @@ public class EmojiThumbnailResource: TelegramMediaResource { } public var id: MediaResourceId { - return EmojiThumbnailResourceId(emoji: self.emoji) + return MediaResourceId(EmojiThumbnailResourceId(emoji: self.emoji).uniqueId) } public func isEqual(to: MediaResource) -> Bool { @@ -58,7 +50,7 @@ public class EmojiThumbnailResource: TelegramMediaResource { } } -public struct EmojiSpriteResourceId: MediaResourceId { +public struct EmojiSpriteResourceId { public let packId: UInt8 public let stickerId: UInt8 @@ -69,14 +61,6 @@ public struct EmojiSpriteResourceId: MediaResourceId { public var hashValue: Int { return self.packId.hashValue &* 31 &+ self.stickerId.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? EmojiSpriteResourceId { - return self.packId == to.packId && self.stickerId == to.stickerId - } else { - return false - } - } } public class EmojiSpriteResource: TelegramMediaResource { @@ -99,7 +83,7 @@ public class EmojiSpriteResource: TelegramMediaResource { } public var id: MediaResourceId { - return EmojiSpriteResourceId(packId: self.packId, stickerId: self.stickerId) + return MediaResourceId(EmojiSpriteResourceId(packId: self.packId, stickerId: self.stickerId).uniqueId) } public func isEqual(to: MediaResource) -> Bool { diff --git a/submodules/TelegramUI/Sources/FetchCachedRepresentations.swift b/submodules/TelegramUI/Sources/FetchCachedRepresentations.swift index 36b87087c2..5284b1a36f 100644 --- a/submodules/TelegramUI/Sources/FetchCachedRepresentations.swift +++ b/submodules/TelegramUI/Sources/FetchCachedRepresentations.swift @@ -698,7 +698,7 @@ private func fetchEmojiRepresentation(account: Account, resource: MediaResource, private func fetchAnimatedStickerFirstFrameRepresentation(account: Account, resource: MediaResource, resourceData: MediaResourceData, representation: CachedAnimatedStickerFirstFrameRepresentation) -> Signal { return Signal({ subscriber in if let data = try? Data(contentsOf: URL(fileURLWithPath: resourceData.path), options: [.mappedIfSafe]) { - return fetchCompressedLottieFirstFrameAJpeg(data: data, size: CGSize(width: CGFloat(representation.width), height: CGFloat(representation.height)), fitzModifier: representation.fitzModifier, cacheKey: "\(resource.id.uniqueId)-\(representation.uniqueId)").start(next: { file in + return fetchCompressedLottieFirstFrameAJpeg(data: data, size: CGSize(width: CGFloat(representation.width), height: CGFloat(representation.height)), fitzModifier: representation.fitzModifier, cacheKey: "\(resource.id.stringRepresentation)-\(representation.uniqueId)").start(next: { file in subscriber.putNext(.tempFile(file)) subscriber.putCompletion() }) @@ -713,7 +713,7 @@ private func fetchAnimatedStickerRepresentation(account: Account, resource: Medi return Signal({ subscriber in if let data = try? Data(contentsOf: URL(fileURLWithPath: resourceData.path), options: [.mappedIfSafe]) { if #available(iOS 9.0, *) { - return experimentalConvertCompressedLottieToCombinedMp4(data: data, size: CGSize(width: CGFloat(representation.width), height: CGFloat(representation.height)), fitzModifier: representation.fitzModifier, cacheKey: "\(resource.id.uniqueId)-\(representation.uniqueId)").start(next: { value in + return experimentalConvertCompressedLottieToCombinedMp4(data: data, size: CGSize(width: CGFloat(representation.width), height: CGFloat(representation.height)), fitzModifier: representation.fitzModifier, cacheKey: "\(resource.id.stringRepresentation)-\(representation.uniqueId)").start(next: { value in subscriber.putNext(value) }, completed: { subscriber.putCompletion() diff --git a/submodules/TelegramUI/Sources/FetchManager.swift b/submodules/TelegramUI/Sources/FetchManager.swift index 028bf0d04f..26fef02594 100644 --- a/submodules/TelegramUI/Sources/FetchManager.swift +++ b/submodules/TelegramUI/Sources/FetchManager.swift @@ -16,7 +16,7 @@ private struct FetchManagerLocationEntryId: Hashable { if lhs.location != rhs.location { return false } - if !lhs.resourceId.isEqual(to: rhs.resourceId) { + if lhs.resourceId != rhs.resourceId { return false } if lhs.locationKey != rhs.locationKey { @@ -388,7 +388,7 @@ private final class FetchManagerCategoryContext { var id: FetchManagerLocationEntryId = entryId if self.entries[id] == nil { for (key, _) in self.entries { - if key.resourceId.isEqual(to: entryId.resourceId) { + if key.resourceId == entryId.resourceId { id = key break } diff --git a/submodules/TelegramUI/Sources/ICloudResources.swift b/submodules/TelegramUI/Sources/ICloudResources.swift index 0e90fb30df..66ee851431 100644 --- a/submodules/TelegramUI/Sources/ICloudResources.swift +++ b/submodules/TelegramUI/Sources/ICloudResources.swift @@ -7,7 +7,7 @@ import Display import Pdf import AVFoundation -public struct ICloudFileResourceId: MediaResourceId { +public struct ICloudFileResourceId { public let urlData: String public let thumbnail: Bool @@ -22,14 +22,6 @@ public struct ICloudFileResourceId: MediaResourceId { public var hashValue: Int { return self.uniqueId.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? ICloudFileResourceId { - return self.urlData == to.urlData - } else { - return false - } - } } public class ICloudFileResource: TelegramMediaResource { @@ -52,7 +44,7 @@ public class ICloudFileResource: TelegramMediaResource { } public var id: MediaResourceId { - return ICloudFileResourceId(urlData: self.urlData, thumbnail: self.thumbnail) + return MediaResourceId(ICloudFileResourceId(urlData: self.urlData, thumbnail: self.thumbnail).uniqueId) } public func isEqual(to: MediaResource) -> Bool { diff --git a/submodules/TelegramUI/Sources/ManagedDiceAnimationNode.swift b/submodules/TelegramUI/Sources/ManagedDiceAnimationNode.swift index aa7814072d..6c2461ec0e 100644 --- a/submodules/TelegramUI/Sources/ManagedDiceAnimationNode.swift +++ b/submodules/TelegramUI/Sources/ManagedDiceAnimationNode.swift @@ -29,9 +29,9 @@ private func animationItem(account: Account, emojis: Signal<[TelegramMediaFile], if let _ = account.postbox.mediaBox.completedResourcePath(file.resource) { if immediate { - return .single(ManagedAnimationItem(source: .resource(account, file.resource), frames: .still(.end), duration: 0)) + return .single(ManagedAnimationItem(source: .resource(account, EngineMediaResource(file.resource)), frames: .still(.end), duration: 0)) } else { - return .single(ManagedAnimationItem(source: .resource(account, file.resource), loop: loop, callbacks: callbacks)) + return .single(ManagedAnimationItem(source: .resource(account, EngineMediaResource(file.resource)), loop: loop, callbacks: callbacks)) } } else { let dimensions = file.dimensions ?? PixelDimensions(width: 512, height: 512) @@ -44,7 +44,7 @@ private func animationItem(account: Account, emojis: Signal<[TelegramMediaFile], |> filter { data in return data.complete }).start(next: { next in - subscriber.putNext(ManagedAnimationItem(source: .resource(account, file.resource), loop: loop, callbacks: callbacks)) + subscriber.putNext(ManagedAnimationItem(source: .resource(account, EngineMediaResource(file.resource)), loop: loop, callbacks: callbacks)) subscriber.putCompletion() }) diff --git a/submodules/TelegramUI/Sources/NotificationContentContext.swift b/submodules/TelegramUI/Sources/NotificationContentContext.swift index e7a3058301..78c307e492 100644 --- a/submodules/TelegramUI/Sources/NotificationContentContext.swift +++ b/submodules/TelegramUI/Sources/NotificationContentContext.swift @@ -188,13 +188,13 @@ public final class NotificationViewControllerImpl { let mediaBoxPath = accountsPath + "/" + accountRecordIdPathName(AccountRecordId(rawValue: accountIdValue)) + "/postbox/media" - if let data = try? Data(contentsOf: URL(fileURLWithPath: mediaBoxPath + "/\(largestRepresentation.resource.id.uniqueId)"), options: .mappedRead) { + if let data = try? Data(contentsOf: URL(fileURLWithPath: mediaBoxPath + "/\(largestRepresentation.resource.id.stringRepresentation)"), options: .mappedRead) { self.imageNode.setSignal(chatMessagePhotoInternal(photoData: .single(Tuple(nil, data, .full, true))) |> map { $0.2 }) return } - if let data = try? Data(contentsOf: URL(fileURLWithPath: mediaBoxPath + "/\(thumbnailRepresentation.resource.id.uniqueId)"), options: .mappedRead) { + if let data = try? Data(contentsOf: URL(fileURLWithPath: mediaBoxPath + "/\(thumbnailRepresentation.resource.id.stringRepresentation)"), options: .mappedRead) { self.imageNode.setSignal(chatMessagePhotoInternal(photoData: .single(Tuple(data, nil, .medium, false))) |> map { $0.2 }) } diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift index b282277da7..ce8d815331 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift @@ -375,11 +375,11 @@ final class PeerInfoAvatarTransformContainerNode: ASDisplayNode { overrideImage = .deletedIcon } else if let previousItem = previousItem, item == nil { if case let .image(_, representations, _, _) = previousItem, let rep = representations.last { - self.removedPhotoResourceIds.insert(rep.representation.resource.id.uniqueId) + self.removedPhotoResourceIds.insert(rep.representation.resource.id.stringRepresentation) } overrideImage = AvatarNodeImageOverride.none item = nil - } else if let rep = peer.profileImageRepresentations.last, self.removedPhotoResourceIds.contains(rep.resource.id.uniqueId) { + } else if let rep = peer.profileImageRepresentations.last, self.removedPhotoResourceIds.contains(rep.resource.id.stringRepresentation) { overrideImage = AvatarNodeImageOverride.none item = nil } @@ -680,11 +680,11 @@ final class PeerInfoEditingAvatarNode: ASDisplayNode { overrideImage = .editAvatarIcon } else if let previousItem = previousItem, item == nil { if case let .image(_, representations, _, _) = previousItem, let rep = representations.last { - self.removedPhotoResourceIds.insert(rep.representation.resource.id.uniqueId) + self.removedPhotoResourceIds.insert(rep.representation.resource.id.stringRepresentation) } overrideImage = AvatarNodeImageOverride.none item = nil - } else if let rep = peer.profileImageRepresentations.last, self.removedPhotoResourceIds.contains(rep.resource.id.uniqueId) { + } else if let rep = peer.profileImageRepresentations.last, self.removedPhotoResourceIds.contains(rep.resource.id.stringRepresentation) { overrideImage = AvatarNodeImageOverride.none item = nil } else { diff --git a/submodules/TelegramUI/Sources/SoftwareVideoLayerFrameManager.swift b/submodules/TelegramUI/Sources/SoftwareVideoLayerFrameManager.swift index 14b1377219..007ddb0013 100644 --- a/submodules/TelegramUI/Sources/SoftwareVideoLayerFrameManager.swift +++ b/submodules/TelegramUI/Sources/SoftwareVideoLayerFrameManager.swift @@ -67,7 +67,7 @@ final class SoftwareVideoLayerFrameManager { if let resource = resource as? WebFileReferenceMediaResource { return resource.url } else { - return resource.id.uniqueId + return resource.id.stringRepresentation } } Logger.shared.log("SoftwareVideo", "load video from \(stringForResource(self.resource)) or \(stringForResource(self.secondaryResource))") diff --git a/submodules/TelegramUniversalVideoContent/Sources/YoutubeEmbedImplementation.swift b/submodules/TelegramUniversalVideoContent/Sources/YoutubeEmbedImplementation.swift index 454ea52507..a894b1f444 100644 --- a/submodules/TelegramUniversalVideoContent/Sources/YoutubeEmbedImplementation.swift +++ b/submodules/TelegramUniversalVideoContent/Sources/YoutubeEmbedImplementation.swift @@ -383,7 +383,7 @@ final class YoutubeEmbedImplementation: WebEmbedImplementation { } } -public struct YoutubeEmbedStoryboardMediaResourceId: MediaResourceId { +public struct YoutubeEmbedStoryboardMediaResourceId { public let videoId: String public let storyboardId: Int32 @@ -394,14 +394,6 @@ public struct YoutubeEmbedStoryboardMediaResourceId: MediaResourceId { public var hashValue: Int { return self.uniqueId.hashValue } - - public func isEqual(to: MediaResourceId) -> Bool { - if let to = to as? YoutubeEmbedStoryboardMediaResourceId { - return self.videoId == to.videoId && self.storyboardId == to.storyboardId - } else { - return false - } - } } public class YoutubeEmbedStoryboardMediaResource: TelegramMediaResource { @@ -428,7 +420,7 @@ public class YoutubeEmbedStoryboardMediaResource: TelegramMediaResource { } public var id: MediaResourceId { - return YoutubeEmbedStoryboardMediaResourceId(videoId: self.videoId, storyboardId: self.storyboardId) + return MediaResourceId(YoutubeEmbedStoryboardMediaResourceId(videoId: self.videoId, storyboardId: self.storyboardId).uniqueId) } public func isEqual(to: MediaResource) -> Bool {