diff --git a/Shared/Activity/ActivityID.swift b/Shared/Activity/ActivityID.swift index e6afa8d9c..88b75e4a7 100644 --- a/Shared/Activity/ActivityID.swift +++ b/Shared/Activity/ActivityID.swift @@ -13,4 +13,5 @@ enum ActivityID: String { case accountName = "accountName" case feedID = "feedID" case articleID = "articleID" + case folderName = "folderName" } diff --git a/Shared/Activity/ActivityManager.swift b/Shared/Activity/ActivityManager.swift index 465eab933..2c4bd27c6 100644 --- a/Shared/Activity/ActivityManager.swift +++ b/Shared/Activity/ActivityManager.swift @@ -42,14 +42,27 @@ class ActivityManager { let localizedText = NSLocalizedString("See articles in “%@”", comment: "See articles in Folder") let title = NSString.localizedStringWithFormat(localizedText as NSString, folder.nameForDisplay) as String selectingActivity = makeSelectingActivity(type: ActivityType.selectFolder, title: title, identifier: "folder.\(folder.nameForDisplay)") - selectingActivity!.becomeCurrent() + + selectingActivity!.userInfo = [ + ActivityID.accountID.rawValue: folder.account?.accountID ?? "", + ActivityID.accountName.rawValue: folder.account?.name ?? "", + ActivityID.folderName.rawValue: folder.nameForDisplay + ] + selectingActivity!.becomeCurrent() } func selectingFeed(_ feed: Feed) { let localizedText = NSLocalizedString("See articles in “%@”", comment: "See articles in Feed") let title = NSString.localizedStringWithFormat(localizedText as NSString, feed.nameForDisplay) as String selectingActivity = makeSelectingActivity(type: ActivityType.selectFeed, title: title, identifier: feed.url) + + selectingActivity!.userInfo = [ + ActivityID.accountID.rawValue: feed.account?.accountID ?? "", + ActivityID.accountName.rawValue: feed.account?.name ?? "", + ActivityID.feedID.rawValue: feed.feedID + ] + selectingActivity!.becomeCurrent() } diff --git a/iOS/AppCoordinator.swift b/iOS/AppCoordinator.swift index ff64dabff..7df057dad 100644 --- a/iOS/AppCoordinator.swift +++ b/iOS/AppCoordinator.swift @@ -254,9 +254,9 @@ class AppCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { case .selectStarred: handleSelectStarred() case .selectFolder: - print("folder selected") + handleSelectFolder(activity) case .selectFeed: - print("feed selected") + handleSelectFeed(activity) case .readArticle: handleReadArticle(activity) } @@ -1224,12 +1224,30 @@ private extension AppCoordinator { } } + func handleSelectFolder(_ activity: NSUserActivity) { + guard let accountNode = findAccountNode(for: activity), let folderNode = findFolderNode(for: activity, beginningAt: accountNode) else { + return + } + if let indexPath = indexPathFor(folderNode) { + selectFeed(indexPath) + } + } + + func handleSelectFeed(_ activity: NSUserActivity) { + guard let accountNode = findAccountNode(for: activity), let feedNode = findFeedNode(for: activity, beginningAt: accountNode) else { + return + } + if let feed = feedNode.representedObject as? Feed { + discloseFeed(feed) + } + } + func handleReadArticle(_ activity: NSUserActivity) { guard let accountNode = findAccountNode(for: activity), let feedNode = findFeedNode(for: activity, beginningAt: accountNode) else { return } - masterFeedViewController.discloseFeed(feedNode.representedObject as! Feed) + discloseFeed(feedNode.representedObject as! Feed) guard let articleID = activity.userInfo?[ActivityID.articleID.rawValue] as? String else { return } @@ -1261,6 +1279,16 @@ private extension AppCoordinator { return nil } + func findFolderNode(for activity: NSUserActivity, beginningAt startingNode: Node) -> Node? { + guard let folderName = activity.userInfo?[ActivityID.folderName.rawValue] as? String else { + return nil + } + if let node = startingNode.descendantNode(where: { ($0.representedObject as? Folder)?.nameForDisplay == folderName }) { + return node + } + return nil + } + func findFeedNode(for activity: NSUserActivity, beginningAt startingNode: Node) -> Node? { guard let feedID = activity.userInfo?[ActivityID.feedID.rawValue] as? String else { return nil