From f8235ff4bf187fec95d972756b6a6e66efa7cd7a Mon Sep 17 00:00:00 2001 From: Jerome Chan Date: Wed, 5 Apr 2023 13:04:10 +0800 Subject: [PATCH] Added logic to use an internal SpamToken image to TokenImageFetcherImpl instead of fetching it over the network --- AlphaWallet/AppCoordinator.swift | 2 +- .../spam-small.imageset/Contents.json | 12 ++++++++ .../spam-small.imageset/spam-small.png | Bin 0 -> 5603 bytes .../Tokens/TokenImageFetcher.swift | 27 ++++++++++++++---- 4 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 AlphaWallet/Resources/Assets.xcassets/spam-small.imageset/Contents.json create mode 100644 AlphaWallet/Resources/Assets.xcassets/spam-small.imageset/spam-small.png diff --git a/AlphaWallet/AppCoordinator.swift b/AlphaWallet/AppCoordinator.swift index 7832410476..f2902320f2 100644 --- a/AlphaWallet/AppCoordinator.swift +++ b/AlphaWallet/AppCoordinator.swift @@ -224,7 +224,7 @@ class AppCoordinator: NSObject, Coordinator { private let addressStorage: FileAddressStorage private let tokenScriptOverridesFileManager = TokenScriptOverridesFileManager() - private let tokenImageFetcher: TokenImageFetcher = TokenImageFetcherImpl(networking: KingfisherImageFetcher()) + private lazy var tokenImageFetcher: TokenImageFetcher = TokenImageFetcherImpl(networking: KingfisherImageFetcher(), tokenGroupIdentifier: tokenGroupIdentifier, spamImage: R.image.spamSmall()!) private let tokenGroupIdentifier: TokenGroupIdentifierProtocol = TokenGroupIdentifier.identifier(fromFileName: "tokens")! diff --git a/AlphaWallet/Resources/Assets.xcassets/spam-small.imageset/Contents.json b/AlphaWallet/Resources/Assets.xcassets/spam-small.imageset/Contents.json new file mode 100644 index 0000000000..1f4b993d62 --- /dev/null +++ b/AlphaWallet/Resources/Assets.xcassets/spam-small.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "spam-small.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/AlphaWallet/Resources/Assets.xcassets/spam-small.imageset/spam-small.png b/AlphaWallet/Resources/Assets.xcassets/spam-small.imageset/spam-small.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4989d6ac15144f8ceebc11f6935ff7970b70fd GIT binary patch literal 5603 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 KAzvwr2>BoE_X2AG literal 0 HcmV?d00001 diff --git a/modules/AlphaWalletFoundation/AlphaWalletFoundation/Tokens/TokenImageFetcher.swift b/modules/AlphaWalletFoundation/AlphaWalletFoundation/Tokens/TokenImageFetcher.swift index 78132fc302..c69f728e60 100644 --- a/modules/AlphaWalletFoundation/AlphaWalletFoundation/Tokens/TokenImageFetcher.swift +++ b/modules/AlphaWalletFoundation/AlphaWalletFoundation/Tokens/TokenImageFetcher.swift @@ -71,14 +71,20 @@ public protocol TokenImageFetcher { public class TokenImageFetcherImpl: TokenImageFetcher { private let networking: ImageFetcher + private let tokenGroupsIdentifier: TokenGroupIdentifierProtocol + private let spamImage: UIImage private let subscribables: AtomicDictionary> = .init() enum ImageAvailabilityError: LocalizedError { case notAvailable } - public init(networking: ImageFetcher) { + public init(networking: ImageFetcher, + tokenGroupIdentifier: TokenGroupIdentifierProtocol, + spamImage: UIImage) { self.networking = networking + self.tokenGroupsIdentifier = tokenGroupIdentifier + self.spamImage = spamImage } private static func programmaticallyGenerateIcon(for contractAddress: AlphaWallet.Address, @@ -132,14 +138,18 @@ public class TokenImageFetcherImpl: TokenImageFetcher { switch type { case .nativeCryptocurrency: - if let img = serverIconImage { - return .init(image: .image(.loaded(image: img)), isFinal: true, overlayServerIcon: nil) + if let img = iconImageForContractAndChainID(image: serverIconImage, address: contractAddress.eip55String, chainID: server.chainID) { + return TokenImage(image: .image(.loaded(image: img)), isFinal: true, overlayServerIcon: nil) } case .erc20, .erc875, .erc721, .erc721ForTickets, .erc1155: - if let img = tokenImage { - return .init(image: .image(.loaded(image: img)), isFinal: true, overlayServerIcon: staticOverlayIcon) + if let img = iconImageForContractAndChainID(image: tokenImage, address: contractAddress.eip55String, chainID: server.chainID) { + return TokenImage(image: .image(.loaded(image: img)), isFinal: true, overlayServerIcon: staticOverlayIcon) } } + + if tokenGroupsIdentifier.isSpam(address: contractAddress.eip55String, chainID: server.chainID) { + return TokenImage(image: .image(.loaded(image: spamImage)), isFinal: true, overlayServerIcon: nil) + } return TokenImageFetcherImpl.programmaticallyGenerateIcon( for: contractAddress, @@ -151,6 +161,13 @@ public class TokenImageFetcherImpl: TokenImageFetcher { blockChainNameColor: blockChainNameColor) } + private func iconImageForContractAndChainID(image iconImage: UIImage?, address: String, chainID: Int) -> UIImage? { + if tokenGroupsIdentifier.isSpam(address: address, chainID: chainID) { + return spamImage + } + return iconImage + } + public func image(contractAddress: AlphaWallet.Address, server: RPCServer, name: String,