diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 9a1bf5d28..2d749fd57 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -16,6 +16,7 @@ import Articles import RSParser import ArticlesDatabase import RSWeb +import os.log public extension Notification.Name { static let AccountRefreshDidBegin = Notification.Name(rawValue: "AccountRefreshDidBegin") @@ -62,6 +63,8 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, return defaultName }() + var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "account") + public var isDeleted = false public var account: Account? { @@ -917,11 +920,7 @@ private extension Account { do { opmlDocument = try RSOPMLParser.parseOPML(with: parserData) } catch { - #if os(macOS) - NSApplication.shared.presentError(error) - #else - UIApplication.shared.presentError(error) - #endif + os_log(.error, log: log, "OPML Import failed: %@.", error.localizedDescription) return } guard let parsedOPML = opmlDocument, let children = parsedOPML.children else { @@ -944,11 +943,7 @@ private extension Account { try opmlDocumentString.write(to: url, atomically: true, encoding: .utf8) } catch let error as NSError { - #if os(macOS) - NSApplication.shared.presentError(error) - #else - UIApplication.shared.presentError(error) - #endif + os_log(.error, log: log, "Save to disk failed: %@.", error.localizedDescription) } } diff --git a/Mac/MainWindow/Sidebar/SidebarViewController.swift b/Mac/MainWindow/Sidebar/SidebarViewController.swift index c206be8aa..b3a0c3dca 100644 --- a/Mac/MainWindow/Sidebar/SidebarViewController.swift +++ b/Mac/MainWindow/Sidebar/SidebarViewController.swift @@ -330,7 +330,7 @@ protocol SidebarDelegate: class { let nodesToDelete = treeController.normalizedSelectedNodes(nodes) - guard let undoManager = undoManager, let deleteCommand = DeleteCommand(nodesToDelete: nodesToDelete, treeController: treeController, undoManager: undoManager) else { + guard let undoManager = undoManager, let deleteCommand = DeleteCommand(nodesToDelete: nodesToDelete, treeController: treeController, undoManager: undoManager, errorHandler: ErrorHandler.present) else { return } diff --git a/Shared/Commands/DeleteCommand.swift b/Shared/Commands/DeleteCommand.swift index cb7f6f3cc..8ea6584bd 100644 --- a/Shared/Commands/DeleteCommand.swift +++ b/Shared/Commands/DeleteCommand.swift @@ -20,10 +20,11 @@ final class DeleteCommand: UndoableCommand { var redoActionName: String { return undoActionName } + let errorHandler: (Error) -> () private let itemSpecifiers: [SidebarItemSpecifier] - init?(nodesToDelete: [Node], treeController: TreeController, undoManager: UndoManager) { + init?(nodesToDelete: [Node], treeController: TreeController, undoManager: UndoManager, errorHandler: @escaping (Error) -> ()) { guard DeleteCommand.canDelete(nodesToDelete) else { return nil @@ -35,8 +36,9 @@ final class DeleteCommand: UndoableCommand { self.treeController = treeController self.undoActionName = actionName self.undoManager = undoManager + self.errorHandler = errorHandler - let itemSpecifiers = nodesToDelete.compactMap{ SidebarItemSpecifier(node: $0) } + let itemSpecifiers = nodesToDelete.compactMap{ SidebarItemSpecifier(node: $0, errorHandler: errorHandler) } guard !itemSpecifiers.isEmpty else { return nil } @@ -112,6 +114,7 @@ private struct SidebarItemSpecifier { private let folder: Folder? private let feed: Feed? private let path: ContainerPath + private let errorHandler: (Error) -> () private var container: Container? { if let parentFolder = parentFolder { @@ -123,7 +126,7 @@ private struct SidebarItemSpecifier { return nil } - init?(node: Node) { + init?(node: Node, errorHandler: @escaping (Error) -> ()) { var account: Account? @@ -148,6 +151,9 @@ private struct SidebarItemSpecifier { self.account = account! self.path = ContainerPath(account: account!, folders: node.containingFolders()) + + self.errorHandler = errorHandler + } func delete(completion: @escaping () -> Void) { @@ -213,11 +219,7 @@ private struct SidebarItemSpecifier { case .success: break case .failure(let error): - #if os(macOS) - NSApplication.shared.presentError(error) - #else - UIApplication.shared.presentError(error) - #endif + errorHandler(error) } } diff --git a/iOS/AppDelegate.swift b/iOS/AppDelegate.swift index 4e7325c99..e02bbe887 100644 --- a/iOS/AppDelegate.swift +++ b/iOS/AppDelegate.swift @@ -187,10 +187,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele // If we haven't refreshed the database for 15 minutes, run a refresh automatically if let lastRefresh = AppDefaults.lastRefresh { if Date() > lastRefresh.addingTimeInterval(15 * 60) { - AccountManager.shared.refreshAll(errorHandler: ErrorHandler.present) + AccountManager.shared.refreshAll(errorHandler: ErrorHandler.log) } } else { - AccountManager.shared.refreshAll(errorHandler: ErrorHandler.present) + AccountManager.shared.refreshAll(errorHandler: ErrorHandler.log) } } diff --git a/iOS/ErrorHandler.swift b/iOS/ErrorHandler.swift index 2bedf0a69..33c628cae 100644 --- a/iOS/ErrorHandler.swift +++ b/iOS/ErrorHandler.swift @@ -14,10 +14,12 @@ struct ErrorHandler { private static var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "Account") - public static func present(_ error: Error) { - UIApplication.shared.presentError(error) + public static func present(_ viewController: UIViewController) -> (Error) -> () { + return { [weak viewController] error in + viewController?.presentError(error) + } } - + public static func log(_ error: Error) { os_log(.error, log: self.log, "%@", error.localizedDescription) } diff --git a/iOS/MasterFeed/MasterFeedViewController.swift b/iOS/MasterFeed/MasterFeedViewController.swift index 6fd0c22af..2b79af139 100644 --- a/iOS/MasterFeed/MasterFeedViewController.swift +++ b/iOS/MasterFeed/MasterFeedViewController.swift @@ -526,7 +526,7 @@ class MasterFeedViewController: ProgressTableViewController, UndoableCommandRunn guard let undoManager = undoManager, let deleteNode = navState.nodeFor(indexPath), - let deleteCommand = DeleteCommand(nodesToDelete: [deleteNode], treeController: navState.treeController, undoManager: undoManager) + let deleteCommand = DeleteCommand(nodesToDelete: [deleteNode], treeController: navState.treeController, undoManager: undoManager, errorHandler: ErrorHandler.present(self)) else { return } @@ -625,7 +625,7 @@ extension MasterFeedViewController: MasterFeedTableViewCellDelegate { private extension MasterFeedViewController { @objc private func refreshAccounts(_ sender: Any) { - AccountManager.shared.refreshAll(errorHandler: ErrorHandler.present) + AccountManager.shared.refreshAll(errorHandler: ErrorHandler.present(self)) refreshControl?.endRefreshing() } diff --git a/iOS/MasterTimeline/MasterTimelineViewController.swift b/iOS/MasterTimeline/MasterTimelineViewController.swift index caa31ba77..9ae9dc8dc 100644 --- a/iOS/MasterTimeline/MasterTimelineViewController.swift +++ b/iOS/MasterTimeline/MasterTimelineViewController.swift @@ -367,7 +367,7 @@ class MasterTimelineViewController: ProgressTableViewController, UndoableCommand private extension MasterTimelineViewController { @objc private func refreshAccounts(_ sender: Any) { - AccountManager.shared.refreshAll(errorHandler: ErrorHandler.present) + AccountManager.shared.refreshAll(errorHandler: ErrorHandler.present(self)) refreshControl?.endRefreshing() } diff --git a/iOS/Settings/UIKit/FeedbinAccountViewController.swift b/iOS/Settings/UIKit/FeedbinAccountViewController.swift index 10ca43c82..83f708da9 100644 --- a/iOS/Settings/UIKit/FeedbinAccountViewController.swift +++ b/iOS/Settings/UIKit/FeedbinAccountViewController.swift @@ -87,7 +87,7 @@ class FeedbinAccountViewController: UIViewController { case .success: break case .failure(let error): - UIApplication.shared.presentError(error) + self.presentError(error) } } } diff --git a/submodules/RSCore b/submodules/RSCore index 111690033..23e307542 160000 --- a/submodules/RSCore +++ b/submodules/RSCore @@ -1 +1 @@ -Subproject commit 111690033354afc1cf57e37a326c344a0fe93b77 +Subproject commit 23e307542e5c65b3fbe4c3a022a97570c176a900