From a4be2740cfb6aa76b843e74dbd1d9d177ceeed4e Mon Sep 17 00:00:00 2001 From: kean Date: Fri, 8 Nov 2024 11:45:49 -0500 Subject: [PATCH 1/2] Hardcode wp.com icon --- ...st+Helper.swift => ReaderPost+Swift.swift} | 4 +++ WordPress/Classes/Models/ReaderPost.h | 1 - WordPress/Classes/Models/ReaderPost.m | 14 --------- .../Classes/Models/ReaderSiteTopic.swift | 1 + .../BlogList/SiteIconViewModel.swift | 28 +++++++++++++++++- .../Cards/ReaderPostCellViewModel.swift | 2 +- .../Views/ReaderDetailNewHeaderView.swift | 2 +- WordPress/Images/wpcom-blog-icon.png | Bin 0 -> 3485 bytes WordPress/WordPress.xcodeproj/project.pbxproj | 14 +++++++++ WordPress/WordPressTest/ReaderPostTest.m | 6 ++-- 10 files changed, 51 insertions(+), 21 deletions(-) rename WordPress/Classes/Models/{ReaderPost+Helper.swift => ReaderPost+Swift.swift} (90%) create mode 100644 WordPress/Images/wpcom-blog-icon.png diff --git a/WordPress/Classes/Models/ReaderPost+Helper.swift b/WordPress/Classes/Models/ReaderPost+Swift.swift similarity index 90% rename from WordPress/Classes/Models/ReaderPost+Helper.swift rename to WordPress/Classes/Models/ReaderPost+Swift.swift index b4fe2e3ae71b..c751e9f0f633 100644 --- a/WordPress/Classes/Models/ReaderPost+Helper.swift +++ b/WordPress/Classes/Models/ReaderPost+Swift.swift @@ -2,6 +2,10 @@ import Foundation extension ReaderPost { + func getSiteIconURL(size: Int) -> URL? { + SiteIconViewModel.makeReaderSiteIconURL(iconURL: siteIconURL, siteID: siteID?.intValue, size: CGSize(width: size, height: size)) + } + /// Find cached comment with given ID. /// /// - Parameter id: The comment id diff --git a/WordPress/Classes/Models/ReaderPost.h b/WordPress/Classes/Models/ReaderPost.h index 8de9a3d82ba3..9df28a7e0e8c 100644 --- a/WordPress/Classes/Models/ReaderPost.h +++ b/WordPress/Classes/Models/ReaderPost.h @@ -86,7 +86,6 @@ extern NSString * const ReaderPostStoredCommentTextKey; - (BOOL)isP2Type; - (NSString *)authorString; - (BOOL)contentIncludesFeaturedImage; -- (NSURL *)siteIconForDisplayOfSize:(NSInteger)size; - (SourceAttributionStyle)sourceAttributionStyle; - (NSString *)sourceAuthorNameForDisplay; - (NSURL *)sourceAvatarURLForDisplay; diff --git a/WordPress/Classes/Models/ReaderPost.m b/WordPress/Classes/Models/ReaderPost.m index 8b9f2a216ffe..fe76f422572b 100644 --- a/WordPress/Classes/Models/ReaderPost.m +++ b/WordPress/Classes/Models/ReaderPost.m @@ -295,20 +295,6 @@ - (NSString *)blogNameForDisplay return [[NSURL URLWithString:self.blogURL] host]; } -- (NSURL *)siteIconForDisplayOfSize:(NSInteger)size -{ - NSString *str; - if ([self.siteIconURL length] > 0) { - if ([self.siteIconURL rangeOfString:@"/blavatar/"].location == NSNotFound) { - str = self.siteIconURL; - } else { - str = [NSString stringWithFormat:@"%@?s=%d&d=404", self.siteIconURL, size]; - } - return [NSURL URLWithString:str]; - } - return nil; -} - - (NSString *)titleForDisplay { NSString *title = [[self.postTitle trim] stringByDecodingXMLCharacters]; diff --git a/WordPress/Classes/Models/ReaderSiteTopic.swift b/WordPress/Classes/Models/ReaderSiteTopic.swift index caf7320f3266..298a5a3f6846 100644 --- a/WordPress/Classes/Models/ReaderSiteTopic.swift +++ b/WordPress/Classes/Models/ReaderSiteTopic.swift @@ -13,6 +13,7 @@ import Foundation @NSManaged open var isVisible: Bool @NSManaged open var organizationID: Int @NSManaged open var postCount: NSNumber + /// - warning: Not guaranteed to be a blavatar icon @NSManaged open var siteBlavatar: String @NSManaged open var siteDescription: String @NSManaged open var siteID: NSNumber diff --git a/WordPress/Classes/ViewRelated/Blog/Site Picker/BlogList/SiteIconViewModel.swift b/WordPress/Classes/ViewRelated/Blog/Site Picker/BlogList/SiteIconViewModel.swift index abac61cac5d5..1b71f6ae64c3 100644 --- a/WordPress/Classes/ViewRelated/Blog/Site Picker/BlogList/SiteIconViewModel.swift +++ b/WordPress/Classes/ViewRelated/Blog/Site Picker/BlogList/SiteIconViewModel.swift @@ -40,10 +40,12 @@ struct SiteIconViewModel { init(readerSiteTopic: ReaderSiteTopic, size: Size = .regular) { self.size = size self.firstLetter = readerSiteTopic.title.first - self.imageURL = SiteIconViewModel.optimizedBlavatarURL(from: readerSiteTopic.siteBlavatar, imageSize: size.size) + self.imageURL = SiteIconViewModel.makeReaderSiteIconURL(iconURL: readerSiteTopic.siteBlavatar, siteID: readerSiteTopic.siteID.intValue, size: size.size) } } +// MARK: - SiteIconViewModel (Optimized URL) + extension SiteIconViewModel { /// Returns the Size Optimized URL for a given Path. static func optimizedURL(for path: String, imageSize: CGSize = SiteIconViewModel.Size.regular.size, isP2: Bool = false) -> URL? { @@ -106,3 +108,27 @@ extension SiteIconViewModel { return components.url } } + +// MARK: - SiteIconViewModel (Reader) + +extension SiteIconViewModel { + /// - parameter isBlavatar: A hint to skip the "is icon blavatar" check. + static func makeReaderSiteIconURL(iconURL: String?, isBlavatar: Bool = false, siteID: Int?, size: CGSize) -> URL? { + guard let iconURL, !iconURL.isEmpty else { + if let siteID { + return getHardcodedSiteIconURL(siteID: siteID) + } + return nil + } + return optimizedURL(for: iconURL, imageSize: size) + } + + private static func getHardcodedSiteIconURL(siteID: Int) -> URL? { + switch siteID { + case 3584907: + return Bundle.main.url(forResource: "wpcom-blog-icon", withExtension: "png") + default: + return nil + } + } +} diff --git a/WordPress/Classes/ViewRelated/Reader/Cards/ReaderPostCellViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Cards/ReaderPostCellViewModel.swift index 89f8a427fdc4..50d1518018d8 100644 --- a/WordPress/Classes/ViewRelated/Reader/Cards/ReaderPostCellViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Cards/ReaderPostCellViewModel.swift @@ -40,7 +40,7 @@ final class ReaderPostCellViewModel { if isP2 { self.avatarURL = post.authorAvatarURL.flatMap(URL.init) - } else if let avatarURL = post.siteIconForDisplay(ofSize: Int(ReaderPostCell.avatarSize)) { + } else if let avatarURL = post.getSiteIconURL(size: Int(ReaderPostCell.avatarSize)) { self.avatarURL = avatarURL } else if let blogURL = post.blogURL.flatMap(URL.init), post.isExternal { if let faviconURL = FaviconService.shared.cachedFavicon(forURL: blogURL) { diff --git a/WordPress/Classes/ViewRelated/Reader/Detail/Views/ReaderDetailNewHeaderView.swift b/WordPress/Classes/ViewRelated/Reader/Detail/Views/ReaderDetailNewHeaderView.swift index 1f22d26d2f57..8ca6c1be4a4c 100644 --- a/WordPress/Classes/ViewRelated/Reader/Detail/Views/ReaderDetailNewHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Detail/Views/ReaderDetailNewHeaderView.swift @@ -151,7 +151,7 @@ class ReaderDetailHeaderViewModel: ObservableObject { self.isFollowingSite = post.isFollowing - self.siteIconURL = post.siteIconForDisplay(ofSize: Int(ReaderDetailNewHeaderView.Constants.siteIconLength)) + self.siteIconURL = post.getSiteIconURL(size: Int(ReaderDetailNewHeaderView.Constants.siteIconLength)) self.authorAvatarURL = post.avatarURLForDisplay() ?? nil if let authorName = post.authorForDisplay(), !authorName.isEmpty { diff --git a/WordPress/Images/wpcom-blog-icon.png b/WordPress/Images/wpcom-blog-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b6601e6cee4eae81624f5165dc0f6bb934adde2f GIT binary patch literal 3485 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 Date: Fri, 8 Nov 2024 12:01:12 -0500 Subject: [PATCH 2/2] Update ReaderPostTests --- .../BlogList/SiteIconViewModel.swift | 5 +- WordPress/WordPress.xcodeproj/project.pbxproj | 8 +-- WordPress/WordPressTest/ReaderPostTest.m | 60 ------------------- WordPress/WordPressTest/ReaderPostTests.swift | 22 +++++++ 4 files changed, 30 insertions(+), 65 deletions(-) delete mode 100644 WordPress/WordPressTest/ReaderPostTest.m create mode 100644 WordPress/WordPressTest/ReaderPostTests.swift diff --git a/WordPress/Classes/ViewRelated/Blog/Site Picker/BlogList/SiteIconViewModel.swift b/WordPress/Classes/ViewRelated/Blog/Site Picker/BlogList/SiteIconViewModel.swift index 1b71f6ae64c3..37767373ceaa 100644 --- a/WordPress/Classes/ViewRelated/Blog/Site Picker/BlogList/SiteIconViewModel.swift +++ b/WordPress/Classes/ViewRelated/Blog/Site Picker/BlogList/SiteIconViewModel.swift @@ -120,7 +120,10 @@ extension SiteIconViewModel { } return nil } - return optimizedURL(for: iconURL, imageSize: size) + if isBlavatarURL(iconURL) { + return optimizedBlavatarURL(from: iconURL, imageSize: size) + } + return URL(string: iconURL) } private static func getHardcodedSiteIconURL(siteID: Int) -> URL? { diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index f20046d79e60..6bc53bc30e1f 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -211,6 +211,7 @@ 0C6C4CD82A4F0F2C0049E762 /* Bundle+TestExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C6C4CD72A4F0F2C0049E762 /* Bundle+TestExtensions.swift */; }; 0C77A5B02CDE5675005BC0DA /* wpcom-blog-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C77A5AF2CDE5675005BC0DA /* wpcom-blog-icon.png */; }; 0C77A5B12CDE5675005BC0DA /* wpcom-blog-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C77A5AF2CDE5675005BC0DA /* wpcom-blog-icon.png */; }; + 0C77A5B32CDE7924005BC0DA /* ReaderPostTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C77A5B22CDE7924005BC0DA /* ReaderPostTests.swift */; }; 0C7D481A2A4DB9300023CF84 /* blaze-search-response.json in Resources */ = {isa = PBXBuildFile; fileRef = 0C7D48192A4DB9300023CF84 /* blaze-search-response.json */; }; 0C896DE72A3A832B00D7D4E7 /* SiteVisibilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C896DE62A3A832B00D7D4E7 /* SiteVisibilityTests.swift */; }; 0C8FC9AA2A8C57000059DCE4 /* ItemProviderMediaExporterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C8FC9A92A8C57000059DCE4 /* ItemProviderMediaExporterTests.swift */; }; @@ -1242,7 +1243,6 @@ E61507E42220A13B00213D33 /* richEmbedScript.js in Resources */ = {isa = PBXBuildFile; fileRef = E61507E32220A13B00213D33 /* richEmbedScript.js */; }; E66969C81B9E0A6800EC9C00 /* ReaderTopicServiceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E66969C71B9E0A6800EC9C00 /* ReaderTopicServiceTest.swift */; }; E6A215901D1065F200DE5270 /* AbstractPostTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A2158F1D1065F200DE5270 /* AbstractPostTest.swift */; }; - E6B9B8AA1B94E1FE0001B92F /* ReaderPostTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E6B9B8A91B94E1FE0001B92F /* ReaderPostTest.m */; }; E6B9B8AF1B94FA1C0001B92F /* ReaderStreamViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6B9B8AE1B94FA1C0001B92F /* ReaderStreamViewControllerTests.swift */; }; E8DEE110E4BC3FA1974AB1BB /* Pods_WordPressTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B921F5DD9A1F257C792EC225 /* Pods_WordPressTest.framework */; }; EA14532A29AD874C001F3143 /* ReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB10E3F27487F5D000DA4C1 /* ReaderTests.swift */; }; @@ -2032,6 +2032,7 @@ 0C6C4CD52A4F0AEE0049E762 /* blaze-search-page-2.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blaze-search-page-2.json"; sourceTree = ""; }; 0C6C4CD72A4F0F2C0049E762 /* Bundle+TestExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+TestExtensions.swift"; sourceTree = ""; }; 0C77A5AF2CDE5675005BC0DA /* wpcom-blog-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wpcom-blog-icon.png"; sourceTree = ""; }; + 0C77A5B22CDE7924005BC0DA /* ReaderPostTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderPostTests.swift; sourceTree = ""; }; 0C7D48192A4DB9300023CF84 /* blaze-search-response.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blaze-search-response.json"; sourceTree = ""; }; 0C896DE62A3A832B00D7D4E7 /* SiteVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteVisibilityTests.swift; sourceTree = ""; }; 0C8FC9A92A8C57000059DCE4 /* ItemProviderMediaExporterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemProviderMediaExporterTests.swift; sourceTree = ""; }; @@ -3112,7 +3113,6 @@ E61507E32220A13B00213D33 /* richEmbedScript.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = richEmbedScript.js; path = Resources/HTML/richEmbedScript.js; sourceTree = ""; }; E66969C71B9E0A6800EC9C00 /* ReaderTopicServiceTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReaderTopicServiceTest.swift; sourceTree = ""; }; E6A2158F1D1065F200DE5270 /* AbstractPostTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = AbstractPostTest.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - E6B9B8A91B94E1FE0001B92F /* ReaderPostTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReaderPostTest.m; sourceTree = ""; }; E6B9B8AE1B94FA1C0001B92F /* ReaderStreamViewControllerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReaderStreamViewControllerTests.swift; sourceTree = ""; }; EA14534229AD874C001F3143 /* JetpackUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JetpackUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; EA14534629AEF479001F3143 /* JetpackUITests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = JetpackUITests.xctestplan; sourceTree = ""; }; @@ -5551,7 +5551,7 @@ 5960967E1CF7959300848496 /* PostTests.swift */, FEFA6AC72A88D5FC004EE5E6 /* Post+JetpackSocialTests.swift */, 8BBBEBB124B8F8C0005E358E /* ReaderCardTests.swift */, - E6B9B8A91B94E1FE0001B92F /* ReaderPostTest.m */, + 0C77A5B22CDE7924005BC0DA /* ReaderPostTests.swift */, 24C69A8A2612421900312D9A /* UserSettingsTests.swift */, 24C69AC12612467C00312D9A /* UserSettingsTestsObjc.m */, 3F759FB92A2DA93B0039A845 /* WPAccount+Fixture.swift */, @@ -10001,6 +10001,7 @@ 73C8F06621BEF76B00DDDF7E /* SiteAssemblyViewTests.swift in Sources */, 73178C2821BEE09300E37C9A /* SiteCreationDataCoordinatorTests.swift in Sources */, 4A266B8F282B05210089CF3D /* JSONObjectTests.swift in Sources */, + 0C77A5B32CDE7924005BC0DA /* ReaderPostTests.swift in Sources */, D81C2F6020F891C4002AE1F1 /* TrashCommentActionTests.swift in Sources */, FA4ADADA1C509FE400F858D7 /* SiteManagementServiceTests.swift in Sources */, 3F1B66A323A2F54B0075F09E /* ReaderReblogActionTests.swift in Sources */, @@ -10284,7 +10285,6 @@ F5D0A65223CCD3B600B20D27 /* PreviewWebKitViewControllerTests.swift in Sources */, B5ECA6CD1DBAAD510062D7E0 /* CoreDataHelperTests.swift in Sources */, 931D270019EDAE8600114F17 /* CoreDataMigrationTests.m in Sources */, - E6B9B8AA1B94E1FE0001B92F /* ReaderPostTest.m in Sources */, 80EF9284280CFEB60064A971 /* DashboardPostsSyncManagerTests.swift in Sources */, 7EC9FE0B22C627DB00C5A888 /* PostEditorAnalyticsSessionTests.swift in Sources */, 4AEF2DD929A84B2C00345734 /* ReaderSiteServiceTests.swift in Sources */, diff --git a/WordPress/WordPressTest/ReaderPostTest.m b/WordPress/WordPressTest/ReaderPostTest.m deleted file mode 100644 index 43738b1a1fc6..000000000000 --- a/WordPress/WordPressTest/ReaderPostTest.m +++ /dev/null @@ -1,60 +0,0 @@ -#import -#import "ReaderPost.h" -#import "WordPressTest-Swift.h" - -@interface ReaderPostTest : XCTestCase - -@property (nonatomic, strong) id coreDataStack; - -@end - -@implementation ReaderPostTest - -@synthesize coreDataStack = coreDataStack; - -- (void)setUp -{ - self.coreDataStack = [self coreDataStackForTesting]; -} - -- (void)tearDown -{ - self.coreDataStack = nil; -} - -- (void)testSiteIconForDisplay -{ - NSManagedObjectContext *context = [self.coreDataStack mainContext]; - ReaderPost *post = [NSEntityDescription insertNewObjectForEntityForName:@"ReaderPost" - inManagedObjectContext:context]; - - XCTAssertNil([post getSiteIconURLWithSize:50]); - - NSString *iconURL = @"http://example.com/icon.png"; - post.siteIconURL = iconURL; - - NSString *iconForDisplay = [[post getSiteIconURLWithSize:50] absoluteString]; - - XCTAssertTrue([iconURL isEqualToString:iconForDisplay]); - - - iconURL = @"http://example.com/blavatar/icon.png"; - post.siteIconURL = iconURL; - iconForDisplay = [[post getSiteIconURLWithSize:50] absoluteString]; - - XCTAssertTrue([@"http://example.com/blavatar/icon.png?s=50&d=404" isEqualToString:iconForDisplay]); -} - -- (void)testDisplayDate -{ - NSManagedObjectContext *context = [self.coreDataStack mainContext]; - ReaderPost *post = [NSEntityDescription insertNewObjectForEntityForName:@"ReaderPost" - inManagedObjectContext:context]; - - // Arbitrary time interval. Anything except "now" just so we have a better test. - NSDate *date = [NSDate dateWithTimeIntervalSinceNow:-10000]; - post.dateCreated = date; - XCTAssertTrue([post.dateCreated isEqualToDate:post.dateForDisplay]); -} - -@end diff --git a/WordPress/WordPressTest/ReaderPostTests.swift b/WordPress/WordPressTest/ReaderPostTests.swift new file mode 100644 index 000000000000..b3b1351451db --- /dev/null +++ b/WordPress/WordPressTest/ReaderPostTests.swift @@ -0,0 +1,22 @@ +import UIKit +import XCTest + +@testable import WordPress + +final class ReaderPostTests: CoreDataTestCase { + func testSiteIconURL() throws { + let post = NSEntityDescription.insertNewObject(forEntityName: "ReaderPost", into: mainContext) as! ReaderPost + XCTAssertNil(post.getSiteIconURL(size: 50)) + + post.siteIconURL = "http://example.com/icon.png" + XCTAssertEqual(post.getSiteIconURL(size: 50), URL(string: "http://example.com/icon.png")) + + post.siteIconURL = "https://gravatar.com/blavatar/icon.png" + let scaledURL = try XCTUnwrap(post.getSiteIconURL(size: 50)) + let components = try XCTUnwrap(URLComponents(url: scaledURL, resolvingAgainstBaseURL: false)) + let queryItems = components.queryItems ?? [] + XCTAssertEqual(queryItems.count, 2) + XCTAssertEqual(queryItems.first(where: { $0.name == "s" })?.value, Int(50 * UITraitCollection.current.displayScale).description) + XCTAssertEqual(queryItems.first(where: { $0.name == "d" })?.value, "404") + } +}