// // UserActivityManager.swift // Tusker // // Created by Shadowfacts on 10/19/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import UIKit import Pachyderm class UserActivityManager { // MARK: - Utils private static let encoder = PropertyListEncoder() private static let decoder = PropertyListDecoder() private static var mastodonController: MastodonController { let scene = UIApplication.shared.activeOrBackgroundScene! return scene.session.mastodonController! } private static func getMainTabBarController() -> MainTabBarViewController { let scene = UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.first! let window = scene.windows.first { $0.isKeyWindow }! return window.rootViewController as! MainTabBarViewController // return (UIApplication.shared.delegate! as! AppDelegate).window!.rootViewController as! MainTabBarViewController } private static func present(_ vc: UIViewController, animated: Bool = true) { getMainTabBarController().present(vc, animated: animated) } // MARK: - New Post static func newPostActivity(mentioning: Account? = nil) -> NSUserActivity { let activity = NSUserActivity(type: .newPost) activity.isEligibleForPrediction = true if let mentioning = mentioning { activity.userInfo = ["mentioning": mentioning.acct] activity.title = "Send a message to \(mentioning.realDisplayName)" activity.suggestedInvocationPhrase = "Send a message to \(mentioning.realDisplayName)" } else { activity.userInfo = [:] activity.title = "New Post" activity.suggestedInvocationPhrase = "Post in Tusker" } return activity } static func handleNewPost(activity: NSUserActivity) { // TODO: check not currently showing compose screen let mentioning = activity.userInfo?["mentioning"] as? String let composeVC = ComposeViewController(mentioningAcct: mentioning, mastodonController: mastodonController) present(UINavigationController(rootViewController: composeVC)) } // MARK: - Check Notifications static func checkNotificationsActivity() -> NSUserActivity { let activity = NSUserActivity(type: .checkNotifications) activity.isEligibleForPrediction = true activity.title = NSLocalizedString("Check Notifications", comment: "check notifications shortcut title") activity.suggestedInvocationPhrase = NSLocalizedString("Check my Tusker notifications", comment: "check notifications shortcut invocation phrase") return activity } static func handleCheckNotifications(activity: NSUserActivity) { let tabBarController = getMainTabBarController() tabBarController.select(tab: .notifications) if let navigationController = tabBarController.getTabController(tab: .notifications) as? UINavigationController, let notificationsPageController = navigationController.viewControllers.first as? NotificationsPageViewController { navigationController.popToRootViewController(animated: false) notificationsPageController.loadViewIfNeeded() notificationsPageController.selectMode(.allNotifications) } } // MARK: - Check Mentions static func checkMentionsActivity() -> NSUserActivity { let activity = NSUserActivity(type: .checkMentions) activity.isEligibleForPrediction = true activity.title = NSLocalizedString("Check Mentions", comment: "check mentions shortcut title") activity.suggestedInvocationPhrase = NSLocalizedString("Check my mentions", comment: "check mentions shortcut invocation phrase") return activity } static func handleCheckMentions(activity: NSUserActivity) { let tabBarController = getMainTabBarController() tabBarController.select(tab: .notifications) if let navController = tabBarController.getTabController(tab: .notifications) as? UINavigationController, let notificationsPageController = navController.viewControllers.first as? NotificationsPageViewController { navController.popToRootViewController(animated: false) notificationsPageController.loadViewIfNeeded() notificationsPageController.selectMode(.mentionsOnly) } } // MARK: - Show Timeline static func showTimelineActivity(timeline: Timeline) -> NSUserActivity? { guard let timelineData = try? encoder.encode(timeline) else { return nil } let activity = NSUserActivity(type: .showTimeline) activity.isEligibleForPrediction = true activity.userInfo = ["timelineData": timelineData] switch timeline { case .home: activity.title = NSLocalizedString("Show Home Timeline", comment: "home timeline shortcut title") activity.suggestedInvocationPhrase = NSLocalizedString("Show my home timeline", comment: "home timeline shortcut invocation phrase") case .public(local: true): activity.title = NSLocalizedString("Show Local Timeline", comment: "local timeline shortcut title") activity.suggestedInvocationPhrase = NSLocalizedString("Show my local timeline", comment: "local timeline shortcut invocation phrase") case .public(local: false): activity.title = NSLocalizedString("Show Federated Timeline", comment: "federated timeline shortcut title") activity.suggestedInvocationPhrase = NSLocalizedString("Show my federated timeline", comment: "federated timeline invocation phrase") case let .tag(hashtag): activity.title = String(format: NSLocalizedString("Show #%@", comment: "show hashtag shortcut title"), hashtag) activity.suggestedInvocationPhrase = String(format: NSLocalizedString("Show the %@ hashtag", comment: "hashtag shortcut invocation phrase"), hashtag) case .list: // todo: add title to list activity.title = NSLocalizedString("Show List", comment: "list timeline shortcut title") activity.suggestedInvocationPhrase = NSLocalizedString("Show my list", comment: "list timeline invocation phrase") case .direct: activity.title = NSLocalizedString("Show Direct Messages", comment: "direct message timeline shortcut title") activity.suggestedInvocationPhrase = NSLocalizedString("Show my direct messages", comment: "direct message timeline invocation phrase") } return activity } static func handleShowTimeline(activity: NSUserActivity) { guard let timelineData = activity.userInfo?["timelineData"] as? Data, let timeline = try? decoder.decode(Timeline.self, from: timelineData) else { return } let tabBarController = getMainTabBarController() tabBarController.select(tab: .timelines) let navigationController = tabBarController.viewControllers![0] as! UINavigationController switch timeline { case .home, .public(true), .public(false): navigationController.popToRootViewController(animated: false) let rootController = navigationController.viewControllers.first! as! SegmentedPageViewController let index: Int switch timeline { case .home: index = 0 case .public(false): index = 1 case .public(true): index = 2 default: fatalError() } rootController.segmentedControl.selectedSegmentIndex = index rootController.selectPage(at: index, animated: false) default: let timeline = TimelineTableViewController(for: timeline, mastodonController: mastodonController) navigationController.pushViewController(timeline, animated: false) } } // MARK: - Explore static func searchActivity() -> NSUserActivity { let activity = NSUserActivity(type: .search) activity.isEligibleForPrediction = true activity.title = NSLocalizedString("Search", comment: "search shortcut title") activity.suggestedInvocationPhrase = NSLocalizedString("Search the fediverse", comment: "search shortcut invocation phrase") return activity } static func handleSearch(activity: NSUserActivity) { let tabBarController = getMainTabBarController() tabBarController.select(tab: .explore) if let navigationController = tabBarController.getTabController(tab: .explore) as? UINavigationController, let exploreController = navigationController.viewControllers.first as? ExploreViewController { navigationController.popToRootViewController(animated: false) exploreController.searchController.isActive = true exploreController.searchController.searchBar.becomeFirstResponder() } } static func bookmarksActivity() -> NSUserActivity { let activity = NSUserActivity(type: .bookmarks) activity.isEligibleForPrediction = true activity.title = NSLocalizedString("View Bookmarks", comment: "bookmarks shortcut title") activity.suggestedInvocationPhrase = NSLocalizedString("Show my bookmarks in Tusker", comment: "bookmarks shortcut invocation phrase") return activity } static func handleBookmarks(activity: NSUserActivity) { let tabBarController = getMainTabBarController() tabBarController.select(tab: .explore) if let navigationController = tabBarController.getTabController(tab: .explore) as? UINavigationController { navigationController.popToRootViewController(animated: false) navigationController.pushViewController(BookmarksTableViewController(mastodonController: mastodonController), animated: false) } } }