瀏覽代碼

reset view controllers and DcContext on delete account

cyberta 4 年之前
父節點
當前提交
96334ecd4b

+ 13 - 1
deltachat-ios/AppDelegate.swift

@@ -58,6 +58,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
         dcAccounts.openDatabase()
         migrateToDcAccounts()
+        if dcAccounts.getAll().isEmpty {
+            dcAccounts.addAccount()
+        }
         dcAccounts.get().logger = DcLogger()
         logger.info("➡️ didFinishLaunchingWithOptions")
 
@@ -467,6 +470,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         }
     }
 
+    func reloadDcContext() {
+        locationManager.reloadDcContext()
+        notificationManager.reloadDcContext()
+        if dcAccounts.get().isConfigured() {
+            appCoordinator.presentTabBarController()
+        } else {
+            appCoordinator.presentWelcomeController()
+        }
+    }
 
     func openDatabase() {
         dcAccounts.openDatabase()
@@ -477,7 +489,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
     }
 
     func deleteCurrentAccount() {
-        let _ = dcAccounts.removeAccount(id: dcAccounts.get().id)
+        _ = dcAccounts.removeAccount(id: dcAccounts.get().id)
     }
 
     func installEventHandler() {

+ 10 - 4
deltachat-ios/Controller/AccountSetupController.swift

@@ -758,9 +758,10 @@ class AccountSetupController: UITableViewController, ProgressAlertHandler {
                 alert.addAction(UIAlertAction(title: String.localized("ok"), style: .cancel))
                 present(alert, animated: true)
             }
+        } else {
+            logger.error("no documents directory found")
         }
 
-        logger.error("no documents directory found")
     }
 
     private func deleteAccount() {
@@ -775,13 +776,18 @@ class AccountSetupController: UITableViewController, ProgressAlertHandler {
 
         alert.addAction(UIAlertAction(title: String.localized("delete_account"), style: .destructive, handler: { [weak self] _ in
             guard let self = self else { return }
+            appDelegate.locationManager.disableLocationStreamingInAllChats()
             self.dcAccounts.stopIo()
             self.dcAccounts.removeAccount(id: self.dcAccounts.get().id)
-            self.dcAccounts.closeDatabase()
-            self.dcAccounts.openDatabase()
+            if let firstAccountId = self.dcAccounts.getAll().first {
+                _ = self.dcAccounts.selectAccount(id: firstAccountId)
+            } else {
+                let accountId = self.dcAccounts.addAccount()
+                _ = self.dcAccounts.selectAccount(id: accountId)
+            }
+            appDelegate.reloadDcContext()
             appDelegate.installEventHandler()
             self.dcAccounts.maybeStartIo()
-            appDelegate.appCoordinator.presentWelcomeController()
         }))
         alert.addAction(UIAlertAction(title: String.localized("cancel"), style: .cancel))
         present(alert, animated: true, completion: nil)

+ 1 - 1
deltachat-ios/Controller/SettingsController.swift

@@ -27,7 +27,7 @@ internal final class SettingsViewController: UITableViewController, ProgressAler
     }
 
     private var dcContext: DcContext
-    private var dcAccounts: DcAccounts
+    private let dcAccounts: DcAccounts
 
     private let externalPathDescr = "File Sharing/Delta Chat"
 

+ 24 - 17
deltachat-ios/Coordinator/AppCoordinator.swift

@@ -21,50 +21,52 @@ class AppCoordinator {
     }()
 
     // MARK: - tabbar view handling
-    private lazy var tabBarController: UITabBarController = {
+    private var qrNavController = UINavigationController()
+    private var chatsNavController = UINavigationController()
+    private var settingsNavController = UINavigationController()
+    private var tabBarController = UITabBarController()
+    private func createTabBarController() -> UITabBarController {
+        qrNavController = createQrNavigationController()
+        chatsNavController = createChatsNavigationController()
+        settingsNavController = createSettingsNavigationController()
         let tabBarController = UITabBarController()
         tabBarController.delegate = appStateRestorer
         tabBarController.viewControllers = [qrNavController, chatsNavController, settingsNavController]
         tabBarController.tabBar.tintColor = DcColors.primary
         return tabBarController
-    }()
+    }
 
-    private lazy var qrNavController: UINavigationController = {
+    private func createQrNavigationController() -> UINavigationController {
         let root = QrPageController(dcContext: dcAccounts.get())
         let nav = UINavigationController(rootViewController: root)
         let settingsImage = UIImage(named: "qr_code")
         nav.tabBarItem = UITabBarItem(title: String.localized("qr_code"), image: settingsImage, tag: qrTab)
         return nav
-    }()
+    }
 
-    private lazy var chatsNavController: UINavigationController = {
+    private func createChatsNavigationController() -> UINavigationController {
         let viewModel = ChatListViewModel(dcContext: dcAccounts.get(), isArchive: false)
         let root = ChatListController(dcContext: dcAccounts.get(), viewModel: viewModel)
         let nav = UINavigationController(rootViewController: root)
         let settingsImage = UIImage(named: "ic_chat")
         nav.tabBarItem = UITabBarItem(title: String.localized("pref_chats"), image: settingsImage, tag: chatsTab)
         return nav
-    }()
+    }
 
-    private lazy var settingsNavController: UINavigationController = {
+    private func createSettingsNavigationController() -> UINavigationController {
         let root = SettingsViewController(dcAccounts: dcAccounts)
         let nav = UINavigationController(rootViewController: root)
         let settingsImage = UIImage(named: "settings")
         nav.tabBarItem = UITabBarItem(title: String.localized("menu_settings"), image: settingsImage, tag: settingsTab)
         return nav
-    }()
+    }
 
     // MARK: - misc
     init(window: UIWindow, dcAccounts: DcAccounts) {
         self.window = window
         self.dcAccounts = dcAccounts
         let dcContext = dcAccounts.get()
-
-        if dcContext.isConfigured() {
-            presentTabBarController()
-        } else {
-            presentWelcomeController()
-        }
+        initializeRootController()
 
         let lastActiveTab = appStateRestorer.restoreLastActiveTab()
         if lastActiveTab == -1 {
@@ -104,10 +106,15 @@ class AppCoordinator {
         }
     }
 
-    func presentWelcomeController() {
+    func initializeRootController() {
         if dcAccounts.get().isConfigured() {
-            let _ = dcAccounts.addAccount()
+            presentTabBarController()
+        } else {
+            presentWelcomeController()
         }
+    }
+
+    func presentWelcomeController() {
         loginNavController.setViewControllers([WelcomeViewController(dcAccounts: dcAccounts)], animated: true)
         window.rootViewController = loginNavController
         window.makeKeyAndVisible()
@@ -119,7 +126,7 @@ class AppCoordinator {
     }
 
     func presentTabBarController() {
-        window.rootViewController = tabBarController
+        window.rootViewController = createTabBarController()
         showTab(index: chatsTab)
         window.makeKeyAndVisible()
     }

+ 4 - 0
deltachat-ios/Helper/LocationManager.swift

@@ -25,6 +25,10 @@ class LocationManager: NSObject, CLLocationManagerDelegate {
 
     }
 
+    public func reloadDcContext() {
+        dcContext = dcAccounts.get()
+    }
+
     func shareLocation(chatId: Int, duration: Int) {
         if duration > 0 {
             var authStatus: CLAuthorizationStatus

+ 1 - 1
deltachat-ios/Helper/NotificationManager.swift

@@ -18,7 +18,7 @@ public class NotificationManager {
         initMsgsNoticedObserver()
     }
 
-    public func switchContext() {
+    public func reloadDcContext() {
         NotificationManager.removeAllNotifications()
         dcContext = dcAccounts.get()
     }