소스 검색

Merge pull request #564 from deltachat/restoreTabState

Restore last active tab
cyBerta 5 년 전
부모
커밋
4eb6484eb8
3개의 변경된 파일55개의 추가작업 그리고 2개의 파일을 삭제
  1. 4 0
      deltachat-ios.xcodeproj/project.pbxproj
  2. 10 2
      deltachat-ios/Coordinator/AppCoordinator.swift
  3. 41 0
      deltachat-ios/Handler/TabBarRestorer.swift

+ 4 - 0
deltachat-ios.xcodeproj/project.pbxproj

@@ -147,6 +147,7 @@
 		AEACE2DF1FB3246400DCDD78 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEACE2DE1FB3246400DCDD78 /* Message.swift */; };
 		AEACE2E31FB32B5C00DCDD78 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEACE2E21FB32B5C00DCDD78 /* Constants.swift */; };
 		AEACE2E51FB32E1900DCDD78 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEACE2E41FB32E1900DCDD78 /* Utils.swift */; };
+		AEC67A1C241CE9E4007DDBE1 /* TabBarRestorer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEC67A1B241CE9E4007DDBE1 /* TabBarRestorer.swift */; };
 		AEE56D762253431E007DC082 /* AccountSetupController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE56D752253431E007DC082 /* AccountSetupController.swift */; };
 		AEE56D7D2253ADB4007DC082 /* HudHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE56D7C2253ADB4007DC082 /* HudHandler.swift */; };
 		AEE56D80225504DB007DC082 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE56D7F225504DB007DC082 /* Extensions.swift */; };
@@ -379,6 +380,7 @@
 		AEACE2DE1FB3246400DCDD78 /* Message.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Message.swift; sourceTree = "<group>"; };
 		AEACE2E21FB32B5C00DCDD78 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
 		AEACE2E41FB32E1900DCDD78 /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = "<group>"; };
+		AEC67A1B241CE9E4007DDBE1 /* TabBarRestorer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarRestorer.swift; sourceTree = "<group>"; };
 		AEE56D752253431E007DC082 /* AccountSetupController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountSetupController.swift; sourceTree = "<group>"; tabWidth = 4; };
 		AEE56D7C2253ADB4007DC082 /* HudHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HudHandler.swift; sourceTree = "<group>"; };
 		AEE56D7F225504DB007DC082 /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = "<group>"; };
@@ -828,6 +830,7 @@
 		AE851ACB227C7A5000ED86F0 /* Handler */ = {
 			isa = PBXGroup;
 			children = (
+				AEC67A1B241CE9E4007DDBE1 /* TabBarRestorer.swift */,
 				AEE56D7C2253ADB4007DC082 /* HudHandler.swift */,
 				AE8519E92272FDCA00ED86F0 /* DeviceContactsHandler.swift */,
 			);
@@ -1153,6 +1156,7 @@
 				B21005DB23383664004C70C5 /* SettingsClassicViewController.swift in Sources */,
 				305961F62346125100C80F33 /* MessageContentCell.swift in Sources */,
 				305961E42346125100C80F33 /* MessageKitDateFormatter.swift in Sources */,
+				AEC67A1C241CE9E4007DDBE1 /* TabBarRestorer.swift in Sources */,
 				305961D32346125100C80F33 /* MessagesViewController+Keyboard.swift in Sources */,
 				305961EF2346125100C80F33 /* HorizontalEdgeInsets.swift in Sources */,
 				30A4D9AE2332672700544344 /* QrInviteViewController.swift in Sources */,

+ 10 - 2
deltachat-ios/Coordinator/AppCoordinator.swift

@@ -10,10 +10,13 @@ class AppCoordinator: NSObject, Coordinator {
     private let chatsTab = 1
     private let settingsTab = 2
 
+    private let tabBarRestorer = TabBarRestorer()
+
     private var childCoordinators: [Coordinator] = []
 
     private lazy var tabBarController: UITabBarController = {
         let tabBarController = UITabBarController()
+        tabBarController.delegate = tabBarRestorer
         tabBarController.viewControllers = [qrController, chatListController, settingsController]
         tabBarController.tabBar.tintColor = DcColors.primary
         return tabBarController
@@ -77,8 +80,13 @@ class AppCoordinator: NSObject, Coordinator {
     }
 
     public func start() {
-        print(tabBarController.selectedIndex)
-        showTab(index: chatsTab)
+        let lastActiveTab = tabBarRestorer.restoreLastActiveTab()
+        if lastActiveTab == -1 {
+            // no stored tab
+            showTab(index: chatsTab)
+        } else {
+            showTab(index: lastActiveTab)
+        }
     }
 
     func showTab(index: Int) {

+ 41 - 0
deltachat-ios/Handler/TabBarRestorer.swift

@@ -0,0 +1,41 @@
+import UIKit
+
+class TabBarRestorer: NSObject, UITabBarControllerDelegate {
+
+    private let lastActiveTabKey = "last_active_tab"
+    private let offsetKey = 10
+
+    // UserDefaults returns 0 by default which conflicts with tab 0 -> therefore we map our tab indexes by adding an offsetKey
+
+    private enum Tab: Int {
+        case qrTab = 10
+        case chatTab = 11
+        case settingsTab = 12
+        case firstLaunch = 0
+    }
+
+    func restoreLastActiveTab() -> Int {
+
+        let restoredTab = UserDefaults.standard.integer(forKey: lastActiveTabKey)
+
+        guard let lastTab = Tab(rawValue: restoredTab) else {
+            safe_fatalError("invalid restored tab")
+            return -1
+        }
+
+        switch lastTab {
+        case .qrTab, .chatTab, .settingsTab:
+            return lastTab.rawValue - offsetKey
+        case .firstLaunch:
+            return -1
+        }
+    }
+
+    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
+        let activeTab = tabBarController.selectedIndex + offsetKey
+        UserDefaults.standard.set(activeTab, forKey: lastActiveTabKey)
+        UserDefaults.standard.synchronize()
+    }
+
+
+}