mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-07 14:53:35 +00:00
Refactoring
This commit is contained in:
parent
54841cc6fb
commit
7140c69dbf
@ -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)
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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<PresentationData, NoError>)? = nil, peerId: PeerId, invite: ExportedInvitation?, completion: ((ExportedInvitation?) -> Void)? = nil) -> ViewController {
|
||||
public func inviteLinkEditController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)? = nil, peerId: EnginePeer.Id, invite: ExportedInvitation?, completion: ((ExportedInvitation?) -> Void)? = nil) -> ViewController {
|
||||
var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)?
|
||||
let actionsDisposable = DisposableSet()
|
||||
|
||||
|
||||
@ -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<PresentationData, NoError>)? = nil, peerId: PeerId, parentNavigationController: NavigationController?) {
|
||||
public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)? = 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
|
||||
|
||||
|
||||
@ -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<PresentationData, NoError>)? = nil, peerId: PeerId, admin: ExportedInvitationCreator?) -> ViewController {
|
||||
public func inviteLinkListController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)? = 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<ExportedInvitation?, NoError>
|
||||
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<ExportedInvitation?, NoError> 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<PeerInvitationImportersState?>(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))
|
||||
}
|
||||
|
||||
@ -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<PresentationData>()
|
||||
|
||||
public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)? = nil, peerId: PeerId, invite: ExportedInvitation, invitationsContext: PeerExportedInvitationsContext?, revokedInvitationsContext: PeerExportedInvitationsContext?, importersContext: PeerInvitationImportersContext?) {
|
||||
public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)? = 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
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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<Int>, MediaBoxFetchPriority)], NoError>, MediaResourceFetchParameters?) -> Signal<MediaResourceDataFetchResult, MediaResourceDataFetchError>>()
|
||||
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<WrappedMediaResourceId>, combinedExcludeIds: Set<WrappedMediaResourceId>) -> Signal<(Int64, [String], Int64), NoError> {
|
||||
public func collectOtherResourceUsage(excludeIds: Set<MediaResourceId>, combinedExcludeIds: Set<MediaResourceId>) -> Signal<(Int64, [String], Int64), NoError> {
|
||||
return Signal { subscriber in
|
||||
self.dataQueue.async {
|
||||
var result: Int64 = 0
|
||||
|
||||
var excludeNames = Set<String>()
|
||||
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<String>()
|
||||
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<WrappedMediaResourceId>, force: Bool = false) -> Signal<Void, NoError> {
|
||||
public func removeCachedResources(_ ids: Set<MediaResourceId>, force: Bool = false) -> Signal<Void, NoError> {
|
||||
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)
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -565,11 +565,11 @@ public func storageUsageController(context: AccountContext, cacheUsagePromise: P
|
||||
media[peerId] = categories
|
||||
}
|
||||
|
||||
var clearResourceIds = Set<WrappedMediaResourceId>()
|
||||
var clearResourceIds = Set<MediaResourceId>()
|
||||
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<WrappedMediaResourceId>()
|
||||
var clearResourceIds = Set<MediaResourceId>()
|
||||
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<WrappedMediaResourceId>()
|
||||
var clearResourceIds = Set<MediaResourceId>()
|
||||
for id in clearMediaIds {
|
||||
if let ids = stats.mediaResourceIds[id] {
|
||||
for resourceId in ids {
|
||||
clearResourceIds.insert(WrappedMediaResourceId(resourceId))
|
||||
clearResourceIds.insert(resourceId)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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("")
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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<RevalidatedMediaResource, RevalidateMediaReferenceError> 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<RevalidatedMediaResource, RevalidateMediaReferenceError> 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))
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
})
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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<EngineExportedPeerInvitation>
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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)
|
||||
})
|
||||
|
||||
@ -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)
|
||||
})
|
||||
|
||||
@ -47,7 +47,7 @@ private enum CollectCacheUsageStatsError {
|
||||
private final class CacheUsageStatsState {
|
||||
var media: [PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]] = [:]
|
||||
var mediaResourceIds: [MediaId: [MediaResourceId]] = [:]
|
||||
var allResourceIds = Set<WrappedMediaResourceId>()
|
||||
var allResourceIds = Set<MediaResourceId>()
|
||||
var lowerBound: MessageIndex?
|
||||
var upperBound: MessageIndex?
|
||||
}
|
||||
@ -61,10 +61,10 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a
|
||||
|
||||
let state = Atomic<CacheUsageStatsState>(value: initialState)
|
||||
|
||||
let excludeResourceIds = account.postbox.transaction { transaction -> Set<WrappedMediaResourceId> in
|
||||
var result = Set<WrappedMediaResourceId>()
|
||||
let excludeResourceIds = account.postbox.transaction { transaction -> Set<MediaResourceId> in
|
||||
var result = Set<MediaResourceId>()
|
||||
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<WrappedMediaResourceId>) in
|
||||
let (finalMedia, finalMediaResourceIds, _) = state.with { state -> ([PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]], [MediaId: [MediaResourceId]], Set<MediaResourceId>) 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<WrappedMediaResourceId>) in
|
||||
let (finalMedia, finalMediaResourceIds, allResourceIds) = state.with { state -> ([PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]], [MediaId: [MediaResourceId]], Set<MediaResourceId>) 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<WrappedMediaResourceId>) -> Signal<Void, NoError> {
|
||||
func _internal_clearCachedMediaResources(account: Account, mediaResourceIds: Set<MediaResourceId>) -> Signal<Void, NoError> {
|
||||
return account.postbox.mediaBox.removeCachedResources(mediaResourceIds)
|
||||
}
|
||||
|
||||
@ -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<Int>
|
||||
public var priority: Priority
|
||||
|
||||
public init(range: Range<Int>, priority: Priority) {
|
||||
self.range = range
|
||||
self.priority = priority
|
||||
}
|
||||
}
|
||||
|
||||
public final class Fetch {
|
||||
public enum Result {
|
||||
case dataPart(resourceOffset: Int, data: Data, range: Range<Int>, complete: Bool)
|
||||
case resourceSizeUpdated(Int)
|
||||
case progressUpdated(Float)
|
||||
case replaceHeader(data: Data, range: Range<Int>)
|
||||
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<Result, Error>
|
||||
|
||||
public init(_ signal: @escaping (
|
||||
Signal<[EngineMediaResource.ByteRange], NoError>
|
||||
) -> Signal<Result, Error>) {
|
||||
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<Int>, MediaBoxFetchPriority)] in
|
||||
return ranges.map { range -> (Range<Int>, 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<WrappedMediaResourceId>) -> Signal<Void, NoError> {
|
||||
public func clearCachedMediaResources(mediaResourceIds: Set<MediaResourceId>) -> Signal<Void, NoError> {
|
||||
return _internal_clearCachedMediaResources(account: self.account, mediaResourceIds: mediaResourceIds)
|
||||
}
|
||||
|
||||
public func data(id: String) -> Signal<EngineMediaResource.ResourceData, NoError> {
|
||||
preconditionFailure()
|
||||
}
|
||||
|
||||
public func fetch(id: String, fetch: EngineMediaResource.Fetch) -> Signal<Never, NoError> {
|
||||
preconditionFailure()
|
||||
}
|
||||
|
||||
public func cancelAllFetches(id: String) {
|
||||
preconditionFailure()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -9075,11 +9075,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
media[peerId] = categories
|
||||
}
|
||||
|
||||
var clearResourceIds = Set<WrappedMediaResourceId>()
|
||||
var clearResourceIds = Set<MediaResourceId>()
|
||||
for id in clearMediaIds {
|
||||
if let ids = stats.mediaResourceIds[id] {
|
||||
for resourceId in ids {
|
||||
clearResourceIds.insert(WrappedMediaResourceId(resourceId))
|
||||
clearResourceIds.insert(resourceId)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -698,7 +698,7 @@ private func fetchEmojiRepresentation(account: Account, resource: MediaResource,
|
||||
private func fetchAnimatedStickerFirstFrameRepresentation(account: Account, resource: MediaResource, resourceData: MediaResourceData, representation: CachedAnimatedStickerFirstFrameRepresentation) -> Signal<CachedMediaResourceRepresentationResult, NoError> {
|
||||
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()
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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()
|
||||
})
|
||||
|
||||
|
||||
@ -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 })
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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))")
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user