Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Modules/RSParser/Sources/ObjC/RSAtomParser.m
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ - (RSParsedFeed *)parseFeed {

[self parse];

RSParsedFeed *parsedFeed = [[RSParsedFeed alloc] initWithURLString:self.urlString title:self.title homepageURLString:self.homepageURLString language:self.language articles:self.articles];
RSParsedFeed *parsedFeed = [[RSParsedFeed alloc] initWithURLString:self.urlString title:self.title homepageURLString:self.homepageURLString language:self.language iconURLString:nil articles:self.articles];

return parsedFeed;
}
Expand Down
3 changes: 2 additions & 1 deletion Modules/RSParser/Sources/ObjC/RSParsedFeed.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@

@interface RSParsedFeed : NSObject

- (nonnull instancetype)initWithURLString:(NSString * _Nonnull)urlString title:(NSString * _Nullable)title homepageURLString:(NSString * _Nullable)homepageURLString language:(NSString * _Nullable)language articles:(NSArray <RSParsedArticle *>* _Nonnull)articles;
- (nonnull instancetype)initWithURLString:(NSString * _Nonnull)urlString title:(NSString * _Nullable)title homepageURLString:(NSString * _Nullable)homepageURLString language:(NSString * _Nullable)language iconURLString:(NSString * _Nullable)iconURLString articles:(NSArray <RSParsedArticle *>* _Nonnull)articles;

@property (nonatomic, readonly, nonnull) NSString *urlString;
@property (nonatomic, readonly, nullable) NSString *title;
@property (nonatomic, readonly, nullable) NSString *homepageURLString;
@property (nonatomic, readonly, nullable) NSString *language;
@property (nonatomic, readonly, nullable) NSString *iconURLString;
@property (nonatomic, readonly, nonnull) NSSet <RSParsedArticle *>*articles;

@end
3 changes: 2 additions & 1 deletion Modules/RSParser/Sources/ObjC/RSParsedFeed.m
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

@implementation RSParsedFeed

- (instancetype)initWithURLString:(NSString *)urlString title:(NSString *)title homepageURLString:(NSString *)homepageURLString language:(NSString *)language articles:(NSSet *)articles {
- (instancetype)initWithURLString:(NSString *)urlString title:(NSString *)title homepageURLString:(NSString *)homepageURLString language:(NSString *)language iconURLString:(NSString *)iconURLString articles:(NSSet *)articles {

self = [super init];
if (!self) {
Expand All @@ -23,6 +23,7 @@ - (instancetype)initWithURLString:(NSString *)urlString title:(NSString *)title
_title = title;
_homepageURLString = homepageURLString;
_language = language;
_iconURLString = iconURLString;
_articles = articles;

return self;
Expand Down
14 changes: 13 additions & 1 deletion Modules/RSParser/Sources/ObjC/RSRSSParser.m
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ @interface RSRSSParser () <RSSAXParserDelegate>
@property (nonatomic, readonly) NSDate *currentDate;
@property (nonatomic) BOOL endRSSFound;
@property (nonatomic) NSString *homepageURLString;
@property (nonatomic) NSString *iconURLString;
@property (nonatomic) NSString *title;
@property (nonatomic) NSDate *dateParsed;
@property (nonatomic) BOOL isRDF;
Expand Down Expand Up @@ -77,7 +78,7 @@ - (RSParsedFeed *)parseFeed {

[self parse];

RSParsedFeed *parsedFeed = [[RSParsedFeed alloc] initWithURLString:self.urlString title:self.title homepageURLString:self.homepageURLString language:self.language articles:self.articles];
RSParsedFeed *parsedFeed = [[RSParsedFeed alloc] initWithURLString:self.urlString title:self.title homepageURLString:self.homepageURLString language:self.language iconURLString:self.iconURLString articles:self.articles];

return parsedFeed;
}
Expand Down Expand Up @@ -452,6 +453,9 @@ - (void)saxParser:(RSSAXParser *)SAXParser XMLStartElement:(const xmlChar *)loca
if (!self.parsingChannelImage) {
[self.parser beginStoringCharacters];
}
else if (!prefix && RSSAXEqualTags(localName, kURL, kURLLength)) {
[self.parser beginStoringCharacters];
}
}


Expand All @@ -472,6 +476,14 @@ - (void)saxParser:(RSSAXParser *)SAXParser XMLEndElement:(const xmlChar *)localN
else if (RSSAXEqualTags(localName, kImage, kImageLength)) {
self.parsingChannelImage = NO;
}
else if (self.parsingChannelImage && !prefix && RSSAXEqualTags(localName, kURL, kURLLength)) {
if (RSParserStringIsEmpty(self.iconURLString)) {
NSString *urlString = [self currentString];
if (!RSParserStringIsEmpty(urlString)) {
self.iconURLString = [self urlString:urlString];
}
}
}

else if (RSSAXEqualTags(localName, kItem, kItemLength)) {
self.parsingArticle = NO;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ struct RSParsedFeedTransformer {
static func parsedFeed(_ rsParsedFeed: RSParsedFeed) -> ParsedFeed {

let items = parsedItems(rsParsedFeed.articles)
return ParsedFeed(type: .rss, title: rsParsedFeed.title, homePageURL: rsParsedFeed.homepageURLString, feedURL: rsParsedFeed.urlString, language: rsParsedFeed.language, feedDescription: nil, nextURL: nil, iconURL: nil, faviconURL: nil, authors: nil, expired: false, hubs: nil, items: items)
return ParsedFeed(type: .rss, title: rsParsedFeed.title, homePageURL: rsParsedFeed.homepageURLString, feedURL: rsParsedFeed.urlString, language: rsParsedFeed.language, feedDescription: nil, nextURL: nil, iconURL: rsParsedFeed.iconURLString, faviconURL: nil, authors: nil, expired: false, hubs: nil, items: items)
}
}

Expand Down
5 changes: 5 additions & 0 deletions Shared/Images/FeedIconDownloader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,11 @@ extension Notification.Name {
}
}

if feed.iconURL != nil {
checkFeedIconURL()
return nil
}

if let previouslyFoundIconURL = feedURLToIconURLCache[feed.url] {
icon(forURL: previouslyFoundIconURL, feed: feed) { image in
MainActor.assumeIsolated {
Expand Down
4 changes: 2 additions & 2 deletions iOS/MainFeed/MainFeedCollectionViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ final class MainFeedCollectionViewController: UICollectionViewController, Undoab
}

func configureCellsForRepresentedObject(_ representedObject: AnyObject) {
// applyToCellsForRepresentedObject(representedObject, configure)
applyToCellsForRepresentedObject(representedObject, configureIcon(_:_:))
}

func applyToCellsForRepresentedObject(_ representedObject: AnyObject, _ completion: (MainFeedCollectionViewCell, IndexPath) -> Void) {
Expand Down Expand Up @@ -694,7 +694,7 @@ final class MainFeedCollectionViewController: UICollectionViewController, Undoab
guard let feed = note.object as? Feed, let key = note.userInfo?[Feed.SettingUserInfoKey] as? Feed.SettingKey else {
return
}
if key == .homePageURL || key == .faviconURL {
if key == .iconURL || key == .homePageURL || key == .faviconURL {
configureCellsForRepresentedObject(feed)
}
}
Expand Down
22 changes: 22 additions & 0 deletions iOS/MainTimeline/MainTimelineModernViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,7 @@ private extension MainTimelineModernViewController {
NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(statusesDidChange(_:)), name: .StatusesDidChange, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(feedIconDidBecomeAvailable(_:)), name: .feedIconDidBecomeAvailable, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(feedSettingDidChange(_:)), name: .feedSettingDidChange, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(avatarDidBecomeAvailable(_:)), name: .AvatarDidBecomeAvailable, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(faviconDidBecomeAvailable(_:)), name: .FaviconDidBecomeAvailable, object: nil)

Expand Down Expand Up @@ -951,6 +952,27 @@ private extension MainTimelineModernViewController {
queueReloadAvailableCells()
}

@objc func feedSettingDidChange(_ note: Notification) {
Self.logger.debug("MainTimelineModernViewController: feedSettingDidChange")

guard isViewLoaded,
let feed = note.object as? Feed,
let key = note.userInfo?[Feed.SettingUserInfoKey] as? Feed.SettingKey else {
return
}
guard key == .iconURL || key == .homePageURL || key == .faviconURL else {
return
}
guard let articles else {
return
}

let shouldReloadVisibleCells = articles.contains { $0.feed == feed }
if shouldReloadVisibleCells {
queueReloadAvailableCells()
}
}

@objc func avatarDidBecomeAvailable(_ note: Notification) {
Self.logger.debug("MainTimelineModernViewController: avatarDidBecomeAvailable")

Expand Down