Browse Source

add qrCodeReader to the normal UINavigationController flow

B. Petersen 5 năm trước cách đây
mục cha
commit
533fa3e4a4

+ 0 - 9
deltachat-ios/Controller/QrCodeReaderController.swift

@@ -24,10 +24,6 @@ class QrCodeReaderController: UIViewController {
            return label
     }()
 
-    private lazy var closeButton: UIBarButtonItem = {
-        return UIBarButtonItem(title: String.localized("cancel"), style: .done, target: self, action: #selector(closeButtonPressed(_:)))
-    }()
-
     private let supportedCodeTypes = [
         AVMetadataObject.ObjectType.qr
     ]
@@ -37,7 +33,6 @@ class QrCodeReaderController: UIViewController {
         super.viewDidLoad()
         self.edgesForExtendedLayout = []
         title = String.localized("qrscan_title")
-        navigationItem.leftBarButtonItem = closeButton
 
         guard let captureDevice = AVCaptureDevice.DiscoverySession.init(
             deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera],
@@ -119,10 +114,6 @@ class QrCodeReaderController: UIViewController {
     }
 
     // MARK: - actions
-    @objc private func closeButtonPressed(_ sender: UIBarButtonItem) {
-        self.dismiss(animated: true, completion: nil)
-    }
-
     func startSession() {
         captureSession.startRunning()
     }

+ 13 - 36
deltachat-ios/Controller/WelcomeViewController.swift

@@ -3,7 +3,6 @@ import DcCore
 
 class WelcomeViewController: UIViewController, ProgressAlertHandler {
     private let dcContext: DcContext
-    private var scannedQrCode: String?
     var progressObserver: Any?
     var onProgressSuccess: VoidFunction?
 
@@ -26,14 +25,16 @@ class WelcomeViewController: UIViewController, ProgressAlertHandler {
             self.navigationController?.pushViewController(accountSetupController, animated: true)
         }
         view.onScanQRCode  = { [unowned self] in
-            self.showQRReader()
+            let qrReader = QrCodeReaderController()
+            qrReader.delegate = self
+            self.qrCodeReader = qrReader
+            self.navigationController?.pushViewController(qrReader, animated: true)
         }
         view.translatesAutoresizingMaskIntoConstraints = false
         return view
     }()
 
     private var qrCodeReader: QrCodeReaderController?
-    private var qrCodeReaderNav: UINavigationController?
     weak var progressAlert: UIAlertController?
 
     init(dcContext: DcContext) {
@@ -104,30 +105,10 @@ class WelcomeViewController: UIViewController, ProgressAlertHandler {
         frameGuide.widthAnchor.constraint(equalTo: contentGuide.widthAnchor).isActive = true
     }
 
-    // MARK: - factory
-    private func makeQRReader() -> QrCodeReaderController {
-        let controller = QrCodeReaderController()
-        controller.delegate = self
-        return controller
-    }
-
     // MARK: - actions
 
-    private func showQRReader() {
-        let qrReader = makeQRReader()
-        self.qrCodeReader = qrReader
-        let nav = UINavigationController(rootViewController: qrReader)
-        nav.modalPresentationStyle = .fullScreen
-        self.qrCodeReaderNav = nav
-        present(nav, animated: true)
-    }
-
-    private func createAccountFromQRCode() {
-        guard let code = scannedQrCode else {
-            return
-        }
-        let success = dcContext.setConfigFromQR(qrCode: code)
-        scannedQrCode = nil
+    private func createAccountFromQRCode(qrCode: String) {
+        let success = dcContext.setConfigFromQR(qrCode: qrCode)
         if success {
             addProgressAlertListener(onSuccess: handleLoginSuccess)
             showProgressAlert(title: String.localized("login_header"), dcContext: dcContext)
@@ -153,14 +134,13 @@ extension WelcomeViewController: QrCodeReaderDelegate {
     func handleQrCode(_ code: String) {
         let lot = dcContext.checkQR(qrCode: code)
         if let domain = lot.text1, lot.state == DC_QR_ACCOUNT {
-            self.scannedQrCode = code
-            confirmAccountCreationAlert(accountDomain: domain)
+            confirmAccountCreationAlert(accountDomain: domain, qrCode: code)
         } else {
             qrErrorAlert()
         }
     }
 
-    private func confirmAccountCreationAlert(accountDomain domain: String) {
+    private func confirmAccountCreationAlert(accountDomain domain: String, qrCode: String) {
         let title = String.localizedStringWithFormat(NSLocalizedString("qraccount_ask_create_and_login", comment: ""), domain)
         let alert = UIAlertController(title: title, message: nil, preferredStyle: .alert)
 
@@ -169,7 +149,7 @@ extension WelcomeViewController: QrCodeReaderDelegate {
             style: .default,
             handler: { [unowned self] _ in
                 self.dismissQRReader()
-                self.createAccountFromQRCode()
+                self.createAccountFromQRCode(qrCode: qrCode)
             }
         )
 
@@ -183,7 +163,7 @@ extension WelcomeViewController: QrCodeReaderDelegate {
 
         alert.addAction(okAction)
         alert.addAction(qrCancelAction)
-        qrCodeReaderNav?.present(alert, animated: true)
+        qrCodeReader?.present(alert, animated: true)
     }
 
     private func qrErrorAlert() {
@@ -197,15 +177,12 @@ extension WelcomeViewController: QrCodeReaderDelegate {
             }
         )
         alert.addAction(okAction)
-        qrCodeReaderNav?.present(alert, animated: true, completion: nil)
+        qrCodeReader?.present(alert, animated: true, completion: nil)
     }
 
     private func dismissQRReader() {
-        self.qrCodeReaderNav?.dismiss(animated: false) {
-            self.qrCodeReaderNav = nil
-            self.qrCodeReader = nil
-            self.scannedQrCode = nil
-        }
+        self.navigationController?.popViewController(animated: true)
+        self.qrCodeReader = nil
     }
 }
 

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

@@ -17,8 +17,7 @@ class AppCoordinator: NSObject, Coordinator {
 
     // MARK: - login view handling
     private lazy var loginNavController: UINavigationController = {
-        let root = WelcomeViewController(dcContext: dcContext)
-        let nav = UINavigationController(rootViewController: root)
+        let nav = UINavigationController() // we change the root, therefore do not set on implicit creation
         return nav
     }()
 
@@ -106,6 +105,7 @@ class AppCoordinator: NSObject, Coordinator {
     }
 
     func presentWelcomeController() {
+        loginNavController.setViewControllers([WelcomeViewController(dcContext: dcContext)], animated: true)
         window.rootViewController = loginNavController
         window.makeKeyAndVisible()