forked from shadowfacts/Tusker
199 lines
9.8 KiB
Swift
199 lines
9.8 KiB
Swift
//
|
|
// 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
|
|
}
|
|
|
|
private static func present(_ vc: UIViewController, animated: Bool = true) {
|
|
getMainTabBarController().present(vc, animated: animated)
|
|
}
|
|
|
|
// MARK: - New Post
|
|
static func newPostActivity(mentioning: Account? = nil) -> NSUserActivity {
|
|
// todo: update to use managed objects
|
|
let activity = NSUserActivity(type: .newPost)
|
|
activity.isEligibleForPrediction = true
|
|
if let mentioning = mentioning {
|
|
activity.userInfo = ["mentioning": mentioning.acct]
|
|
activity.title = "Send a message to \(mentioning.displayName)"
|
|
activity.suggestedInvocationPhrase = "Send a message to \(mentioning.displayName)"
|
|
} 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)
|
|
}
|
|
}
|
|
|
|
}
|