From 67c0e009579b8f6b52b5b2be9db949a83d3b3a53 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Sun, 28 Jun 2020 03:05:01 -0500 Subject: [PATCH] Make multiplatform compile shared app resources --- Mac/AppAssets.swift | 4 + Multiplatform/Shared/AppAssets.swift | 153 +++++++ Multiplatform/Shared/AppDefaults.swift | 307 +++++++++++++ .../AccentColor.colorset/Contents.json | 27 ++ .../accountCloudKit.imageset/Contents.json | 15 + .../accountCloudKit.imageset/icloud.pdf | Bin 0 -> 4251 bytes .../Contents.json | 15 + .../outline-512.png | Bin 0 -> 49563 bytes .../accountFeedbin.imageset/Contents.json | 16 + .../accountFeedbin.pdf | Bin 0 -> 4120 bytes .../accountFeedly.imageset/Contents.json | 15 + .../accountFeedly.imageset/accountFeedly.pdf | Bin 0 -> 4406 bytes .../accountFreshRSS.imageset/Contents.json | 15 + .../accountFreshRSS.pdf | Bin 0 -> 4206 bytes .../accountLocalMac.imageset/Contents.json | 15 + .../localAccountMac.pdf | Bin 0 -> 3910 bytes .../accountLocalPad.imageset/Contents.json | 16 + .../localAccountPad.pdf | Bin 0 -> 3897 bytes .../accountLocalPhone.imageset/Contents.json | 16 + .../localAccountPhone.pdf | Bin 0 -> 3904 bytes .../accountNewsBlur.imageset/Contents.json | 15 + .../accountNewsBlur.imageset/newsblur-512.png | Bin 0 -> 54138 bytes .../Contents.json | 15 + .../MarsEditOfficial.pdf | Bin 0 -> 6339 bytes .../Contents.json | 15 + .../micro-dot-blog.pdf | Bin 0 -> 4190 bytes .../Contents.json | 25 + .../reddit-dark.pdf | Bin 0 -> 4583 bytes .../reddit-light.pdf | Bin 0 -> 4830 bytes .../Contents.json | 15 + .../twitter.pdf | Bin 0 -> 4237 bytes .../Contents.json | 12 + .../faviconTemplateImage.pdf | Bin 0 -> 5858 bytes Multiplatform/Shared/ErrorHandler.swift | 31 ++ ...ltiplatformApp.swift => NetNewsWire.swift} | 12 +- Multiplatform/iOS/AppDelegate.swift | 390 ++++++++++++++++ Multiplatform/iOS/Info.plist | 35 ++ Multiplatform/macOS/AppDelegate.swift | 286 ++++++++++++ Multiplatform/macOS/Info.plist | 11 + NetNewsWire.xcodeproj/project.pbxproj | 427 +++++++++++++++++- Shared/Favicons/SingleFaviconDownloader.swift | 5 +- Shared/Images/ImageDownloader.swift | 5 +- Shared/Importers/DefaultFeedsImporter.swift | 2 +- Shared/SmartFeeds/PseudoFeed.swift | 20 +- 44 files changed, 1907 insertions(+), 28 deletions(-) create mode 100644 Multiplatform/Shared/AppAssets.swift create mode 100644 Multiplatform/Shared/AppDefaults.swift create mode 100644 Multiplatform/Shared/Assets.xcassets/accountCloudKit.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/accountCloudKit.imageset/icloud.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedWrangler.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedWrangler.imageset/outline-512.png create mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedbin.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedbin.imageset/accountFeedbin.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedly.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedly.imageset/accountFeedly.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/accountFreshRSS.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/accountFreshRSS.imageset/accountFreshRSS.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalMac.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalMac.imageset/localAccountMac.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalPad.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalPad.imageset/localAccountPad.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalPhone.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalPhone.imageset/localAccountPhone.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/accountNewsBlur.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/accountNewsBlur.imageset/newsblur-512.png create mode 100644 Multiplatform/Shared/Assets.xcassets/extensionPointMarsEdit.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/extensionPointMarsEdit.imageset/MarsEditOfficial.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/extensionPointMicroblog.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/extensionPointMicroblog.imageset/micro-dot-blog.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/extensionPointReddit.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/extensionPointReddit.imageset/reddit-dark.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/extensionPointReddit.imageset/reddit-light.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/extensionPointTwitter.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/extensionPointTwitter.imageset/twitter.pdf create mode 100644 Multiplatform/Shared/Assets.xcassets/faviconTemplateImage.imageset/Contents.json create mode 100644 Multiplatform/Shared/Assets.xcassets/faviconTemplateImage.imageset/faviconTemplateImage.pdf create mode 100644 Multiplatform/Shared/ErrorHandler.swift rename Multiplatform/Shared/{NetNewsWire_MultiplatformApp.swift => NetNewsWire.swift} (50%) create mode 100644 Multiplatform/iOS/AppDelegate.swift create mode 100644 Multiplatform/macOS/AppDelegate.swift diff --git a/Mac/AppAssets.swift b/Mac/AppAssets.swift index 5e4699fa1..b9f702e03 100644 --- a/Mac/AppAssets.swift +++ b/Mac/AppAssets.swift @@ -125,6 +125,10 @@ struct AppAssets { return IconImage(RSImage(named: NSImage.smartBadgeTemplateName)!) }() + static var smartFeedImage: RSImage = { + return RSImage(named: NSImage.smartBadgeTemplateName)! + }() + static var starredFeedImage: IconImage = { return IconImage(RSImage(named: NSImage.smartBadgeTemplateName)!) }() diff --git a/Multiplatform/Shared/AppAssets.swift b/Multiplatform/Shared/AppAssets.swift new file mode 100644 index 000000000..37998ed7b --- /dev/null +++ b/Multiplatform/Shared/AppAssets.swift @@ -0,0 +1,153 @@ +// +// AppAssets.swift +// NetNewsWire +// +// Created by Maurice Parker on 6/27/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import SwiftUI +import RSCore +import Account + +struct AppAssets { + + static var accountLocalMacImage: RSImage! = { + return RSImage(named: "accountLocalMac") + }() + + static var accountLocalPadImage: RSImage = { + return RSImage(named: "accountLocalPad")! + }() + + static var accountLocalPhoneImage: RSImage = { + return RSImage(named: "accountLocalPhone")! + }() + + static var accountCloudKitImage: RSImage = { + return RSImage(named: "accountCloudKit")! + }() + + static var accountFeedbinImage: RSImage = { + return RSImage(named: "accountFeedbin")! + }() + + static var accountFeedlyImage: RSImage = { + return RSImage(named: "accountFeedly")! + }() + + static var accountFeedWranglerImage: RSImage = { + return RSImage(named: "accountFeedWrangler")! + }() + + static var accountFreshRSSImage: RSImage = { + return RSImage(named: "accountFreshRSS")! + }() + + static var accountNewsBlurImage: RSImage = { + return RSImage(named: "accountNewsBlur")! + }() + + static var extensionPointMarsEdit: RSImage = { + return RSImage(named: "extensionPointMarsEdit")! + }() + + static var extensionPointMicroblog: RSImage = { + return RSImage(named: "extensionPointMicroblog")! + }() + + static var extensionPointReddit: RSImage = { + return RSImage(named: "extensionPointReddit")! + }() + + static var extensionPointTwitter: RSImage = { + return RSImage(named: "extensionPointTwitter")! + }() + + static var faviconTemplateImage: RSImage = { + return RSImage(named: "faviconTemplateImage")! + }() + + static var masterFolderImage: IconImage = { + #if os(macOS) + return IconImage(NSImage(systemSymbolName: "folder.fill", accessibilityDescription: nil)!) + #endif + #if os(iOS) + return IconImage(UIImage(systemName: "folder.fill")!) + #endif + }() + + static var searchFeedImage: IconImage = { + #if os(macOS) + return IconImage(NSImage(systemSymbolName: "magnifyingglass", accessibilityDescription: nil)!) + #endif + #if os(iOS) + return IconImage(UIImage(systemName: "magnifyingglass")!) + #endif + }() + + static var smartFeedImage: RSImage = { + #if os(macOS) + return NSImage(systemSymbolName: "gear", accessibilityDescription: nil)! + #endif + #if os(iOS) + return UIImage(systemName: "gear")! + #endif + }() + + static var starredFeedImage: IconImage = { + #if os(macOS) + return IconImage(NSImage(systemSymbolName: "star.fill", accessibilityDescription: nil)!) + #endif + #if os(iOS) + return IconImage(UIImage(systemName: "star.fill")!) + #endif + }() + + static var todayFeedImage: IconImage = { + #if os(macOS) + return IconImage(NSImage(systemSymbolName: "sun.max.fill", accessibilityDescription: nil)!) + #endif + #if os(iOS) + return IconImage(UIImage(systemName: "sun.max.fill")!) + #endif + }() + + static var unreadFeedImage: IconImage = { + #if os(macOS) + return IconImage(NSImage(systemSymbolName: "largecircle.fill.circle", accessibilityDescription: nil)!) + #endif + #if os(iOS) + return IconImage(UIImage(systemName: "largecircle.fill.circle")!) + #endif + }() + + static func image(for accountType: AccountType) -> RSImage? { + switch accountType { + case .onMyMac: + #if os(macOS) + return AppAssets.accountLocalMacImage + #endif + #if os(iOS) + if UIDevice.current.userInterfaceIdiom == .pad { + return AppAssets.accountLocalPadImage + } else { + return AppAssets.accountLocalPhoneImage + } + #endif + case .cloudKit: + return AppAssets.accountCloudKitImage + case .feedbin: + return AppAssets.accountFeedbinImage + case .feedly: + return AppAssets.accountFeedlyImage + case .feedWrangler: + return AppAssets.accountFeedWranglerImage + case .freshRSS: + return AppAssets.accountFreshRSSImage + case .newsBlur: + return AppAssets.accountNewsBlurImage + } + } + +} diff --git a/Multiplatform/Shared/AppDefaults.swift b/Multiplatform/Shared/AppDefaults.swift new file mode 100644 index 000000000..5dc9f1910 --- /dev/null +++ b/Multiplatform/Shared/AppDefaults.swift @@ -0,0 +1,307 @@ +// +// AppDefaults.swift +// NetNewsWire +// +// Created by Maurice Parker on 6/28/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import Foundation + +enum UserInterfaceColorPalette: Int, CustomStringConvertible, CaseIterable { + case automatic = 0 + case light = 1 + case dark = 2 + + var description: String { + switch self { + case .automatic: + return NSLocalizedString("Automatic", comment: "Automatic") + case .light: + return NSLocalizedString("Light", comment: "Light") + case .dark: + return NSLocalizedString("Dark", comment: "Dark") + } + } + +} + +struct AppDefaults { + + #if os(macOS) + static var shared: UserDefaults = UserDefaults.standard + #endif + + #if os(iOS) + static var shared: UserDefaults = { + let appIdentifierPrefix = Bundle.main.object(forInfoDictionaryKey: "AppIdentifierPrefix") as! String + let suiteName = "\(appIdentifierPrefix)group.\(Bundle.main.bundleIdentifier!)" + return UserDefaults.init(suiteName: suiteName)! + }() + #endif + + struct Key { + static let refreshInterval = "refreshInterval" + static let hideDockUnreadCount = "JustinMillerHideDockUnreadCount" + static let userInterfaceColorPalette = "userInterfaceColorPalette" + static let activeExtensionPointIDs = "activeExtensionPointIDs" + static let lastImageCacheFlushDate = "lastImageCacheFlushDate" + static let firstRunDate = "firstRunDate" + static let timelineGroupByFeed = "timelineGroupByFeed" + static let refreshClearsReadArticles = "refreshClearsReadArticles" + static let timelineNumberOfLines = "timelineNumberOfLines" + static let timelineIconSize = "timelineIconSize" + static let timelineSortDirection = "timelineSortDirection" + static let articleFullscreenAvailable = "articleFullscreenAvailable" + static let articleFullscreenEnabled = "articleFullscreenEnabled" + static let confirmMarkAllAsRead = "confirmMarkAllAsRead" + static let lastRefresh = "lastRefresh" + static let addWebFeedAccountID = "addWebFeedAccountID" + static let addWebFeedFolderName = "addWebFeedFolderName" + static let addFolderAccountID = "addFolderAccountID" + } + + static let isDeveloperBuild: Bool = { + if let dev = Bundle.main.object(forInfoDictionaryKey: "DeveloperEntitlements") as? String, dev == "-dev" { + return true + } + return false + }() + + static let isFirstRun: Bool = { + if let _ = AppDefaults.shared.object(forKey: Key.firstRunDate) as? Date { + return false + } + firstRunDate = Date() + return true + }() + + static var refreshInterval: RefreshInterval { + get { + let rawValue = UserDefaults.standard.integer(forKey: Key.refreshInterval) + return RefreshInterval(rawValue: rawValue) ?? RefreshInterval.everyHour + } + set { + UserDefaults.standard.set(newValue.rawValue, forKey: Key.refreshInterval) + } + } + + static var hideDockUnreadCount: Bool { + return bool(for: Key.hideDockUnreadCount) + } + + static var userInterfaceColorPalette: UserInterfaceColorPalette { + get { + if let result = UserInterfaceColorPalette(rawValue: int(for: Key.userInterfaceColorPalette)) { + return result + } + return .automatic + } + set { + setInt(for: Key.userInterfaceColorPalette, newValue.rawValue) + } + } + + static var addWebFeedAccountID: String? { + get { + return string(for: Key.addWebFeedAccountID) + } + set { + setString(for: Key.addWebFeedAccountID, newValue) + } + } + + static var addWebFeedFolderName: String? { + get { + return string(for: Key.addWebFeedFolderName) + } + set { + setString(for: Key.addWebFeedFolderName, newValue) + } + } + + static var addFolderAccountID: String? { + get { + return string(for: Key.addFolderAccountID) + } + set { + setString(for: Key.addFolderAccountID, newValue) + } + } + + static var activeExtensionPointIDs: [[AnyHashable : AnyHashable]]? { + get { + return UserDefaults.standard.object(forKey: Key.activeExtensionPointIDs) as? [[AnyHashable : AnyHashable]] + } + set { + UserDefaults.standard.set(newValue, forKey: Key.activeExtensionPointIDs) + } + } + + static var lastImageCacheFlushDate: Date? { + get { + return date(for: Key.lastImageCacheFlushDate) + } + set { + setDate(for: Key.lastImageCacheFlushDate, newValue) + } + } + + static var timelineGroupByFeed: Bool { + get { + return bool(for: Key.timelineGroupByFeed) + } + set { + setBool(for: Key.timelineGroupByFeed, newValue) + } + } + + static var refreshClearsReadArticles: Bool { + get { + return bool(for: Key.refreshClearsReadArticles) + } + set { + setBool(for: Key.refreshClearsReadArticles, newValue) + } + } + + static var timelineSortDirection: ComparisonResult { + get { + return sortDirection(for: Key.timelineSortDirection) + } + set { + setSortDirection(for: Key.timelineSortDirection, newValue) + } + } + + static var articleFullscreenAvailable: Bool { + get { + return bool(for: Key.articleFullscreenAvailable) + } + set { + setBool(for: Key.articleFullscreenAvailable, newValue) + } + } + + static var articleFullscreenEnabled: Bool { + get { + return bool(for: Key.articleFullscreenEnabled) + } + set { + setBool(for: Key.articleFullscreenEnabled, newValue) + } + } + + static var confirmMarkAllAsRead: Bool { + get { + return bool(for: Key.confirmMarkAllAsRead) + } + set { + setBool(for: Key.confirmMarkAllAsRead, newValue) + } + } + + static var lastRefresh: Date? { + get { + return date(for: Key.lastRefresh) + } + set { + setDate(for: Key.lastRefresh, newValue) + } + } + + static var timelineNumberOfLines: Int { + get { + return int(for: Key.timelineNumberOfLines) + } + set { + setInt(for: Key.timelineNumberOfLines, newValue) + } + } + + static var timelineIconSize: IconSize { + get { + let rawValue = AppDefaults.shared.integer(forKey: Key.timelineIconSize) + return IconSize(rawValue: rawValue) ?? IconSize.medium + } + set { + AppDefaults.shared.set(newValue.rawValue, forKey: Key.timelineIconSize) + } + } + + static func registerDefaults() { + let defaults: [String : Any] = [Key.userInterfaceColorPalette: UserInterfaceColorPalette.automatic.rawValue, + Key.timelineGroupByFeed: false, + Key.refreshClearsReadArticles: false, + Key.timelineNumberOfLines: 2, + Key.timelineIconSize: IconSize.medium.rawValue, + Key.timelineSortDirection: ComparisonResult.orderedDescending.rawValue, + Key.articleFullscreenAvailable: false, + Key.articleFullscreenEnabled: false, + Key.confirmMarkAllAsRead: true] + AppDefaults.shared.register(defaults: defaults) + } + +} + +private extension AppDefaults { + + static var firstRunDate: Date? { + get { + return date(for: Key.firstRunDate) + } + set { + setDate(for: Key.firstRunDate, newValue) + } + } + + static func string(for key: String) -> String? { + return AppDefaults.shared.string(forKey: key) + } + + static func setString(for key: String, _ value: String?) { + AppDefaults.shared.set(value, forKey: key) + } + + static func bool(for key: String) -> Bool { + return AppDefaults.shared.bool(forKey: key) + } + + static func setBool(for key: String, _ flag: Bool) { + AppDefaults.shared.set(flag, forKey: key) + } + + static func int(for key: String) -> Int { + return AppDefaults.shared.integer(forKey: key) + } + + static func setInt(for key: String, _ x: Int) { + AppDefaults.shared.set(x, forKey: key) + } + + static func date(for key: String) -> Date? { + return AppDefaults.shared.object(forKey: key) as? Date + } + + static func setDate(for key: String, _ date: Date?) { + AppDefaults.shared.set(date, forKey: key) + } + + static func sortDirection(for key:String) -> ComparisonResult { + let rawInt = int(for: key) + if rawInt == ComparisonResult.orderedAscending.rawValue { + return .orderedAscending + } + return .orderedDescending + } + + static func setSortDirection(for key: String, _ value: ComparisonResult) { + if value == .orderedAscending { + setInt(for: key, ComparisonResult.orderedAscending.rawValue) + } + else { + setInt(for: key, ComparisonResult.orderedDescending.rawValue) + } + } + +} diff --git a/Multiplatform/Shared/Assets.xcassets/AccentColor.colorset/Contents.json b/Multiplatform/Shared/Assets.xcassets/AccentColor.colorset/Contents.json index eb8789700..bf3d625ad 100644 --- a/Multiplatform/Shared/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/Multiplatform/Shared/Assets.xcassets/AccentColor.colorset/Contents.json @@ -1,6 +1,33 @@ { "colors" : [ { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.933", + "green" : "0.416", + "red" : "0.031" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.945", + "green" : "0.502", + "red" : "0.176" + } + }, "idiom" : "universal" } ], diff --git a/Multiplatform/Shared/Assets.xcassets/accountCloudKit.imageset/Contents.json b/Multiplatform/Shared/Assets.xcassets/accountCloudKit.imageset/Contents.json new file mode 100644 index 000000000..fc07d2975 --- /dev/null +++ b/Multiplatform/Shared/Assets.xcassets/accountCloudKit.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icloud.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Multiplatform/Shared/Assets.xcassets/accountCloudKit.imageset/icloud.pdf b/Multiplatform/Shared/Assets.xcassets/accountCloudKit.imageset/icloud.pdf new file mode 100644 index 0000000000000000000000000000000000000000..74406f4cbf5e9bdd80f425de4421e074993302ef GIT binary patch literal 4251 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 dtAYQ!Cl9f$%R`rl%Z<0+YvPB_eX0Pm(z4v>Z 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 YTb<&+Df~VTqec+s2M*E-ja@GOALHb7=Kufz literal 0 HcmV?d00001 diff --git a/Multiplatform/Shared/Assets.xcassets/accountFeedbin.imageset/Contents.json b/Multiplatform/Shared/Assets.xcassets/accountFeedbin.imageset/Contents.json new file mode 100644 index 000000000..a6213a3b1 --- /dev/null +++ b/Multiplatform/Shared/Assets.xcassets/accountFeedbin.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "accountFeedbin.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/Multiplatform/Shared/Assets.xcassets/accountFeedbin.imageset/accountFeedbin.pdf b/Multiplatform/Shared/Assets.xcassets/accountFeedbin.imageset/accountFeedbin.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d688a02e155f25866aa00f5cf4eab2ba37c95c86 GIT binary patch literal 4120 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 literal 0 HcmV?d00001 diff --git a/Multiplatform/Shared/Assets.xcassets/accountFreshRSS.imageset/Contents.json b/Multiplatform/Shared/Assets.xcassets/accountFreshRSS.imageset/Contents.json new file mode 100644 index 000000000..64a29ab45 --- /dev/null +++ b/Multiplatform/Shared/Assets.xcassets/accountFreshRSS.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "accountFreshRSS.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Multiplatform/Shared/Assets.xcassets/accountFreshRSS.imageset/accountFreshRSS.pdf b/Multiplatform/Shared/Assets.xcassets/accountFreshRSS.imageset/accountFreshRSS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1ff98e115ed9096d447af7849c78bbd5906f8b00 GIT binary patch literal 4206 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 literal 0 HcmV?d00001 diff --git a/Multiplatform/Shared/Assets.xcassets/accountLocalPhone.imageset/Contents.json b/Multiplatform/Shared/Assets.xcassets/accountLocalPhone.imageset/Contents.json new file mode 100644 index 000000000..1e6c82f37 --- /dev/null +++ b/Multiplatform/Shared/Assets.xcassets/accountLocalPhone.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "localAccountPhone.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/Multiplatform/Shared/Assets.xcassets/accountLocalPhone.imageset/localAccountPhone.pdf b/Multiplatform/Shared/Assets.xcassets/accountLocalPhone.imageset/localAccountPhone.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c807edece1d482cc068b120a49f95922cf54ad6a GIT binary patch literal 3904 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 literal 0 HcmV?d00001 diff --git a/Multiplatform/Shared/Assets.xcassets/accountNewsBlur.imageset/Contents.json b/Multiplatform/Shared/Assets.xcassets/accountNewsBlur.imageset/Contents.json new file mode 100644 index 000000000..9b23ec7d3 --- /dev/null +++ b/Multiplatform/Shared/Assets.xcassets/accountNewsBlur.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "newsblur-512.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Multiplatform/Shared/Assets.xcassets/accountNewsBlur.imageset/newsblur-512.png b/Multiplatform/Shared/Assets.xcassets/accountNewsBlur.imageset/newsblur-512.png new file mode 100644 index 0000000000000000000000000000000000000000..5fab67691f90e4ff35fd51ae1cc4d44ff821d230 GIT binary patch literal 54138 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 AYybcN literal 0 HcmV?d00001 diff --git a/Multiplatform/Shared/Assets.xcassets/extensionPointMarsEdit.imageset/Contents.json b/Multiplatform/Shared/Assets.xcassets/extensionPointMarsEdit.imageset/Contents.json new file mode 100644 index 000000000..432281179 --- /dev/null +++ b/Multiplatform/Shared/Assets.xcassets/extensionPointMarsEdit.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "MarsEditOfficial.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Multiplatform/Shared/Assets.xcassets/extensionPointMarsEdit.imageset/MarsEditOfficial.pdf b/Multiplatform/Shared/Assets.xcassets/extensionPointMarsEdit.imageset/MarsEditOfficial.pdf new file mode 100644 index 0000000000000000000000000000000000000000..82396a3699c9b7b00735e5fbe0c15cac82533011 GIT binary patch literal 6339 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 B-f#c_ literal 0 HcmV?d00001 diff --git a/Multiplatform/Shared/Assets.xcassets/extensionPointMicroblog.imageset/Contents.json b/Multiplatform/Shared/Assets.xcassets/extensionPointMicroblog.imageset/Contents.json new file mode 100644 index 000000000..4db95b5b7 --- /dev/null +++ b/Multiplatform/Shared/Assets.xcassets/extensionPointMicroblog.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "micro-dot-blog.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Multiplatform/Shared/Assets.xcassets/extensionPointMicroblog.imageset/micro-dot-blog.pdf b/Multiplatform/Shared/Assets.xcassets/extensionPointMicroblog.imageset/micro-dot-blog.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ad66dd377a345b3b05272209b53879a86dee7994 GIT binary patch literal 4190 zcmai&c{o(<|Hsi3hN2RM>LmL%GmJsmx3OlIHO-i@Gc_h_)T<4l|U+?>K-q(HZ&-;(pJpx7=S`sixX|O;GWtlQp zu=3zdOB)ytKmi=u6|A5DK=iSmP6TH_h9;Q+5G@yX0v1nux}ykK4XgtWg9Vh7z+MDA z7UcoAhFc;K0DEF#vKuTeBsZaLPq^yqYQ*)viC!^gj2%qE|9o=@FK9S7T zO~7U6Gcc@x4!Mm|(<(x~+AG2PmoBp3HHexZ!7x6sp62_2^&UqQvCE(Wa@wf6ww%{L zfv1FQJ~NBbs?(=;0BMiPYg5=?!J&g)FU3Z}uWO$-XkN5!F87Z-wrPhkR$c8U7KSX^ zrwfM-e`jO3GVaHyKu>p}s>=^ijJGZwl+fo1$Wp>%!J87hmj|a;dh08a zJJ+s$4IH3f{Z!LKbsrzu#-07}>?0WKiTTxV+GsB)d*Rr7!sQTqlY2v{KO$u2cLfVT zj8INLe(_jO0wDb}P9|6{+%>!d)(b%V6x4B^1lqh8uopp-y=eXN+nfI#Nh3VY!4yjX zY-pw$T7Vq@QOCLC@TON#4p?9>v+7IdB{EsTg1=@ljs(aD)q~#ib zXkfiv9Iz%xwf~;@%)35jro)_(B%&r6`(oXp|2>N)Weo)ueXG?pPi&W#1-*ro}5bjrQXh$WioWYAI8h5Pz8 z?(5S*InwRBrv-D|qog!BPJD@4W}stAZjpb9KNPbm@0>;Fo9{Fk4T{o1=N}$QbD@0h zaNJs|G~GnQ#FCp0$hUm;NvlCOoYrMwFZR)bT{n+?O`r-DqW ziXHyj=1YR}q%76gEUR(%`Nt3uQLQUr&GiW!vI>K9_RnS)F6jSWQZPLB5_w zcQ@;yR1$`|&b~YGO5WwK&SvrZ*{`^kZhkg5{+!Gl9_3tjQz6vyjwA*g9y~w}K8_G# zJQ0-X#^HR;o-XjFyitt~V+T%=PW|jYeotk8hQK)+b{M#${-twiLb+GGl>hhXt|RX)?HHP(0xUf`kliQMsU_eO>zcNhr|!0=E>D1-RrgS;WqSN4qobm1Y|?ECKS zlhkH#Q2{+wReDDUR)xKz_rBqJg|0u;{|)Fu7~;wSThPT<2d}WOh9FhI5si9K`ms<%w$FZ+fJ?aj7qRQqQ!NTLBH;QxAjTBeU61Z!b z>~3s5V0;6>4^Zg?!w;u1^q~&EqkA4QTydV43EA}eqlWLX`;1(#M##D~oJxnPo4Ck4 zU+Khe+BYRJsdO;y>(#Pk;#tyAyJN{ufB1}B0^cKsBF&6DhaT~~h|^BEI=SyaWDY9r zIA`05iAbwhGTH()h}MM;q&cKn=yOdW9NDEqH^cJK15ffTg&r$=Gb0Y)i<4-vxEz1k zrXuypzIUkk^Sp=JU!C~GdnKsmxUH0@Oc|(}Z78-bWUl!jS#ZhsrRW&PVi;Sa*H`rQ zGxgwL-r!T?@u%Awgzhj~gWST{&fEp~-TBSfxtXS!sNsj3;Kreah6KI{cE1)|w8)d& z?^Ivv@Csf?;?RlU=Q80JNv{eu({bgq6I2u=o=NIFhe6_xTd7;>2om5q{x z1vw0Lc{SCBFUae@Q1MgoQ_nLwSm@brS)5jzX>CZ<2-FRPAd{q1S5hZBOOr|x+*0OJ z0|X3{hf;k~?Ip8??9T-2e$U^jVK8n~X*3PZt+2?^B3Csj-qg{|c$k8|h0Z`np>KSW zX*CvjnHZW_eZ;UxWv1e-K;9W{wZ1&Rw>4D;Rp;Jg-$PF#Wgl(#CC#+1p8iZ+WyT6% zZ79MNUJ5s*vdiQ^6ZGUM=BusWRWuM;k%PNk+T)GQT{bsuHTwx z6=##UGq~%yPjH)ar^4H0PGopybY@U8rs3^X&ekl?K-LuN>1UUqDd}Ij%^U?PW8`y6 z%N7bGdX*lHmME4w6joX~Xqh_cFv4q%{8!zT48E2PfKWacW z*aUaIdIP+_9HV-#u`nk(rva6P$|XCTElw!u70tEIJ>Mqh@ce4@lG22YU`14>PNGg+ zr-A9a{xP%5wWKN%tJ{>bAiPATuKi)f2P><`T7wVdn-w~)=lb2-6k}10v5d*&9ObkZ zUl2Eym=iy3C1SPT(xYm&VypRmONN`BLtuM^>x4sPPyXoCv(h4oaqotO!1Eb)6{DPW z7wSlBht~ME1-D_0ijlsN#6#=v2;RbV;ei8(=RT8bdX{1*7=;3ap7iMyjAvT)i1Zxn z$z@^X`pVTWaU9=!m0ZJ%Pmsh&#@hQ{$>}#ANtv*o+v+wLiktRs@n{)+r#MWl*%o8d zV@p8Bv?muNO>>i2F5OBkznE~bygG3mz394Fpma_tN-0k1XuWrRNg!kcMP;CRZ;h@D zeVyJK+BO8qfgUq|20sF6fh-u6SfrSb?7s$TZlrIl3p)*YYtL`n&&i;+qwalEfmw#t z?%0;saY=FbW5Id98gt(uUmuVJT2n*4rA|A(<822rCXQ2&(?_cl*{V5!G|&vtOx4s& zwG_9ioYac7js@}+IZyK(3*h(07p=b?)r*{%{{)`+A}MWqw{reH{u!m{HL2{5eWTS? z(NjF9PmZ(iMjdS`qUe{c+Q0CjfQFLlBDWK#+r*~hmh3jLI|-oF@TcLu8mTRIQ4Ts~ zI>&S-7z|aPeZ2P6emQiqDEUruu84F|Z_!^a;Z++|eQE-z=n64AX+`g1)eqm1AAn?eF^Ev}5`23EZ$^sdRlh=7hv%cNupdo?4yEnDl&ovU8<# zJ4nV+#^;(-z4!Nsokp22Zih;54wl)Dytv?F*H}ybRzDZ-0eEN+e|@d>Iu6S-?ioGS zZ~VZxqW-dT<>FME+6y&fGEt((=8$`<`!V;0QOC+s*O64dOTFLFuRle9G8FibI5%z; zcyV*Ido6r{n75X+o9OznzgI@;>e@SC!acBPc=<%i4Fbr>M%d? zPzY=&npLb^N*&l3ax5aQ&OaEsOsc%)6dzHe4%toFEH`Z4PbwmbX;o>>B1@5^*v;5c z|0k=hUthzr@fJyxZ z-aUTZ(`b;Zqpq%o^1@<(J%BXd)VL9fS1MPGu z?16GHGzBcMcrO>6Cjf&=!ek`jfUU6FH5Ydb0F&30LLh8K0OM;YJi#BJG5ing_a%tX z(4BUWB+%Z{pm8`@SmT@&R0;}(LuFwyFgd84H54jDyJ>X>ILuxN@c)oT->qvABT2R7k@16djW_E4o7SGUR!C0 zcO6eh9IgL9#~QQ*D4FGlIfp5m+eN5$1?Mz+_Qa1PX=0N-2T=d&$oPc@b#6 T{ISu}axmK82?CmiTHyZx7I;X| literal 0 HcmV?d00001 diff --git a/Multiplatform/Shared/Assets.xcassets/extensionPointReddit.imageset/Contents.json b/Multiplatform/Shared/Assets.xcassets/extensionPointReddit.imageset/Contents.json new file mode 100644 index 000000000..1a49be3b3 --- /dev/null +++ b/Multiplatform/Shared/Assets.xcassets/extensionPointReddit.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "reddit-light.pdf", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "reddit-dark.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Multiplatform/Shared/Assets.xcassets/extensionPointReddit.imageset/reddit-dark.pdf b/Multiplatform/Shared/Assets.xcassets/extensionPointReddit.imageset/reddit-dark.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b4b6d741976ccf2d6454147ef4b82a762dc5810d GIT binary patch literal 4583 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 literal 0 HcmV?d00001 diff --git a/Multiplatform/Shared/Assets.xcassets/extensionPointTwitter.imageset/Contents.json b/Multiplatform/Shared/Assets.xcassets/extensionPointTwitter.imageset/Contents.json new file mode 100644 index 000000000..834100cda --- /dev/null +++ b/Multiplatform/Shared/Assets.xcassets/extensionPointTwitter.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "twitter.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Multiplatform/Shared/Assets.xcassets/extensionPointTwitter.imageset/twitter.pdf b/Multiplatform/Shared/Assets.xcassets/extensionPointTwitter.imageset/twitter.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e50de4443827d9570161cdd229c8d6ce640981e4 GIT binary patch literal 4237 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 (Error) -> () { +// return { [weak viewController] error in +// if UIApplication.shared.applicationState == .active { +// viewController?.presentError(error) +// } else { +// ErrorHandler.log(error) +// } +// } +// } + + public static func log(_ error: Error) { + os_log(.error, log: self.log, "%@", error.localizedDescription) + } + +} diff --git a/Multiplatform/Shared/NetNewsWire_MultiplatformApp.swift b/Multiplatform/Shared/NetNewsWire.swift similarity index 50% rename from Multiplatform/Shared/NetNewsWire_MultiplatformApp.swift rename to Multiplatform/Shared/NetNewsWire.swift index 4173d0887..720ac2677 100644 --- a/Multiplatform/Shared/NetNewsWire_MultiplatformApp.swift +++ b/Multiplatform/Shared/NetNewsWire.swift @@ -1,5 +1,5 @@ // -// NetNewsWire_MultiplatformApp.swift +// NetNewsWire.swift // Shared // // Created by Maurice Parker on 6/27/20. @@ -9,7 +9,15 @@ import SwiftUI @main -struct NetNewsWire_MultiplatformApp: App { +struct NetNewsWire: App { + + #if os(macOS) + @NSApplicationDelegateAdaptor(AppDelegate.self) private var delegate + #endif + #if os(iOS) + @UIApplicationDelegateAdaptor(AppDelegate.self) private var delegate + #endif + var body: some Scene { WindowGroup { ContentView() diff --git a/Multiplatform/iOS/AppDelegate.swift b/Multiplatform/iOS/AppDelegate.swift new file mode 100644 index 000000000..6124a75bb --- /dev/null +++ b/Multiplatform/iOS/AppDelegate.swift @@ -0,0 +1,390 @@ +// +// AppDelegate.swift +// Multiplatform iOS +// +// Created by Maurice Parker on 6/28/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import UIKit +import RSCore +import RSWeb +import Account +import BackgroundTasks +import os.log + +var appDelegate: AppDelegate! + +class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, UnreadCountProvider { + + private var bgTaskDispatchQueue = DispatchQueue.init(label: "BGTaskScheduler") + + private var waitBackgroundUpdateTask = UIBackgroundTaskIdentifier.invalid + private var syncBackgroundUpdateTask = UIBackgroundTaskIdentifier.invalid + + var syncTimer: ArticleStatusSyncTimer? + + var shuttingDown = false { + didSet { + if shuttingDown { + syncTimer?.shuttingDown = shuttingDown + syncTimer?.invalidate() + } + } + } + + var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "Application") + + var userNotificationManager: UserNotificationManager! + var faviconDownloader: FaviconDownloader! + var imageDownloader: ImageDownloader! + var authorAvatarDownloader: AuthorAvatarDownloader! + var webFeedIconDownloader: WebFeedIconDownloader! + // TODO: Add Extension back in +// var extensionContainersFile: ExtensionContainersFile! +// var extensionFeedAddRequestFile: ExtensionFeedAddRequestFile! + + var unreadCount = 0 { + didSet { + if unreadCount != oldValue { + postUnreadCountDidChangeNotification() + UIApplication.shared.applicationIconBadgeNumber = unreadCount + } + } + } + + var isSyncArticleStatusRunning = false + var isWaitingForSyncTasks = false + + override init() { + super.init() + appDelegate = self + + let documentAccountURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! + let documentAccountsFolder = documentAccountURL.appendingPathComponent("Accounts").absoluteString + let documentAccountsFolderPath = String(documentAccountsFolder.suffix(from: documentAccountsFolder.index(documentAccountsFolder.startIndex, offsetBy: 7))) + AccountManager.shared = AccountManager(accountsFolder: documentAccountsFolderPath) + FeedProviderManager.shared.delegate = ExtensionPointManager.shared + + NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(accountRefreshDidFinish(_:)), name: .AccountRefreshDidFinish, object: nil) + } + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + AppDefaults.registerDefaults() + + let isFirstRun = AppDefaults.isFirstRun + if isFirstRun { + os_log("Is first run.", log: log, type: .info) + } + + if isFirstRun && !AccountManager.shared.anyAccountHasAtLeastOneFeed() { + let localAccount = AccountManager.shared.defaultAccount + DefaultFeedsImporter.importDefaultFeeds(account: localAccount) + } + + registerBackgroundTasks() + CacheCleaner.purgeIfNecessary() + initializeDownloaders() + initializeHomeScreenQuickActions() + + DispatchQueue.main.async { + self.unreadCount = AccountManager.shared.unreadCount + } + + UNUserNotificationCenter.current().getNotificationSettings { (settings) in + if settings.authorizationStatus == .authorized { + DispatchQueue.main.async { + UIApplication.shared.registerForRemoteNotifications() + } + } + } + + UNUserNotificationCenter.current().delegate = self + userNotificationManager = UserNotificationManager() + +// extensionContainersFile = ExtensionContainersFile() +// extensionFeedAddRequestFile = ExtensionFeedAddRequestFile() + + syncTimer = ArticleStatusSyncTimer() + + #if DEBUG + syncTimer!.update() + #endif + + return true + + } + + func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + DispatchQueue.main.async { + self.resumeDatabaseProcessingIfNecessary() + AccountManager.shared.receiveRemoteNotification(userInfo: userInfo) { + self.suspendApplication() + completionHandler(.newData) + } + } + } + + func applicationWillTerminate(_ application: UIApplication) { + shuttingDown = true + } + + // MARK: Notifications + + @objc func unreadCountDidChange(_ note: Notification) { + if note.object is AccountManager { + unreadCount = AccountManager.shared.unreadCount + } + } + + @objc func accountRefreshDidFinish(_ note: Notification) { + AppDefaults.lastRefresh = Date() + } + + // MARK: - API + + func resumeDatabaseProcessingIfNecessary() { + if AccountManager.shared.isSuspended { + AccountManager.shared.resumeAll() + os_log("Application processing resumed.", log: self.log, type: .info) + } + } + + func prepareAccountsForBackground() { +// extensionFeedAddRequestFile.suspend() + syncTimer?.invalidate() + scheduleBackgroundFeedRefresh() + syncArticleStatus() + waitForSyncTasksToFinish() + } + + func prepareAccountsForForeground() { +// extensionFeedAddRequestFile.resume() + syncTimer?.update() + + if let lastRefresh = AppDefaults.lastRefresh { + if Date() > lastRefresh.addingTimeInterval(15 * 60) { + AccountManager.shared.refreshAll(errorHandler: ErrorHandler.log) + } else { + AccountManager.shared.syncArticleStatusAll() + } + } else { + AccountManager.shared.refreshAll(errorHandler: ErrorHandler.log) + } + } + + func logMessage(_ message: String, type: LogItem.ItemType) { + print("logMessage: \(message) - \(type)") + + } + + func logDebugMessage(_ message: String) { + logMessage(message, type: .debug) + } + + func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { + completionHandler([.banner, .badge, .sound]) + } + + func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { + defer { completionHandler() } + + // TODO: Add back in User Notification handling +// if let sceneDelegate = response.targetScene?.delegate as? SceneDelegate { +// sceneDelegate.handle(response) +// } + + } + +} + +// MARK: App Initialization + +private extension AppDelegate { + + private func initializeDownloaders() { + let tempDir = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first! + let faviconsFolderURL = tempDir.appendingPathComponent("Favicons") + let imagesFolderURL = tempDir.appendingPathComponent("Images") + + try! FileManager.default.createDirectory(at: faviconsFolderURL, withIntermediateDirectories: true, attributes: nil) + let faviconsFolder = faviconsFolderURL.absoluteString + let faviconsFolderPath = faviconsFolder.suffix(from: faviconsFolder.index(faviconsFolder.startIndex, offsetBy: 7)) + faviconDownloader = FaviconDownloader(folder: String(faviconsFolderPath)) + + let imagesFolder = imagesFolderURL.absoluteString + let imagesFolderPath = imagesFolder.suffix(from: imagesFolder.index(imagesFolder.startIndex, offsetBy: 7)) + try! FileManager.default.createDirectory(at: imagesFolderURL, withIntermediateDirectories: true, attributes: nil) + imageDownloader = ImageDownloader(folder: String(imagesFolderPath)) + + authorAvatarDownloader = AuthorAvatarDownloader(imageDownloader: imageDownloader) + + let tempFolder = tempDir.absoluteString + let tempFolderPath = tempFolder.suffix(from: tempFolder.index(tempFolder.startIndex, offsetBy: 7)) + webFeedIconDownloader = WebFeedIconDownloader(imageDownloader: imageDownloader, folder: String(tempFolderPath)) + } + + private func initializeHomeScreenQuickActions() { + let unreadTitle = NSLocalizedString("First Unread", comment: "First Unread") + let unreadIcon = UIApplicationShortcutIcon(systemImageName: "chevron.down.circle") + let unreadItem = UIApplicationShortcutItem(type: "com.ranchero.NetNewsWire.FirstUnread", localizedTitle: unreadTitle, localizedSubtitle: nil, icon: unreadIcon, userInfo: nil) + + let searchTitle = NSLocalizedString("Search", comment: "Search") + let searchIcon = UIApplicationShortcutIcon(systemImageName: "magnifyingglass") + let searchItem = UIApplicationShortcutItem(type: "com.ranchero.NetNewsWire.ShowSearch", localizedTitle: searchTitle, localizedSubtitle: nil, icon: searchIcon, userInfo: nil) + + let addTitle = NSLocalizedString("Add Feed", comment: "Add Feed") + let addIcon = UIApplicationShortcutIcon(systemImageName: "plus") + let addItem = UIApplicationShortcutItem(type: "com.ranchero.NetNewsWire.ShowAdd", localizedTitle: addTitle, localizedSubtitle: nil, icon: addIcon, userInfo: nil) + + UIApplication.shared.shortcutItems = [addItem, searchItem, unreadItem] + } + +} + +// MARK: Go To Background + +private extension AppDelegate { + + func waitForSyncTasksToFinish() { + guard !isWaitingForSyncTasks && UIApplication.shared.applicationState == .background else { return } + + isWaitingForSyncTasks = true + + self.waitBackgroundUpdateTask = UIApplication.shared.beginBackgroundTask { [weak self] in + guard let self = self else { return } + self.completeProcessing(true) + os_log("Accounts wait for progress terminated for running too long.", log: self.log, type: .info) + } + + DispatchQueue.main.async { [weak self] in + self?.waitToComplete() { [weak self] suspend in + self?.completeProcessing(suspend) + } + } + } + + func waitToComplete(completion: @escaping (Bool) -> Void) { + guard UIApplication.shared.applicationState == .background else { + os_log("App came back to forground, no longer waiting.", log: self.log, type: .info) + completion(false) + return + } + + if AccountManager.shared.refreshInProgress || isSyncArticleStatusRunning { + os_log("Waiting for sync to finish...", log: self.log, type: .info) + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in + self?.waitToComplete(completion: completion) + } + } else { + os_log("Refresh progress complete.", log: self.log, type: .info) + completion(true) + } + } + + func completeProcessing(_ suspend: Bool) { + if suspend { + suspendApplication() + } + UIApplication.shared.endBackgroundTask(self.waitBackgroundUpdateTask) + self.waitBackgroundUpdateTask = UIBackgroundTaskIdentifier.invalid + isWaitingForSyncTasks = false + } + + func syncArticleStatus() { + guard !isSyncArticleStatusRunning else { return } + + isSyncArticleStatusRunning = true + + let completeProcessing = { [unowned self] in + self.isSyncArticleStatusRunning = false + UIApplication.shared.endBackgroundTask(self.syncBackgroundUpdateTask) + self.syncBackgroundUpdateTask = UIBackgroundTaskIdentifier.invalid + } + + self.syncBackgroundUpdateTask = UIApplication.shared.beginBackgroundTask { + completeProcessing() + os_log("Accounts sync processing terminated for running too long.", log: self.log, type: .info) + } + + DispatchQueue.main.async { + AccountManager.shared.syncArticleStatusAll() { + completeProcessing() + } + } + } + + func suspendApplication() { + guard UIApplication.shared.applicationState == .background else { return } + + AccountManager.shared.suspendNetworkAll() + AccountManager.shared.suspendDatabaseAll() + CoalescingQueue.standard.performCallsImmediately() + + os_log("Application processing suspended.", log: self.log, type: .info) + } + +} + +// MARK: Background Tasks + +private extension AppDelegate { + + /// Register all background tasks. + func registerBackgroundTasks() { + // Register background feed refresh. + BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.ranchero.NetNewsWire.FeedRefresh", using: nil) { (task) in + self.performBackgroundFeedRefresh(with: task as! BGAppRefreshTask) + } + } + + /// Schedules a background app refresh based on `AppDefaults.refreshInterval`. + func scheduleBackgroundFeedRefresh() { + let request = BGAppRefreshTaskRequest(identifier: "com.ranchero.NetNewsWire.FeedRefresh") + request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60) + + // We send this to a dedicated serial queue because as of 11/05/19 on iOS 13.2 the call to the + // task scheduler can hang indefinitely. + bgTaskDispatchQueue.async { + do { + try BGTaskScheduler.shared.submit(request) + } catch { + os_log(.error, log: self.log, "Could not schedule app refresh: %@", error.localizedDescription) + } + } + } + + /// Performs background feed refresh. + /// - Parameter task: `BGAppRefreshTask` + /// - Warning: As of Xcode 11 beta 2, when triggered from the debugger this doesn't work. + func performBackgroundFeedRefresh(with task: BGAppRefreshTask) { + + scheduleBackgroundFeedRefresh() // schedule next refresh + + os_log("Woken to perform account refresh.", log: self.log, type: .info) + + DispatchQueue.main.async { + if AccountManager.shared.isSuspended { + AccountManager.shared.resumeAll() + } + AccountManager.shared.refreshAll(errorHandler: ErrorHandler.log) { [unowned self] in + if !AccountManager.shared.isSuspended { + self.suspendApplication() + os_log("Account refresh operation completed.", log: self.log, type: .info) + task.setTaskCompleted(success: true) + } + } + } + + // set expiration handler + task.expirationHandler = { [weak task] in + DispatchQueue.main.sync { + self.suspendApplication() + } + os_log("Accounts refresh processing terminated for running too long.", log: self.log, type: .info) + task?.setTaskCompleted(success: false) + } + } + +} diff --git a/Multiplatform/iOS/Info.plist b/Multiplatform/iOS/Info.plist index efc211a0c..0db629280 100644 --- a/Multiplatform/iOS/Info.plist +++ b/Multiplatform/iOS/Info.plist @@ -46,5 +46,40 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + BGTaskSchedulerPermittedIdentifiers + + com.ranchero.NetNewsWire.FeedRefresh + + NSPhotoLibraryAddUsageDescription + Grant permission to save images from the article. + NSUserActivityTypes + + AddWebFeedIntent + NextUnread + ReadArticle + Restoration + SelectFeed + + UIBackgroundModes + + fetch + processing + remote-notification + + UserAgent + NetNewsWire (RSS Reader; https://ranchero.com/netnewswire/) + OrganizationIdentifier + $(ORGANIZATION_IDENTIFIER) + DeveloperEntitlements + $(DEVELOPER_ENTITLEMENTS) + AppGroup + group.$(ORGANIZATION_IDENTIFIER).NetNewsWire.iOS + AppIdentifierPrefix + $(AppIdentifierPrefix) diff --git a/Multiplatform/macOS/AppDelegate.swift b/Multiplatform/macOS/AppDelegate.swift new file mode 100644 index 000000000..f642ce2e8 --- /dev/null +++ b/Multiplatform/macOS/AppDelegate.swift @@ -0,0 +1,286 @@ +// +// AppDelegate.swift +// Multiplatform macOS +// +// Created by Maurice Parker on 6/28/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import AppKit +import os.log +import UserNotifications +import Articles +import RSTree +import RSWeb +import Account +import RSCore + +// If we're not going to import Sparkle, provide dummy protocols to make it easy +// for AppDelegate to comply +#if MAC_APP_STORE || TEST +protocol SPUStandardUserDriverDelegate {} +protocol SPUUpdaterDelegate {} +#else +import Sparkle +#endif + +var appDelegate: AppDelegate! + +class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDelegate, UnreadCountProvider, SPUStandardUserDriverDelegate, SPUUpdaterDelegate +{ + + private var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "Application") + + var userNotificationManager: UserNotificationManager! + var faviconDownloader: FaviconDownloader! + var imageDownloader: ImageDownloader! + var authorAvatarDownloader: AuthorAvatarDownloader! + var webFeedIconDownloader: WebFeedIconDownloader! + + var refreshTimer: AccountRefreshTimer? + var syncTimer: ArticleStatusSyncTimer? + + var shuttingDown = false { + didSet { + if shuttingDown { + refreshTimer?.shuttingDown = shuttingDown + refreshTimer?.invalidate() + syncTimer?.shuttingDown = shuttingDown + syncTimer?.invalidate() + } + } + } + + var unreadCount = 0 { + didSet { + if unreadCount != oldValue { + CoalescingQueue.standard.add(self, #selector(updateDockBadge)) + postUnreadCountDidChangeNotification() + } + } + } + + var appName: String! + + private let appNewsURLString = "https://nnw.ranchero.com/feed.json" + private let appMovementMonitor = RSAppMovementMonitor() + #if !MAC_APP_STORE && !TEST + private var softwareUpdater: SPUUpdater! + #endif + + override init() { + NSWindow.allowsAutomaticWindowTabbing = false + super.init() + + AccountManager.shared = AccountManager(accountsFolder: Platform.dataSubfolder(forApplication: nil, folderName: "Accounts")!) + FeedProviderManager.shared.delegate = ExtensionPointManager.shared + + NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil) + NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(didWakeNotification(_:)), name: NSWorkspace.didWakeNotification, object: nil) + + appDelegate = self + } + + // MARK: - NSApplicationDelegate + + func applicationWillFinishLaunching(_ notification: Notification) { + // TODO: add Apple Events back in +// installAppleEventHandlers() + + CacheCleaner.purgeIfNecessary() + + // Try to establish a cache in the Caches folder, but if it fails for some reason fall back to a temporary dir + let cacheFolder: String + if let userCacheFolder = try? FileManager.default.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: false).path { + cacheFolder = userCacheFolder + } + else { + let bundleIdentifier = (Bundle.main.infoDictionary!["CFBundleIdentifier"]! as! String) + cacheFolder = (NSTemporaryDirectory() as NSString).appendingPathComponent(bundleIdentifier) + } + + let faviconsFolder = (cacheFolder as NSString).appendingPathComponent("Favicons") + let faviconsFolderURL = URL(fileURLWithPath: faviconsFolder) + try! FileManager.default.createDirectory(at: faviconsFolderURL, withIntermediateDirectories: true, attributes: nil) + faviconDownloader = FaviconDownloader(folder: faviconsFolder) + + let imagesFolder = (cacheFolder as NSString).appendingPathComponent("Images") + let imagesFolderURL = URL(fileURLWithPath: imagesFolder) + try! FileManager.default.createDirectory(at: imagesFolderURL, withIntermediateDirectories: true, attributes: nil) + imageDownloader = ImageDownloader(folder: imagesFolder) + + authorAvatarDownloader = AuthorAvatarDownloader(imageDownloader: imageDownloader) + webFeedIconDownloader = WebFeedIconDownloader(imageDownloader: imageDownloader, folder: cacheFolder) + + appName = (Bundle.main.infoDictionary!["CFBundleExecutable"]! as! String) + } + + func applicationDidFinishLaunching(_ note: Notification) { + + #if MAC_APP_STORE || TEST + checkForUpdatesMenuItem.isHidden = true + #else + // Initialize Sparkle... + let hostBundle = Bundle.main + let updateDriver = SPUStandardUserDriver(hostBundle: hostBundle, delegate: self) + self.softwareUpdater = SPUUpdater(hostBundle: hostBundle, applicationBundle: hostBundle, userDriver: updateDriver, delegate: self) + + do { + try self.softwareUpdater.start() + } + catch { + NSLog("Failed to start software updater with error: \(error)") + } + #endif + + AppDefaults.registerDefaults() + let isFirstRun = AppDefaults.isFirstRun + if isFirstRun { + os_log(.debug, log: log, "Is first run.") + } + let localAccount = AccountManager.shared.defaultAccount + + if isFirstRun && !AccountManager.shared.anyAccountHasAtLeastOneFeed() { + DefaultFeedsImporter.importDefaultFeeds(account: localAccount) + } + + + NotificationCenter.default.addObserver(self, selector: #selector(webFeedSettingDidChange(_:)), name: .WebFeedSettingDidChange, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(userDefaultsDidChange(_:)), name: UserDefaults.didChangeNotification, object: nil) + + DispatchQueue.main.async { + self.unreadCount = AccountManager.shared.unreadCount + } + + refreshTimer = AccountRefreshTimer() + syncTimer = ArticleStatusSyncTimer() + + UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .sound, .alert]) { (granted, error) in } + NSApplication.shared.registerForRemoteNotifications() + + UNUserNotificationCenter.current().delegate = self + userNotificationManager = UserNotificationManager() + + // TODO: Add a debug menu +// if AppDefaults.showDebugMenu { +// refreshTimer!.update() +// syncTimer!.update() +// +// // The Web Inspector uses SPI and can never appear in a MAC_APP_STORE build. +// #if MAC_APP_STORE +// let debugMenu = debugMenuItem.submenu! +// let toggleWebInspectorItemIndex = debugMenu.indexOfItem(withTarget: self, andAction: #selector(toggleWebInspectorEnabled(_:))) +// if toggleWebInspectorItemIndex != -1 { +// debugMenu.removeItem(at: toggleWebInspectorItemIndex) +// } +// #endif +// } else { +// debugMenuItem.menu?.removeItem(debugMenuItem) +// DispatchQueue.main.async { +// self.refreshTimer!.timedRefresh(nil) +// self.syncTimer!.timedRefresh(nil) +// } +// } + + // TODO: Add back in crash reporter +// #if !MAC_APP_STORE +// DispatchQueue.main.async { +// CrashReporter.check(appName: "NetNewsWire") +// } +// #endif + + } + + func applicationDidBecomeActive(_ notification: Notification) { + fireOldTimers() + } + + func applicationDidResignActive(_ notification: Notification) { + ArticleStringFormatter.emptyCaches() + } + + func application(_ application: NSApplication, didReceiveRemoteNotification userInfo: [String : Any]) { + AccountManager.shared.receiveRemoteNotification(userInfo: userInfo) + } + + func applicationWillTerminate(_ notification: Notification) { + shuttingDown = true + } + + // MARK: Notifications + @objc func unreadCountDidChange(_ note: Notification) { + if note.object is AccountManager { + unreadCount = AccountManager.shared.unreadCount + } + } + + @objc func webFeedSettingDidChange(_ note: Notification) { + guard let feed = note.object as? WebFeed, let key = note.userInfo?[WebFeed.WebFeedSettingUserInfoKey] as? String else { + return + } + if key == WebFeed.WebFeedSettingKey.homePageURL || key == WebFeed.WebFeedSettingKey.faviconURL { + let _ = faviconDownloader.favicon(for: feed) + } + } + + @objc func userDefaultsDidChange(_ note: Notification) { + refreshTimer?.update() + updateDockBadge() + } + + @objc func didWakeNotification(_ note: Notification) { + fireOldTimers() + } + + // MARK: UNUserNotificationCenterDelegate + + func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { + completionHandler([.banner, .badge, .sound]) + } + + func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { +// TODO: Add back in Notification handling +// mainWindowController?.handle(response) + completionHandler() + } + + // MARK: - Dock Badge + @objc func updateDockBadge() { + let label = unreadCount > 0 && !AppDefaults.hideDockUnreadCount ? "\(unreadCount)" : "" + NSApplication.shared.dockTile.badgeLabel = label + } + +} + +private extension AppDelegate { + + func fireOldTimers() { + // It’s possible there’s a refresh timer set to go off in the past. + // In that case, refresh now and update the timer. + refreshTimer?.fireOldTimer() + syncTimer?.fireOldTimer() + } + +} + +/* + the ScriptingAppDelegate protocol exposes a narrow set of accessors with + internal visibility which are very similar to some private vars. + + These would be unnecessary if the similar accessors were marked internal rather than private, + but for now, we'll keep the stratification of visibility +*/ +//extension AppDelegate : ScriptingAppDelegate { +// +// internal var scriptingMainWindowController: ScriptingMainWindowController? { +// return mainWindowController +// } +// +// internal var scriptingCurrentArticle: Article? { +// return self.scriptingMainWindowController?.scriptingCurrentArticle +// } +// +// internal var scriptingSelectedArticles: [Article] { +// return self.scriptingMainWindowController?.scriptingSelectedArticles ?? [] +// } +//} diff --git a/Multiplatform/macOS/Info.plist b/Multiplatform/macOS/Info.plist index 705980986..a4af5e913 100644 --- a/Multiplatform/macOS/Info.plist +++ b/Multiplatform/macOS/Info.plist @@ -24,5 +24,16 @@ $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright Copyright © 2020 Ranchero Software. All rights reserved. + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + UserAgent + NetNewsWire (RSS Reader; https://ranchero.com/netnewswire/) + OrganizationIdentifier + $(ORGANIZATION_IDENTIFIER) + DeveloperEntitlements + $(DEVELOPER_ENTITLEMENTS) diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index bd14b6619..00b2b37e8 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -251,8 +251,8 @@ 51BC4B00247277E0000A6ED8 /* URL-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51BC4ADD247277DF000A6ED8 /* URL-Extensions.swift */; }; 51BC4B01247277E0000A6ED8 /* URL-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51BC4ADD247277DF000A6ED8 /* URL-Extensions.swift */; }; 51BEB22D2451E8340066DEDD /* TwitterEnterDetailTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51BEB22C2451E8340066DEDD /* TwitterEnterDetailTableViewController.swift */; }; - 51C0515E24A77DF800194D5E /* NetNewsWire_MultiplatformApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C0513624A77DF700194D5E /* NetNewsWire_MultiplatformApp.swift */; }; - 51C0515F24A77DF800194D5E /* NetNewsWire_MultiplatformApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C0513624A77DF700194D5E /* NetNewsWire_MultiplatformApp.swift */; }; + 51C0515E24A77DF800194D5E /* NetNewsWire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C0513624A77DF700194D5E /* NetNewsWire.swift */; }; + 51C0515F24A77DF800194D5E /* NetNewsWire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C0513624A77DF700194D5E /* NetNewsWire.swift */; }; 51C0516024A77DF800194D5E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C0513724A77DF700194D5E /* ContentView.swift */; }; 51C0516124A77DF800194D5E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C0513724A77DF700194D5E /* ContentView.swift */; }; 51C0516224A77DF800194D5E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 51C0513824A77DF800194D5E /* Assets.xcassets */; }; @@ -344,6 +344,189 @@ 51E3EB3D229AB08300645299 /* ErrorHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E3EB3C229AB08300645299 /* ErrorHandler.swift */; }; 51E43962238037C400015C31 /* AddWebFeedFolderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E43961238037C400015C31 /* AddWebFeedFolderViewController.swift */; }; 51E4398023805EBC00015C31 /* AddComboTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4397F23805EBC00015C31 /* AddComboTableViewCell.swift */; }; + 51E4987F24A8061400B667CB /* Account.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8407166A2262A60D00344432 /* Account.framework */; }; + 51E4988024A8061400B667CB /* Account.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8407166A2262A60D00344432 /* Account.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4988124A8061400B667CB /* Articles.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 840716732262A60F00344432 /* Articles.framework */; }; + 51E4988224A8061400B667CB /* Articles.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 840716732262A60F00344432 /* Articles.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4988324A8061400B667CB /* ArticlesDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8407167F2262A61100344432 /* ArticlesDatabase.framework */; }; + 51E4988424A8061400B667CB /* ArticlesDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8407167F2262A61100344432 /* ArticlesDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4988524A8061400B667CB /* OAuthSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 517A755324451BD500B553B9 /* OAuthSwift.framework */; }; + 51E4988624A8061400B667CB /* OAuthSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 517A755324451BD500B553B9 /* OAuthSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4988724A8061400B667CB /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8520DD8CF200CA8CF5 /* RSCore.framework */; }; + 51E4988824A8061400B667CB /* RSCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8520DD8CF200CA8CF5 /* RSCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4988924A8061400B667CB /* RSDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FC420DD8E0C00CA8CF5 /* RSDatabase.framework */; }; + 51E4988A24A8061400B667CB /* RSDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FC420DD8E0C00CA8CF5 /* RSDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4988B24A8061400B667CB /* RSParser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8C20DD8CF800CA8CF5 /* RSParser.framework */; }; + 51E4988C24A8061400B667CB /* RSParser.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8C20DD8CF800CA8CF5 /* RSParser.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4988D24A8061400B667CB /* RSTree.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9520DD8CFE00CA8CF5 /* RSTree.framework */; }; + 51E4988E24A8061400B667CB /* RSTree.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9520DD8CFE00CA8CF5 /* RSTree.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4988F24A8061400B667CB /* RSWeb.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FA320DD8D0500CA8CF5 /* RSWeb.framework */; }; + 51E4989024A8061400B667CB /* RSWeb.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FA320DD8D0500CA8CF5 /* RSWeb.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4989124A8061400B667CB /* Secrets.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5102FD7B244008A700534F17 /* Secrets.framework */; }; + 51E4989224A8061400B667CB /* Secrets.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5102FD7B244008A700534F17 /* Secrets.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4989324A8061400B667CB /* SyncDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; }; + 51E4989424A8061400B667CB /* SyncDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4989724A8065700B667CB /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51E4989624A8065700B667CB /* CloudKit.framework */; }; + 51E4989924A8067000B667CB /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51E4989824A8067000B667CB /* WebKit.framework */; }; + 51E4989A24A8069300B667CB /* Account.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8407166A2262A60D00344432 /* Account.framework */; }; + 51E4989B24A8069300B667CB /* Account.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8407166A2262A60D00344432 /* Account.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4989C24A8069300B667CB /* Articles.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 840716732262A60F00344432 /* Articles.framework */; }; + 51E4989D24A8069300B667CB /* Articles.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 840716732262A60F00344432 /* Articles.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E4989E24A8069300B667CB /* ArticlesDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8407167F2262A61100344432 /* ArticlesDatabase.framework */; }; + 51E4989F24A8069300B667CB /* ArticlesDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8407167F2262A61100344432 /* ArticlesDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E498A024A8069300B667CB /* OAuthSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 517A755524451BD500B553B9 /* OAuthSwift.framework */; }; + 51E498A124A8069300B667CB /* OAuthSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 517A755524451BD500B553B9 /* OAuthSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E498A224A8069300B667CB /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8120DD8CF200CA8CF5 /* RSCore.framework */; }; + 51E498A324A8069300B667CB /* RSCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8120DD8CF200CA8CF5 /* RSCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E498A424A8069300B667CB /* RSDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FC020DD8E0C00CA8CF5 /* RSDatabase.framework */; }; + 51E498A524A8069300B667CB /* RSDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FC020DD8E0C00CA8CF5 /* RSDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E498A624A8069300B667CB /* RSParser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8C20DD8CF800CA8CF5 /* RSParser.framework */; }; + 51E498A724A8069300B667CB /* RSParser.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8C20DD8CF800CA8CF5 /* RSParser.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E498A824A8069300B667CB /* RSTree.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9520DD8CFE00CA8CF5 /* RSTree.framework */; }; + 51E498A924A8069300B667CB /* RSTree.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9520DD8CFE00CA8CF5 /* RSTree.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E498AA24A8069300B667CB /* RSWeb.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9F20DD8D0500CA8CF5 /* RSWeb.framework */; }; + 51E498AB24A8069300B667CB /* RSWeb.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9F20DD8D0500CA8CF5 /* RSWeb.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E498AC24A8069300B667CB /* Secrets.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5102FD7B244008A700534F17 /* Secrets.framework */; }; + 51E498AD24A8069300B667CB /* Secrets.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5102FD7B244008A700534F17 /* Secrets.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E498AE24A8069300B667CB /* SyncDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; }; + 51E498AF24A8069300B667CB /* SyncDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51E498B124A806A400B667CB /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51E4DAEC2425F6940091EB5B /* CloudKit.framework */; }; + 51E498B324A806AA00B667CB /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51E498B224A806AA00B667CB /* WebKit.framework */; }; + 51E498C724A8085D00B667CB /* StarredFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845EE7B01FC2366500854A1F /* StarredFeedDelegate.swift */; }; + 51E498C824A8085D00B667CB /* SmartFeedsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CC88171FE59CBF00644329 /* SmartFeedsController.swift */; }; + 51E498C924A8085D00B667CB /* PseudoFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5351FC22FCB00998D64 /* PseudoFeed.swift */; }; + 51E498CA24A8085D00B667CB /* SmartFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DEE56422C32CA4005FC42C /* SmartFeedDelegate.swift */; }; + 51E498CB24A8085D00B667CB /* TodayFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5361FC22FCB00998D64 /* TodayFeedDelegate.swift */; }; + 51E498CC24A8085D00B667CB /* SearchFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8477ACBD22238E9500DF7F37 /* SearchFeedDelegate.swift */; }; + 51E498CD24A8085D00B667CB /* SearchTimelineFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51938DF1231AFC660055A1A0 /* SearchTimelineFeedDelegate.swift */; }; + 51E498CE24A8085D00B667CB /* UnreadFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5391FC2308B00998D64 /* UnreadFeed.swift */; }; + 51E498CF24A8085D00B667CB /* SmartFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845EE7C01FC2488C00854A1F /* SmartFeed.swift */; }; + 51E498F124A8085D00B667CB /* StarredFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845EE7B01FC2366500854A1F /* StarredFeedDelegate.swift */; }; + 51E498F224A8085D00B667CB /* SmartFeedsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CC88171FE59CBF00644329 /* SmartFeedsController.swift */; }; + 51E498F324A8085D00B667CB /* PseudoFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5351FC22FCB00998D64 /* PseudoFeed.swift */; }; + 51E498F424A8085D00B667CB /* SmartFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DEE56422C32CA4005FC42C /* SmartFeedDelegate.swift */; }; + 51E498F524A8085D00B667CB /* TodayFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5361FC22FCB00998D64 /* TodayFeedDelegate.swift */; }; + 51E498F624A8085D00B667CB /* SearchFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8477ACBD22238E9500DF7F37 /* SearchFeedDelegate.swift */; }; + 51E498F724A8085D00B667CB /* SearchTimelineFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51938DF1231AFC660055A1A0 /* SearchTimelineFeedDelegate.swift */; }; + 51E498F824A8085D00B667CB /* UnreadFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5391FC2308B00998D64 /* UnreadFeed.swift */; }; + 51E498F924A8085D00B667CB /* SmartFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845EE7C01FC2488C00854A1F /* SmartFeed.swift */; }; + 51E498FA24A808BA00B667CB /* SingleFaviconDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845A29081FC74B8E007B49E3 /* SingleFaviconDownloader.swift */; }; + 51E498FB24A808BA00B667CB /* FaviconGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51EF0F76227716200050506E /* FaviconGenerator.swift */; }; + 51E498FC24A808BA00B667CB /* FaviconURLFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84FF69B01FC3793300DC198E /* FaviconURLFinder.swift */; }; + 51E498FD24A808BA00B667CB /* ColorHash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51EF0F78227716380050506E /* ColorHash.swift */; }; + 51E498FE24A808BA00B667CB /* FaviconDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848F6AE41FC29CFA002D422E /* FaviconDownloader.swift */; }; + 51E498FF24A808BB00B667CB /* SingleFaviconDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845A29081FC74B8E007B49E3 /* SingleFaviconDownloader.swift */; }; + 51E4990024A808BB00B667CB /* FaviconGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51EF0F76227716200050506E /* FaviconGenerator.swift */; }; + 51E4990124A808BB00B667CB /* FaviconURLFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84FF69B01FC3793300DC198E /* FaviconURLFinder.swift */; }; + 51E4990224A808BB00B667CB /* ColorHash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51EF0F78227716380050506E /* ColorHash.swift */; }; + 51E4990324A808BB00B667CB /* FaviconDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848F6AE41FC29CFA002D422E /* FaviconDownloader.swift */; }; + 51E4990424A808C300B667CB /* WebFeedIconDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842611891FCB67AA0086A189 /* WebFeedIconDownloader.swift */; }; + 51E4990524A808C300B667CB /* FeaturedImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8426119F1FCB72600086A189 /* FeaturedImageDownloader.swift */; }; + 51E4990624A808C300B667CB /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845213221FCA5B10003B6E93 /* ImageDownloader.swift */; }; + 51E4990724A808C300B667CB /* AuthorAvatarDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E850851FCB60CE0072EA88 /* AuthorAvatarDownloader.swift */; }; + 51E4990824A808C300B667CB /* RSHTMLMetadata+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842611A11FCB769D0086A189 /* RSHTMLMetadata+Extension.swift */; }; + 51E4990924A808C500B667CB /* WebFeedIconDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842611891FCB67AA0086A189 /* WebFeedIconDownloader.swift */; }; + 51E4990A24A808C500B667CB /* FeaturedImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8426119F1FCB72600086A189 /* FeaturedImageDownloader.swift */; }; + 51E4990B24A808C500B667CB /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845213221FCA5B10003B6E93 /* ImageDownloader.swift */; }; + 51E4990C24A808C500B667CB /* AuthorAvatarDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E850851FCB60CE0072EA88 /* AuthorAvatarDownloader.swift */; }; + 51E4990D24A808C500B667CB /* RSHTMLMetadata+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842611A11FCB769D0086A189 /* RSHTMLMetadata+Extension.swift */; }; + 51E4990E24A808CC00B667CB /* HTMLMetadataDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8426119D1FCB6ED40086A189 /* HTMLMetadataDownloader.swift */; }; + 51E4990F24A808CC00B667CB /* HTMLMetadataDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8426119D1FCB6ED40086A189 /* HTMLMetadataDownloader.swift */; }; + 51E4991024A808DE00B667CB /* SmallIconProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84411E701FE5FBFA004B527F /* SmallIconProvider.swift */; }; + 51E4991124A808DE00B667CB /* SmallIconProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84411E701FE5FBFA004B527F /* SmallIconProvider.swift */; }; + 51E4991224A808FB00B667CB /* AddWebFeedDefaultContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51A66684238075AE00CB272D /* AddWebFeedDefaultContainer.swift */; }; + 51E4991324A808FB00B667CB /* AddWebFeedDefaultContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51A66684238075AE00CB272D /* AddWebFeedDefaultContainer.swift */; }; + 51E4991424A808FF00B667CB /* ArticleStringFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97731ED9EC04007D329B /* ArticleStringFormatter.swift */; }; + 51E4991524A808FF00B667CB /* ArticleStringFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97731ED9EC04007D329B /* ArticleStringFormatter.swift */; }; + 51E4991624A8090300B667CB /* ArticleUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97581ED9EB0D007D329B /* ArticleUtilities.swift */; }; + 51E4991724A8090400B667CB /* ArticleUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97581ED9EB0D007D329B /* ArticleUtilities.swift */; }; + 51E4991824A8090A00B667CB /* CacheCleaner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5108F6B52375E612001ABC45 /* CacheCleaner.swift */; }; + 51E4991924A8090A00B667CB /* CacheCleaner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5108F6B52375E612001ABC45 /* CacheCleaner.swift */; }; + 51E4991A24A8090F00B667CB /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE9DE2372269A007DEEAA /* IconImage.swift */; }; + 51E4991B24A8091000B667CB /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE9DE2372269A007DEEAA /* IconImage.swift */; }; + 51E4991C24A8092000B667CB /* NSAttributedString+NetNewsWire.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E9ABA245AB88300DA5718 /* NSAttributedString+NetNewsWire.swift */; }; + 51E4991D24A8092100B667CB /* NSAttributedString+NetNewsWire.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E9ABA245AB88300DA5718 /* NSAttributedString+NetNewsWire.swift */; }; + 51E4991E24A8094300B667CB /* RSImage-AppIcons.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2B8075D239C49D300F191E0 /* RSImage-AppIcons.swift */; }; + 51E4991F24A8094300B667CB /* RSImage-AppIcons.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2B8075D239C49D300F191E0 /* RSImage-AppIcons.swift */; }; + 51E4992024A8095000B667CB /* RSImage-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51126DA3225FDE2F00722696 /* RSImage-Extensions.swift */; }; + 51E4992124A8095000B667CB /* RSImage-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51126DA3225FDE2F00722696 /* RSImage-Extensions.swift */; }; + 51E4992224A8095600B667CB /* URL-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51BC4ADD247277DF000A6ED8 /* URL-Extensions.swift */; }; + 51E4992324A8095700B667CB /* URL-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51BC4ADD247277DF000A6ED8 /* URL-Extensions.swift */; }; + 51E4992424A8098400B667CB /* SmartFeedPasteboardWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AD1EB92031649C00BC20B7 /* SmartFeedPasteboardWriter.swift */; }; + 51E4992624A80AAB00B667CB /* AppAssets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4992524A80AAB00B667CB /* AppAssets.swift */; }; + 51E4992724A80AAB00B667CB /* AppAssets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4992524A80AAB00B667CB /* AppAssets.swift */; }; + 51E4992924A866F000B667CB /* AppDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4992824A866F000B667CB /* AppDefaults.swift */; }; + 51E4992A24A866F000B667CB /* AppDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4992824A866F000B667CB /* AppDefaults.swift */; }; + 51E4992B24A8676300B667CB /* ArticleArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F204DF1FAACBB30076E152 /* ArticleArray.swift */; }; + 51E4992C24A8676300B667CB /* ArticleSorter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF3ABF1423259DDB0074C542 /* ArticleSorter.swift */; }; + 51E4992D24A8676300B667CB /* FetchRequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CAFCAE22BC8C35007694F0 /* FetchRequestOperation.swift */; }; + 51E4992E24A8676300B667CB /* FetchRequestQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CAFCA322BC8C08007694F0 /* FetchRequestQueue.swift */; }; + 51E4992F24A8676400B667CB /* ArticleArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F204DF1FAACBB30076E152 /* ArticleArray.swift */; }; + 51E4993024A8676400B667CB /* ArticleSorter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF3ABF1423259DDB0074C542 /* ArticleSorter.swift */; }; + 51E4993124A8676400B667CB /* FetchRequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CAFCAE22BC8C35007694F0 /* FetchRequestOperation.swift */; }; + 51E4993224A8676400B667CB /* FetchRequestQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CAFCA322BC8C08007694F0 /* FetchRequestQueue.swift */; }; + 51E4993324A867E700B667CB /* AppNotifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842E45CD1ED8C308000A8B52 /* AppNotifications.swift */; }; + 51E4993424A867E700B667CB /* UserInfoKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 511B9805237DCAC90028BCAA /* UserInfoKey.swift */; }; + 51E4993524A867E800B667CB /* AppNotifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842E45CD1ED8C308000A8B52 /* AppNotifications.swift */; }; + 51E4993624A867E800B667CB /* UserInfoKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 511B9805237DCAC90028BCAA /* UserInfoKey.swift */; }; + 51E4993724A8680E00B667CB /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513228F2233037620033D4ED /* Reachability.swift */; }; + 51E4993824A8680E00B667CB /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513228F2233037620033D4ED /* Reachability.swift */; }; + 51E4993A24A8708800B667CB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4993924A8708800B667CB /* AppDelegate.swift */; }; + 51E4993C24A8709900B667CB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4993B24A8709900B667CB /* AppDelegate.swift */; }; + 51E4993D24A870F800B667CB /* UserNotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51FE10022345529D0056195D /* UserNotificationManager.swift */; }; + 51E4993E24A870F900B667CB /* UserNotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51FE10022345529D0056195D /* UserNotificationManager.swift */; }; + 51E4993F24A8713B00B667CB /* ArticleStatusSyncTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E595A4228CC36500FCC42B /* ArticleStatusSyncTimer.swift */; }; + 51E4994024A8713B00B667CB /* AccountRefreshTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCE7226F68D90010922C /* AccountRefreshTimer.swift */; }; + 51E4994124A8713B00B667CB /* RefreshInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCE4226F4DFA0010922C /* RefreshInterval.swift */; }; + 51E4994224A8713C00B667CB /* ArticleStatusSyncTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E595A4228CC36500FCC42B /* ArticleStatusSyncTimer.swift */; }; + 51E4994424A8713C00B667CB /* RefreshInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCE4226F4DFA0010922C /* RefreshInterval.swift */; }; + 51E4994524A872AD00B667CB /* org.sparkle-project.Downloader.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = 65ED42BC235E71B40081F399 /* org.sparkle-project.Downloader.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 51E4994624A872AD00B667CB /* org.sparkle-project.InstallerConnection.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = 65ED42B8235E71B40081F399 /* org.sparkle-project.InstallerConnection.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 51E4994724A872AD00B667CB /* org.sparkle-project.InstallerLauncher.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = 65ED42B6235E71B40081F399 /* org.sparkle-project.InstallerLauncher.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 51E4994824A872AD00B667CB /* org.sparkle-project.InstallerStatus.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = 65ED42BA235E71B40081F399 /* org.sparkle-project.InstallerStatus.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 51E4994A24A8734C00B667CB /* ExtensionPointManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A50E5243D07A90089E588 /* ExtensionPointManager.swift */; }; + 51E4994B24A8734C00B667CB /* SendToMicroBlogCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84A14FF220048CA70046AD9A /* SendToMicroBlogCommand.swift */; }; + 51E4994C24A8734C00B667CB /* RedditFeedProvider-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5193CD57245E44A90092735E /* RedditFeedProvider-Extensions.swift */; }; + 51E4994D24A8734C00B667CB /* ExtensionPointIdentifer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A5176243E90200089E588 /* ExtensionPointIdentifer.swift */; }; + 51E4994E24A8734C00B667CB /* SendToMarsEditCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84A1500420048DDF0046AD9A /* SendToMarsEditCommand.swift */; }; + 51E4994F24A8734C00B667CB /* TwitterFeedProvider-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A5106243D0CCD0089E588 /* TwitterFeedProvider-Extensions.swift */; }; + 51E4995024A8734C00B667CB /* ExtensionPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510C43F6243D035C009F70C3 /* ExtensionPoint.swift */; }; + 51E4995124A8734D00B667CB /* ExtensionPointManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A50E5243D07A90089E588 /* ExtensionPointManager.swift */; }; + 51E4995324A8734D00B667CB /* RedditFeedProvider-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5193CD57245E44A90092735E /* RedditFeedProvider-Extensions.swift */; }; + 51E4995424A8734D00B667CB /* ExtensionPointIdentifer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A5176243E90200089E588 /* ExtensionPointIdentifer.swift */; }; + 51E4995624A8734D00B667CB /* TwitterFeedProvider-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A5106243D0CCD0089E588 /* TwitterFeedProvider-Extensions.swift */; }; + 51E4995724A8734D00B667CB /* ExtensionPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510C43F6243D035C009F70C3 /* ExtensionPoint.swift */; }; + 51E4995924A873F900B667CB /* ErrorHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4995824A873F900B667CB /* ErrorHandler.swift */; }; + 51E4995A24A873F900B667CB /* ErrorHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4995824A873F900B667CB /* ErrorHandler.swift */; }; + 51E4995B24A875D500B667CB /* ArticlePasteboardWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E95D231FB1087500552D99 /* ArticlePasteboardWriter.swift */; }; + 51E4995C24A875F300B667CB /* ArticleRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A977D1ED9EC42007D329B /* ArticleRenderer.swift */; }; + 51E4995D24A875F300B667CB /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 517630032336215100E15FFF /* main.js */; }; + 51E4995E24A875F300B667CB /* newsfoot.js in Resources */ = {isa = PBXBuildFile; fileRef = 49F40DEF2335B71000552BF4 /* newsfoot.js */; }; + 51E4995F24A875F300B667CB /* shared.css in Resources */ = {isa = PBXBuildFile; fileRef = B27EEBDF244D15F2000932E6 /* shared.css */; }; + 51E4996024A875F300B667CB /* template.html in Resources */ = {isa = PBXBuildFile; fileRef = 848362FE2262A30E00DA1D35 /* template.html */; }; + 51E4996124A875F400B667CB /* ArticleRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A977D1ED9EC42007D329B /* ArticleRenderer.swift */; }; + 51E4996224A875F400B667CB /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 517630032336215100E15FFF /* main.js */; }; + 51E4996324A875F400B667CB /* newsfoot.js in Resources */ = {isa = PBXBuildFile; fileRef = 49F40DEF2335B71000552BF4 /* newsfoot.js */; }; + 51E4996424A875F400B667CB /* shared.css in Resources */ = {isa = PBXBuildFile; fileRef = B27EEBDF244D15F2000932E6 /* shared.css */; }; + 51E4996524A875F400B667CB /* template.html in Resources */ = {isa = PBXBuildFile; fileRef = 848362FE2262A30E00DA1D35 /* template.html */; }; + 51E4996624A8760B00B667CB /* ArticleStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97871ED9ECEF007D329B /* ArticleStyle.swift */; }; + 51E4996724A8760B00B667CB /* ArticleStylesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97881ED9ECEF007D329B /* ArticleStylesManager.swift */; }; + 51E4996824A8760C00B667CB /* ArticleStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97871ED9ECEF007D329B /* ArticleStyle.swift */; }; + 51E4996924A8760C00B667CB /* ArticleStylesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97881ED9ECEF007D329B /* ArticleStylesManager.swift */; }; + 51E4996A24A8762D00B667CB /* ExtractedArticle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51FA73A62332BE880090D516 /* ExtractedArticle.swift */; }; + 51E4996B24A8762D00B667CB /* ArticleExtractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51FA73A32332BE110090D516 /* ArticleExtractor.swift */; }; + 51E4996C24A8762D00B667CB /* ExtractedArticle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51FA73A62332BE880090D516 /* ExtractedArticle.swift */; }; + 51E4996D24A8762D00B667CB /* ArticleExtractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51FA73A32332BE110090D516 /* ArticleExtractor.swift */; }; + 51E4996E24A8764C00B667CB /* ActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51934CCD2310792F006127BE /* ActivityManager.swift */; }; + 51E4996F24A8764C00B667CB /* ActivityType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51D87EE02311D34700E63F03 /* ActivityType.swift */; }; + 51E4997024A8764C00B667CB /* ActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51934CCD2310792F006127BE /* ActivityManager.swift */; }; + 51E4997124A8764C00B667CB /* ActivityType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51D87EE02311D34700E63F03 /* ActivityType.swift */; }; + 51E4997224A8784300B667CB /* DefaultFeedsImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97591ED9EB0D007D329B /* DefaultFeedsImporter.swift */; }; + 51E4997324A8784300B667CB /* DefaultFeeds.opml in Resources */ = {isa = PBXBuildFile; fileRef = 84A3EE52223B667F00557320 /* DefaultFeeds.opml */; }; + 51E4997424A8784400B667CB /* DefaultFeedsImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97591ED9EB0D007D329B /* DefaultFeedsImporter.swift */; }; + 51E4997524A8784400B667CB /* DefaultFeeds.opml in Resources */ = {isa = PBXBuildFile; fileRef = 84A3EE52223B667F00557320 /* DefaultFeeds.opml */; }; + 51E4997624A87FFC00B667CB /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65ED42B0235E71B40081F399 /* Sparkle.framework */; }; + 51E4997724A87FFC00B667CB /* Sparkle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 65ED42B0235E71B40081F399 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 51E4DAED2425F6940091EB5B /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51E4DAEC2425F6940091EB5B /* CloudKit.framework */; }; 51E4DB082425F9EB0091EB5B /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51E4DB072425F9EB0091EB5B /* CloudKit.framework */; }; 51E595A5228CC36500FCC42B /* ArticleStatusSyncTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E595A4228CC36500FCC42B /* ArticleStatusSyncTimer.swift */; }; @@ -1320,6 +1503,63 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 51E4989524A8061400B667CB /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 51E4989024A8061400B667CB /* RSWeb.framework in Embed Frameworks */, + 51E4988A24A8061400B667CB /* RSDatabase.framework in Embed Frameworks */, + 51E4988E24A8061400B667CB /* RSTree.framework in Embed Frameworks */, + 51E4988024A8061400B667CB /* Account.framework in Embed Frameworks */, + 51E4988224A8061400B667CB /* Articles.framework in Embed Frameworks */, + 51E4988624A8061400B667CB /* OAuthSwift.framework in Embed Frameworks */, + 51E4989424A8061400B667CB /* SyncDatabase.framework in Embed Frameworks */, + 51E4988824A8061400B667CB /* RSCore.framework in Embed Frameworks */, + 51E4988C24A8061400B667CB /* RSParser.framework in Embed Frameworks */, + 51E4989224A8061400B667CB /* Secrets.framework in Embed Frameworks */, + 51E4988424A8061400B667CB /* ArticlesDatabase.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 51E498B024A8069300B667CB /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 51E498AB24A8069300B667CB /* RSWeb.framework in Embed Frameworks */, + 51E498A524A8069300B667CB /* RSDatabase.framework in Embed Frameworks */, + 51E498A924A8069300B667CB /* RSTree.framework in Embed Frameworks */, + 51E4989B24A8069300B667CB /* Account.framework in Embed Frameworks */, + 51E4989D24A8069300B667CB /* Articles.framework in Embed Frameworks */, + 51E498A124A8069300B667CB /* OAuthSwift.framework in Embed Frameworks */, + 51E498AF24A8069300B667CB /* SyncDatabase.framework in Embed Frameworks */, + 51E4997724A87FFC00B667CB /* Sparkle.framework in Embed Frameworks */, + 51E498A324A8069300B667CB /* RSCore.framework in Embed Frameworks */, + 51E498A724A8069300B667CB /* RSParser.framework in Embed Frameworks */, + 51E498AD24A8069300B667CB /* Secrets.framework in Embed Frameworks */, + 51E4989F24A8069300B667CB /* ArticlesDatabase.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 51E4994924A872AD00B667CB /* Embed XPC Services */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/XPCServices"; + dstSubfolderSpec = 16; + files = ( + 51E4994824A872AD00B667CB /* org.sparkle-project.InstallerStatus.xpc in Embed XPC Services */, + 51E4994624A872AD00B667CB /* org.sparkle-project.InstallerConnection.xpc in Embed XPC Services */, + 51E4994724A872AD00B667CB /* org.sparkle-project.InstallerLauncher.xpc in Embed XPC Services */, + 51E4994524A872AD00B667CB /* org.sparkle-project.Downloader.xpc in Embed XPC Services */, + ); + name = "Embed XPC Services"; + runOnlyForDeploymentPostprocessing = 0; + }; 6581C75720CED60100F4AD34 /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -1565,7 +1805,7 @@ 51BB7C302335ACDE008E8144 /* page.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = page.html; sourceTree = ""; }; 51BC4ADD247277DF000A6ED8 /* URL-Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URL-Extensions.swift"; sourceTree = ""; }; 51BEB22C2451E8340066DEDD /* TwitterEnterDetailTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwitterEnterDetailTableViewController.swift; sourceTree = ""; }; - 51C0513624A77DF700194D5E /* NetNewsWire_MultiplatformApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetNewsWire_MultiplatformApp.swift; sourceTree = ""; }; + 51C0513624A77DF700194D5E /* NetNewsWire.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetNewsWire.swift; sourceTree = ""; }; 51C0513724A77DF700194D5E /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 51C0513824A77DF800194D5E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 51C0513D24A77DF800194D5E /* NetNewsWire.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetNewsWire.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1613,6 +1853,14 @@ 51E3EB3C229AB08300645299 /* ErrorHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorHandler.swift; sourceTree = ""; }; 51E43961238037C400015C31 /* AddWebFeedFolderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddWebFeedFolderViewController.swift; sourceTree = ""; }; 51E4397F23805EBC00015C31 /* AddComboTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddComboTableViewCell.swift; sourceTree = ""; }; + 51E4989624A8065700B667CB /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CloudKit.framework; sourceTree = DEVELOPER_DIR; }; + 51E4989824A8067000B667CB /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/WebKit.framework; sourceTree = DEVELOPER_DIR; }; + 51E498B224A806AA00B667CB /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + 51E4992524A80AAB00B667CB /* AppAssets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppAssets.swift; sourceTree = ""; }; + 51E4992824A866F000B667CB /* AppDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDefaults.swift; sourceTree = ""; }; + 51E4993924A8708800B667CB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 51E4993B24A8709900B667CB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 51E4995824A873F900B667CB /* ErrorHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorHandler.swift; sourceTree = ""; }; 51E4DAEC2425F6940091EB5B /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; }; 51E4DB072425F9EB0091EB5B /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/System/Library/Frameworks/CloudKit.framework; sourceTree = DEVELOPER_DIR; }; 51E595A4228CC36500FCC42B /* ArticleStatusSyncTimer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleStatusSyncTimer.swift; sourceTree = ""; }; @@ -1910,6 +2158,19 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 51E4988F24A8061400B667CB /* RSWeb.framework in Frameworks */, + 51E4988924A8061400B667CB /* RSDatabase.framework in Frameworks */, + 51E4988D24A8061400B667CB /* RSTree.framework in Frameworks */, + 51E4987F24A8061400B667CB /* Account.framework in Frameworks */, + 51E4988124A8061400B667CB /* Articles.framework in Frameworks */, + 51E4988524A8061400B667CB /* OAuthSwift.framework in Frameworks */, + 51E4989324A8061400B667CB /* SyncDatabase.framework in Frameworks */, + 51E4988724A8061400B667CB /* RSCore.framework in Frameworks */, + 51E4988B24A8061400B667CB /* RSParser.framework in Frameworks */, + 51E4989724A8065700B667CB /* CloudKit.framework in Frameworks */, + 51E4989124A8061400B667CB /* Secrets.framework in Frameworks */, + 51E4989924A8067000B667CB /* WebKit.framework in Frameworks */, + 51E4988324A8061400B667CB /* ArticlesDatabase.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1917,6 +2178,20 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 51E498AA24A8069300B667CB /* RSWeb.framework in Frameworks */, + 51E498A424A8069300B667CB /* RSDatabase.framework in Frameworks */, + 51E498A824A8069300B667CB /* RSTree.framework in Frameworks */, + 51E4997624A87FFC00B667CB /* Sparkle.framework in Frameworks */, + 51E4989A24A8069300B667CB /* Account.framework in Frameworks */, + 51E4989C24A8069300B667CB /* Articles.framework in Frameworks */, + 51E498A024A8069300B667CB /* OAuthSwift.framework in Frameworks */, + 51E498AE24A8069300B667CB /* SyncDatabase.framework in Frameworks */, + 51E498A224A8069300B667CB /* RSCore.framework in Frameworks */, + 51E498A624A8069300B667CB /* RSParser.framework in Frameworks */, + 51E498B124A806A400B667CB /* CloudKit.framework in Frameworks */, + 51E498AC24A8069300B667CB /* Secrets.framework in Frameworks */, + 51E498B324A806AA00B667CB /* WebKit.framework in Frameworks */, + 51E4989E24A8069300B667CB /* ArticlesDatabase.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2269,6 +2544,7 @@ 51C0513F24A77DF800194D5E /* Info.plist */, 51C051CE24A7A72100194D5E /* iOS.entitlements */, 51C051CF24A7A72100194D5E /* iOS-dev.entitlements */, + 51E4993B24A8709900B667CB /* AppDelegate.swift */, ); path = iOS; sourceTree = ""; @@ -2279,6 +2555,7 @@ 51C0514624A77DF800194D5E /* Info.plist */, 51C0514724A77DF800194D5E /* macOS.entitlements */, 51C051CD24A7A6DB00194D5E /* macOS-dev.entitlements */, + 51E4993924A8708800B667CB /* AppDelegate.swift */, ); path = macOS; sourceTree = ""; @@ -2286,8 +2563,11 @@ 51C0519524A77E8B00194D5E /* Shared */ = { isa = PBXGroup; children = ( - 51C0513624A77DF700194D5E /* NetNewsWire_MultiplatformApp.swift */, + 51C0513624A77DF700194D5E /* NetNewsWire.swift */, 51C0513724A77DF700194D5E /* ContentView.swift */, + 51E4992524A80AAB00B667CB /* AppAssets.swift */, + 51E4992824A866F000B667CB /* AppDefaults.swift */, + 51E4995824A873F900B667CB /* ErrorHandler.swift */, 51C0513824A77DF800194D5E /* Assets.xcassets */, ); path = Shared; @@ -2451,8 +2731,11 @@ 51C452B22265141B00C03939 /* Frameworks */ = { isa = PBXGroup; children = ( + 51E4989824A8067000B667CB /* WebKit.framework */, + 51E498B224A806AA00B667CB /* WebKit.framework */, 51E4DB072425F9EB0091EB5B /* CloudKit.framework */, 51E4DAEC2425F6940091EB5B /* CloudKit.framework */, + 51E4989624A8065700B667CB /* CloudKit.framework */, 51C452B32265141B00C03939 /* WebKit.framework */, ); name = Frameworks; @@ -3276,6 +3559,7 @@ 51C0513924A77DF800194D5E /* Sources */, 51C0513A24A77DF800194D5E /* Frameworks */, 51C0513B24A77DF800194D5E /* Resources */, + 51E4989524A8061400B667CB /* Embed Frameworks */, ); buildRules = ( ); @@ -3293,6 +3577,8 @@ 51C0514024A77DF800194D5E /* Sources */, 51C0514124A77DF800194D5E /* Frameworks */, 51C0514224A77DF800194D5E /* Resources */, + 51E498B024A8069300B667CB /* Embed Frameworks */, + 51E4994924A872AD00B667CB /* Embed XPC Services */, ); buildRules = ( ); @@ -3944,7 +4230,12 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 51E4995F24A875F300B667CB /* shared.css in Resources */, + 51E4997324A8784300B667CB /* DefaultFeeds.opml in Resources */, 51C0516224A77DF800194D5E /* Assets.xcassets in Resources */, + 51E4996024A875F300B667CB /* template.html in Resources */, + 51E4995E24A875F300B667CB /* newsfoot.js in Resources */, + 51E4995D24A875F300B667CB /* main.js in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3952,7 +4243,12 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 51E4996424A875F400B667CB /* shared.css in Resources */, + 51E4997524A8784400B667CB /* DefaultFeeds.opml in Resources */, 51C0516324A77DF800194D5E /* Assets.xcassets in Resources */, + 51E4996524A875F400B667CB /* template.html in Resources */, + 51E4996324A875F400B667CB /* newsfoot.js in Resources */, + 51E4996224A875F400B667CB /* main.js in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4273,8 +4569,65 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 51E4995924A873F900B667CB /* ErrorHandler.swift in Sources */, + 51E4992F24A8676400B667CB /* ArticleArray.swift in Sources */, + 51E4994424A8713C00B667CB /* RefreshInterval.swift in Sources */, + 51E498F824A8085D00B667CB /* UnreadFeed.swift in Sources */, + 51E4996A24A8762D00B667CB /* ExtractedArticle.swift in Sources */, + 51E498F124A8085D00B667CB /* StarredFeedDelegate.swift in Sources */, + 51E498FF24A808BB00B667CB /* SingleFaviconDownloader.swift in Sources */, + 51E4997224A8784300B667CB /* DefaultFeedsImporter.swift in Sources */, + 51E4990D24A808C500B667CB /* RSHTMLMetadata+Extension.swift in Sources */, + 51E4995C24A875F300B667CB /* ArticleRenderer.swift in Sources */, + 51E4992324A8095700B667CB /* URL-Extensions.swift in Sources */, + 51E4993624A867E800B667CB /* UserInfoKey.swift in Sources */, + 51E4990924A808C500B667CB /* WebFeedIconDownloader.swift in Sources */, + 51E498F524A8085D00B667CB /* TodayFeedDelegate.swift in Sources */, + 51E4990B24A808C500B667CB /* ImageDownloader.swift in Sources */, + 51E498F424A8085D00B667CB /* SmartFeedDelegate.swift in Sources */, + 51E4993024A8676400B667CB /* ArticleSorter.swift in Sources */, + 51E4990A24A808C500B667CB /* FeaturedImageDownloader.swift in Sources */, + 51E4993824A8680E00B667CB /* Reachability.swift in Sources */, + 51E4993224A8676400B667CB /* FetchRequestQueue.swift in Sources */, + 51E4991724A8090400B667CB /* ArticleUtilities.swift in Sources */, + 51E4991B24A8091000B667CB /* IconImage.swift in Sources */, + 51E4995424A8734D00B667CB /* ExtensionPointIdentifer.swift in Sources */, 51C0516024A77DF800194D5E /* ContentView.swift in Sources */, - 51C0515E24A77DF800194D5E /* NetNewsWire_MultiplatformApp.swift in Sources */, + 51E4996924A8760C00B667CB /* ArticleStylesManager.swift in Sources */, + 51E498F324A8085D00B667CB /* PseudoFeed.swift in Sources */, + 51E4996B24A8762D00B667CB /* ArticleExtractor.swift in Sources */, + 51E4990124A808BB00B667CB /* FaviconURLFinder.swift in Sources */, + 51E4991D24A8092100B667CB /* NSAttributedString+NetNewsWire.swift in Sources */, + 51E4995324A8734D00B667CB /* RedditFeedProvider-Extensions.swift in Sources */, + 51E4994224A8713C00B667CB /* ArticleStatusSyncTimer.swift in Sources */, + 51E498F624A8085D00B667CB /* SearchFeedDelegate.swift in Sources */, + 51E498F224A8085D00B667CB /* SmartFeedsController.swift in Sources */, + 51E4997024A8764C00B667CB /* ActivityManager.swift in Sources */, + 51E4990F24A808CC00B667CB /* HTMLMetadataDownloader.swift in Sources */, + 51E4993124A8676400B667CB /* FetchRequestOperation.swift in Sources */, + 51E4992624A80AAB00B667CB /* AppAssets.swift in Sources */, + 51E4995624A8734D00B667CB /* TwitterFeedProvider-Extensions.swift in Sources */, + 51E4992924A866F000B667CB /* AppDefaults.swift in Sources */, + 51E4996824A8760C00B667CB /* ArticleStyle.swift in Sources */, + 51E4990024A808BB00B667CB /* FaviconGenerator.swift in Sources */, + 51E4997124A8764C00B667CB /* ActivityType.swift in Sources */, + 51E4991E24A8094300B667CB /* RSImage-AppIcons.swift in Sources */, + 51E4991324A808FB00B667CB /* AddWebFeedDefaultContainer.swift in Sources */, + 51E4993C24A8709900B667CB /* AppDelegate.swift in Sources */, + 51E498F924A8085D00B667CB /* SmartFeed.swift in Sources */, + 51E4995124A8734D00B667CB /* ExtensionPointManager.swift in Sources */, + 51E4990C24A808C500B667CB /* AuthorAvatarDownloader.swift in Sources */, + 51E4992124A8095000B667CB /* RSImage-Extensions.swift in Sources */, + 51E4990324A808BB00B667CB /* FaviconDownloader.swift in Sources */, + 51E4990224A808BB00B667CB /* ColorHash.swift in Sources */, + 51E4991924A8090A00B667CB /* CacheCleaner.swift in Sources */, + 51E498F724A8085D00B667CB /* SearchTimelineFeedDelegate.swift in Sources */, + 51E4993524A867E800B667CB /* AppNotifications.swift in Sources */, + 51C0515E24A77DF800194D5E /* NetNewsWire.swift in Sources */, + 51E4993D24A870F800B667CB /* UserNotificationManager.swift in Sources */, + 51E4991524A808FF00B667CB /* ArticleStringFormatter.swift in Sources */, + 51E4995724A8734D00B667CB /* ExtensionPoint.swift in Sources */, + 51E4991124A808DE00B667CB /* SmallIconProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4282,8 +4635,70 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 51E4993A24A8708800B667CB /* AppDelegate.swift in Sources */, + 51E498CE24A8085D00B667CB /* UnreadFeed.swift in Sources */, + 51E498C724A8085D00B667CB /* StarredFeedDelegate.swift in Sources */, + 51E498FA24A808BA00B667CB /* SingleFaviconDownloader.swift in Sources */, + 51E4993F24A8713B00B667CB /* ArticleStatusSyncTimer.swift in Sources */, + 51E4993724A8680E00B667CB /* Reachability.swift in Sources */, + 51E4994B24A8734C00B667CB /* SendToMicroBlogCommand.swift in Sources */, + 51E4996F24A8764C00B667CB /* ActivityType.swift in Sources */, + 51E4994E24A8734C00B667CB /* SendToMarsEditCommand.swift in Sources */, + 51E4996624A8760B00B667CB /* ArticleStyle.swift in Sources */, + 51E4996C24A8762D00B667CB /* ExtractedArticle.swift in Sources */, + 51E4990824A808C300B667CB /* RSHTMLMetadata+Extension.swift in Sources */, + 51E4992B24A8676300B667CB /* ArticleArray.swift in Sources */, + 51E4994D24A8734C00B667CB /* ExtensionPointIdentifer.swift in Sources */, + 51E4992224A8095600B667CB /* URL-Extensions.swift in Sources */, + 51E4990424A808C300B667CB /* WebFeedIconDownloader.swift in Sources */, + 51E498CB24A8085D00B667CB /* TodayFeedDelegate.swift in Sources */, + 51E4993324A867E700B667CB /* AppNotifications.swift in Sources */, + 51E4990624A808C300B667CB /* ImageDownloader.swift in Sources */, + 51E4994F24A8734C00B667CB /* TwitterFeedProvider-Extensions.swift in Sources */, + 51E498CA24A8085D00B667CB /* SmartFeedDelegate.swift in Sources */, + 51E4990524A808C300B667CB /* FeaturedImageDownloader.swift in Sources */, + 51E4991624A8090300B667CB /* ArticleUtilities.swift in Sources */, + 51E4991A24A8090F00B667CB /* IconImage.swift in Sources */, + 51E4992724A80AAB00B667CB /* AppAssets.swift in Sources */, + 51E4995B24A875D500B667CB /* ArticlePasteboardWriter.swift in Sources */, + 51E4993424A867E700B667CB /* UserInfoKey.swift in Sources */, + 51E4994C24A8734C00B667CB /* RedditFeedProvider-Extensions.swift in Sources */, + 51E4994124A8713B00B667CB /* RefreshInterval.swift in Sources */, 51C0516124A77DF800194D5E /* ContentView.swift in Sources */, - 51C0515F24A77DF800194D5E /* NetNewsWire_MultiplatformApp.swift in Sources */, + 51E498C924A8085D00B667CB /* PseudoFeed.swift in Sources */, + 51E498FC24A808BA00B667CB /* FaviconURLFinder.swift in Sources */, + 51E4991C24A8092000B667CB /* NSAttributedString+NetNewsWire.swift in Sources */, + 51E4994A24A8734C00B667CB /* ExtensionPointManager.swift in Sources */, + 51E4996D24A8762D00B667CB /* ArticleExtractor.swift in Sources */, + 51E4994024A8713B00B667CB /* AccountRefreshTimer.swift in Sources */, + 51E498CC24A8085D00B667CB /* SearchFeedDelegate.swift in Sources */, + 51E498C824A8085D00B667CB /* SmartFeedsController.swift in Sources */, + 51E4992C24A8676300B667CB /* ArticleSorter.swift in Sources */, + 51E4995024A8734C00B667CB /* ExtensionPoint.swift in Sources */, + 51E4990E24A808CC00B667CB /* HTMLMetadataDownloader.swift in Sources */, + 51E498FB24A808BA00B667CB /* FaviconGenerator.swift in Sources */, + 51E4996724A8760B00B667CB /* ArticleStylesManager.swift in Sources */, + 51E4996E24A8764C00B667CB /* ActivityManager.swift in Sources */, + 51E4995A24A873F900B667CB /* ErrorHandler.swift in Sources */, + 51E4991F24A8094300B667CB /* RSImage-AppIcons.swift in Sources */, + 51E4991224A808FB00B667CB /* AddWebFeedDefaultContainer.swift in Sources */, + 51E4993E24A870F900B667CB /* UserNotificationManager.swift in Sources */, + 51E4992E24A8676300B667CB /* FetchRequestQueue.swift in Sources */, + 51E498CF24A8085D00B667CB /* SmartFeed.swift in Sources */, + 51E4990724A808C300B667CB /* AuthorAvatarDownloader.swift in Sources */, + 51E4997424A8784400B667CB /* DefaultFeedsImporter.swift in Sources */, + 51E4992024A8095000B667CB /* RSImage-Extensions.swift in Sources */, + 51E498FE24A808BA00B667CB /* FaviconDownloader.swift in Sources */, + 51E498FD24A808BA00B667CB /* ColorHash.swift in Sources */, + 51E4992A24A866F000B667CB /* AppDefaults.swift in Sources */, + 51E4991824A8090A00B667CB /* CacheCleaner.swift in Sources */, + 51E498CD24A8085D00B667CB /* SearchTimelineFeedDelegate.swift in Sources */, + 51E4996124A875F400B667CB /* ArticleRenderer.swift in Sources */, + 51C0515F24A77DF800194D5E /* NetNewsWire.swift in Sources */, + 51E4992D24A8676300B667CB /* FetchRequestOperation.swift in Sources */, + 51E4992424A8098400B667CB /* SmartFeedPasteboardWriter.swift in Sources */, + 51E4991424A808FF00B667CB /* ArticleStringFormatter.swift in Sources */, + 51E4991024A808DE00B667CB /* SmallIconProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Shared/Favicons/SingleFaviconDownloader.swift b/Shared/Favicons/SingleFaviconDownloader.swift index 9ef2b61df..1b82802f6 100644 --- a/Shared/Favicons/SingleFaviconDownloader.swift +++ b/Shared/Favicons/SingleFaviconDownloader.swift @@ -7,6 +7,7 @@ // import Foundation +import os.log import RSCore import RSWeb @@ -28,6 +29,8 @@ final class SingleFaviconDownloader { var iconImage: IconImage? let homePageURL: String? + private var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "SingleFaviconDownloader") + private var lastDownloadAttemptDate: Date private var diskStatus = DiskStatus.unknown private var diskCache: BinaryDiskCache @@ -145,7 +148,7 @@ private extension SingleFaviconDownloader { } if let error = error { - appDelegate.logMessage("Error downloading favicon at \(url): \(error)", type: .warning) + os_log(.info, log: self.log, "Error downloading image at %@: %@.", url.absoluteString, error.localizedDescription) } completion(nil) diff --git a/Shared/Images/ImageDownloader.swift b/Shared/Images/ImageDownloader.swift index 7ea33c0ac..9a549d3ef 100644 --- a/Shared/Images/ImageDownloader.swift +++ b/Shared/Images/ImageDownloader.swift @@ -7,6 +7,7 @@ // import Foundation +import os.log import RSCore import RSWeb @@ -17,6 +18,8 @@ extension Notification.Name { final class ImageDownloader { + private var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "ImageDownloader") + private let folder: String private var diskCache: BinaryDiskCache private let queue: DispatchQueue @@ -112,7 +115,7 @@ private extension ImageDownloader { self.badURLs.insert(url) } if let error = error { - appDelegate.logMessage("Error downloading image at \(url): \(error)", type: .warning) + os_log(.info, log: self.log, "Error downloading image at %@: %@.", url, error.localizedDescription) } completion(nil) diff --git a/Shared/Importers/DefaultFeedsImporter.swift b/Shared/Importers/DefaultFeedsImporter.swift index b86d39e36..8ed67d3b9 100644 --- a/Shared/Importers/DefaultFeedsImporter.swift +++ b/Shared/Importers/DefaultFeedsImporter.swift @@ -13,9 +13,9 @@ import RSCore struct DefaultFeedsImporter { static func importDefaultFeeds(account: Account) { - appDelegate.logDebugMessage("Importing default feeds.") let defaultFeedsURL = Bundle.main.url(forResource: "DefaultFeeds", withExtension: "opml")! AccountManager.shared.defaultAccount.importOPML(defaultFeedsURL) { result in } } + } diff --git a/Shared/SmartFeeds/PseudoFeed.swift b/Shared/SmartFeeds/PseudoFeed.swift index 5c0dc0660..2fd0d9d6c 100644 --- a/Shared/SmartFeeds/PseudoFeed.swift +++ b/Shared/SmartFeeds/PseudoFeed.swift @@ -17,16 +17,6 @@ protocol PseudoFeed: class, Feed, SmallIconProvider, PasteboardWriterOwner { } -private var smartFeedIcon: RSImage = { - return RSImage(named: NSImage.smartBadgeTemplateName)! -}() - -extension PseudoFeed { - - var smallIcon: RSImage? { - return smartFeedIcon - } -} #else import UIKit @@ -38,14 +28,10 @@ protocol PseudoFeed: class, Feed, SmallIconProvider { } -private var smartFeedIcon: UIImage = { - return AppAssets.smartFeedImage -}() +#endif extension PseudoFeed { - var smallIcon: UIImage? { - return smartFeedIcon + var smallIcon: RSImage? { + return AppAssets.smartFeedImage } } - -#endif