Эх сурвалжийг харах

store and restore last active segment

nayooti 5 жил өмнө
parent
commit
8b974e74aa

+ 28 - 6
deltachat-ios/Controller/QrPageController.swift

@@ -8,8 +8,6 @@ class QrPageController: UIPageViewController, ProgressAlertHandler {
     weak var progressAlert: UIAlertController?
     var progressObserver: Any?
 
-    private var selectedIndex: Int = 0
-
     private lazy var qrSegmentControl: UISegmentedControl = {
         let control = UISegmentedControl(
             items: [String.localized("qrshow_title"), String.localized("qrscan_title")]
@@ -45,21 +43,43 @@ class QrPageController: UIPageViewController, ProgressAlertHandler {
         )
     }
 
+    override func viewWillAppear(_ animated: Bool) {
+        let segmentState = AppStateRestorer.shared.restoreLastActiveQrSegment()
+        qrSegmentControl.selectedSegmentIndex = segmentState.rawValue
+        switch segmentState {
+        case .qrRead:
+            showQrReader()
+        case .qrView:
+            showQrView()
+        }
+    }
+
     override func viewWillDisappear(_ animated: Bool) {
         self.progressObserver = nil
     }
 
     // MARK: - actions
+
     @objc private func qrSegmentControlChanged(_ sender: UISegmentedControl) {
         if sender.selectedSegmentIndex == 0 {
-            let qrController = QrViewController(dcContext: dcContext)
-            setViewControllers([qrController], direction: .reverse, animated: true, completion: nil)
+            showQrView()
         } else {
-            let qrCodeReaderController = makeQRReader()
-            setViewControllers([qrCodeReaderController], direction: .forward, animated: true, completion: nil)
+            showQrReader()
         }
     }
 
+    private func showQrView() {
+        let qrController = QrViewController(dcContext: dcContext)
+        setViewControllers([qrController], direction: .reverse, animated: true, completion: nil)
+        AppStateRestorer.shared.storeLastActiveQrSegment(segment: .qrView)
+    }
+
+    private func showQrReader() {
+        let qrCodeReaderController = makeQRReader()
+        setViewControllers([qrCodeReaderController], direction: .forward, animated: true, completion: nil)
+        AppStateRestorer.shared.storeLastActiveQrSegment(segment: .qrRead)
+    }
+
     // MARK: - factory
     private func makeQRReader() -> QrCodeReaderController {
         let qrReader = QrCodeReaderController()
@@ -88,8 +108,10 @@ extension QrPageController: UIPageViewControllerDataSource, UIPageViewController
         if completed {
             if previousViewControllers.first is QrViewController {
                 qrSegmentControl.selectedSegmentIndex = 1
+                AppStateRestorer.shared.storeLastActiveQrSegment(segment: .qrRead)
             } else {
                 qrSegmentControl.selectedSegmentIndex = 0
+                AppStateRestorer.shared.storeLastActiveQrSegment(segment: .qrView)
             }
         }
     }

+ 16 - 0
deltachat-ios/Handler/AppStateRestorer.swift

@@ -4,6 +4,7 @@ class AppStateRestorer: NSObject, UITabBarControllerDelegate {
 
     private let lastActiveTabKey = "last_active_tab"
     private let lastActiveChatId = "last_active_chat_id"
+    private let lastActiveQrSegment = "last_active_qr_segment"
     private let offsetKey = 10
 
     // UserDefaults returns 0 by default which conflicts with tab 0 -> therefore we map our tab indexes by adding an offsetKey
@@ -15,6 +16,11 @@ class AppStateRestorer: NSObject, UITabBarControllerDelegate {
         case firstLaunch = 0
     }
 
+    enum QrSegment: Int {
+        case qrView = 0
+        case qrRead = 1
+    }
+
     private override init() {}
 
     static let shared: AppStateRestorer = AppStateRestorer()
@@ -66,4 +72,14 @@ class AppStateRestorer: NSObject, UITabBarControllerDelegate {
         }
         return restoredChatId
     }
+
+    func storeLastActiveQrSegment(segment: QrSegment) {
+        UserDefaults.standard.set(segment.rawValue, forKey: lastActiveQrSegment)
+    }
+
+    func restoreLastActiveQrSegment() -> QrSegment {
+        let value = UserDefaults.standard.integer(forKey: lastActiveQrSegment)
+        let segment = QrSegment(rawValue: value)! // if no segment has been stored it will create QrSegment.qrView (default)
+        return segment
+    }
 }