diff --git a/Tusker/AppDelegate.swift b/Tusker/AppDelegate.swift
index a3ec3194..04691144 100644
--- a/Tusker/AppDelegate.swift
+++ b/Tusker/AppDelegate.swift
@@ -65,6 +65,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
}
switch type {
+ case .mainScene:
+ return "main-scene"
+
case .showConversation,
.showTimeline,
.checkNotifications,
diff --git a/Tusker/Info.plist b/Tusker/Info.plist
index 5e034cbb..f7780369 100644
--- a/Tusker/Info.plist
+++ b/Tusker/Info.plist
@@ -69,6 +69,7 @@
$(PRODUCT_BUNDLE_IDENTIFIER).activity.bookmarks
$(PRODUCT_BUNDLE_IDENTIFIER).activity.my-profile
$(PRODUCT_BUNDLE_IDENTIFIER).activity.show-profile
+ $(PRODUCT_BUNDLE_IDENTIFIER).activity.main-scene
UIApplicationSceneManifest
diff --git a/Tusker/MainSceneDelegate.swift b/Tusker/MainSceneDelegate.swift
index 4e515783..30b7a3d1 100644
--- a/Tusker/MainSceneDelegate.swift
+++ b/Tusker/MainSceneDelegate.swift
@@ -15,12 +15,15 @@ class MainSceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
+ private var launchActivity: NSUserActivity?
+
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
- // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
- // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
- // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let windowScene = scene as? UIWindowScene else { return }
+ if let activity = connectionOptions.userActivities.first ?? session.stateRestorationActivity {
+ launchActivity = activity
+ }
+
window = UIWindow(windowScene: windowScene)
if let report = AppDelegate.pendingCrashReport {
@@ -91,6 +94,14 @@ class MainSceneDelegate: UIResponder, UIWindowSceneDelegate {
DraftsManager.save()
}
+ func stateRestorationActivity(for scene: UIScene) -> NSUserActivity? {
+ if let mastodonController = window?.windowScene?.session.mastodonController {
+ return UserActivityManager.mainSceneActivity(accountID: mastodonController.accountInfo!.id)
+ } else {
+ return nil
+ }
+ }
+
func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
@@ -123,7 +134,14 @@ class MainSceneDelegate: UIResponder, UIWindowSceneDelegate {
func showAppOrOnboardingUI(session: UISceneSession? = nil) {
let session = session ?? window!.windowScene!.session
if LocalData.shared.onboardingComplete {
- let account = LocalData.shared.getMostRecentAccount()!
+ let account: LocalData.UserAccountInfo
+ if let activity = launchActivity,
+ let activityAccount = UserActivityManager.getAccount(from: activity) {
+ account = activityAccount
+ } else {
+ account = LocalData.shared.getMostRecentAccount()!
+ }
+
if session.mastodonController == nil {
session.mastodonController = MastodonController.getForAccount(account)
}
diff --git a/Tusker/Shortcuts/UserActivityManager.swift b/Tusker/Shortcuts/UserActivityManager.swift
index 37795a49..6db9c8e9 100644
--- a/Tusker/Shortcuts/UserActivityManager.swift
+++ b/Tusker/Shortcuts/UserActivityManager.swift
@@ -37,6 +37,15 @@ class UserActivityManager {
}
return LocalData.shared.getAccount(id: id)
}
+
+ // MARK: - Main Scene
+ static func mainSceneActivity(accountID: String) -> NSUserActivity {
+ let activity = NSUserActivity(type: .mainScene)
+ activity.userInfo = [
+ "accountID": accountID,
+ ]
+ return activity
+ }
// MARK: - New Post
static func newPostActivity(mentioning: Account? = nil, accountID: String) -> NSUserActivity {
diff --git a/Tusker/Shortcuts/UserActivityType.swift b/Tusker/Shortcuts/UserActivityType.swift
index 77c9323d..d15e8e54 100644
--- a/Tusker/Shortcuts/UserActivityType.swift
+++ b/Tusker/Shortcuts/UserActivityType.swift
@@ -9,6 +9,7 @@
import Foundation
enum UserActivityType: String {
+ case mainScene = "space.vaccor.Tusker.activity.main-scene"
case newPost = "space.vaccor.Tusker.activity.new-post"
case checkNotifications = "space.vaccor.Tusker.activity.check-notifications"
case showTimeline = "space.vaccor.Tusker.activity.show-timeline"
@@ -22,6 +23,8 @@ enum UserActivityType: String {
extension UserActivityType {
var handle: (NSUserActivity) -> Void {
switch self {
+ case .mainScene:
+ fatalError("cannot handle main scene activity")
case .newPost:
return UserActivityManager.handleNewPost
case .checkNotifications: