Преглед изворни кода

fix QRInviteCode cell self-sizing issues by replacing it with QRViewController, streamlining QRViewController so that it can handle all kinds of QR codes

cyberta пре 5 година
родитељ
комит
f67f9a30b1

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

@@ -100,7 +100,6 @@
 		3095A351237DD1F700AB07F7 /* MediaPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3095A350237DD1F700AB07F7 /* MediaPicker.swift */; };
 		30A2039D24A4A1A100BFF51C /* BasicCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A2039C24A4A1A100BFF51C /* BasicCell.swift */; };
 		30A2EC36247D72720024ADD8 /* AnimatedImageMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A2EC35247D72720024ADD8 /* AnimatedImageMessageCell.swift */; };
-		30A4D9AE2332672700544344 /* QrInviteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A4D9AD2332672600544344 /* QrInviteViewController.swift */; };
 		30B0ACFA24AB5B99004D5E29 /* SettingsEphemeralMessageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B0ACF924AB5B99004D5E29 /* SettingsEphemeralMessageController.swift */; };
 		30C0D49D237C4908008E2A0E /* CertificateCheckController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30C0D49C237C4908008E2A0E /* CertificateCheckController.swift */; };
 		30E8F2132447285600CE2C90 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30E8F2122447285600CE2C90 /* ShareViewController.swift */; };
@@ -387,7 +386,6 @@
 		3095A350237DD1F700AB07F7 /* MediaPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPicker.swift; sourceTree = "<group>"; };
 		30A2039C24A4A1A100BFF51C /* BasicCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicCell.swift; sourceTree = "<group>"; };
 		30A2EC35247D72720024ADD8 /* AnimatedImageMessageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimatedImageMessageCell.swift; sourceTree = "<group>"; };
-		30A4D9AD2332672600544344 /* QrInviteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QrInviteViewController.swift; sourceTree = "<group>"; };
 		30AC265E237F1807002A943F /* AvatarHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarHelper.swift; sourceTree = "<group>"; };
 		30B0ACF924AB5B99004D5E29 /* SettingsEphemeralMessageController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsEphemeralMessageController.swift; sourceTree = "<group>"; };
 		30C0D49C237C4908008E2A0E /* CertificateCheckController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificateCheckController.swift; sourceTree = "<group>"; };
@@ -928,7 +926,6 @@
 				AE4AEE3422B1030D000AA495 /* PreviewController.swift */,
 				AEA0F6A024474146009F887B /* ProfileInfoViewController.swift */,
 				789E879521D6CB58003ED1C5 /* QrCodeReaderController.swift */,
-				30A4D9AD2332672600544344 /* QrInviteViewController.swift */,
 				AECEF03D244F2D55006C90DA /* QrPageController.swift */,
 				30149D9222F21129003C12B5 /* QrViewController.swift */,
 				B21005DA23383664004C70C5 /* SettingsClassicViewController.swift */,
@@ -1408,7 +1405,6 @@
 				AEC67A1C241CE9E4007DDBE1 /* AppStateRestorer.swift in Sources */,
 				305961D32346125100C80F33 /* MessagesViewController+Keyboard.swift in Sources */,
 				305961EF2346125100C80F33 /* HorizontalEdgeInsets.swift in Sources */,
-				30A4D9AE2332672700544344 /* QrInviteViewController.swift in Sources */,
 				305961D62346125100C80F33 /* MessageInputBar.swift in Sources */,
 				305961ED2346125100C80F33 /* DetectorType.swift in Sources */,
 				305962062346125100C80F33 /* TypingIndicatorCellSizeCalculator.swift in Sources */,

+ 6 - 1
deltachat-ios/Controller/GroupChatDetailViewController.swift

@@ -244,7 +244,12 @@ class GroupChatDetailViewController: UIViewController {
     }
 
     private func showQrCodeInvite(chatId: Int) {
-        let qrInviteCodeController = QrInviteViewController(dcContext: dcContext, chatId: chatId)
+        var hint = ""
+        let dcChat = dcContext.getChat(chatId: chatId)
+        if !dcChat.name.isEmpty {
+            hint = String.localizedStringWithFormat(String.localized("qrshow_join_group_hint"), dcChat.name)
+        }
+        let qrInviteCodeController = QrViewController(dcContext: dcContext, chatId: chatId, qrCodeHint: hint)
         navigationController?.pushViewController(qrInviteCodeController, animated: true)
     }
 

+ 6 - 1
deltachat-ios/Controller/NewGroupController.swift

@@ -352,7 +352,12 @@ class NewGroupController: UITableViewController, MediaPickerDelegate {
     }
 
     private func showQrCodeInvite(chatId: Int) {
-        let qrInviteCodeController = QrInviteViewController(dcContext: dcContext, chatId: chatId)
+        var hint = ""
+        let dcChat = dcContext.getChat(chatId: chatId)
+        if !dcChat.name.isEmpty {
+            hint = String.localizedStringWithFormat(String.localized("qrshow_join_group_hint"), dcChat.name)
+        }
+        let qrInviteCodeController = QrViewController(dcContext: dcContext, chatId: chatId, qrCodeHint: hint)
         qrInviteCodeController.onDismissed = { [weak self] in
             self?.updateGroupContactIdsOnQRCodeInvite()
         }

+ 0 - 121
deltachat-ios/Controller/QrInviteViewController.swift

@@ -1,121 +0,0 @@
-import Foundation
-import UIKit
-import DcCore
-
-class QrInviteViewController: UITableViewController {
-    private let rowQRCode = 0
-    private let rowDescription = 1
-
-    let dcContext: DcContext
-    let chatId: Int
-
-    var onDismissed: (() -> Void)?
-
-    init(dcContext: DcContext, chatId: Int) {
-        self.dcContext = dcContext
-        self.chatId = chatId
-        super.init(nibName: nil, bundle: nil)
-    }
-
-    required init?(coder _: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        title = String.localized("qrshow_join_contact_title")
-        tableView.separatorStyle = .none
-    }
-
-    override func viewDidDisappear(_ animated: Bool) {
-        onDismissed?()
-    }
-
-    override func tableView(_: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-        let row = indexPath.row
-        switch row {
-        case rowQRCode:
-            return createQRCodeCell()
-        case rowDescription:
-            return createInfoLabelCell()
-        default:
-            return UITableViewCell(style: .default, reuseIdentifier: nil)
-        }
-    }
-
-    override func numberOfSections(in _: UITableView) -> Int {
-        return 1
-    }
-
-    override func tableView(_: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return 2
-    }
-
-    override func tableView(_: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
-        switch indexPath.row {
-        case rowQRCode:
-            return 225
-        case rowDescription:
-            return 40
-        default:
-            return 10
-        }
-    }
-
-    private func createQRCodeCell() -> UITableViewCell {
-        let cell = UITableViewCell(style: .default, reuseIdentifier: "qrCodeCell")
-        let qrCode = createQRCodeView()
-        cell.contentView.addSubview(qrCode)
-        cell.selectionStyle = .none
-
-        let qrCodeConstraints = [qrCode.constraintAlignTopTo(cell.contentView, paddingTop: 50),
-                                 qrCode.constraintCenterXTo(cell.contentView)]
-        cell.contentView.addConstraints(qrCodeConstraints)
-        return cell
-    }
-
-    private func createInfoLabelCell() -> UITableViewCell {
-        let label = createDescriptionView()
-        let cell = UITableViewCell(style: .default, reuseIdentifier: "qrCodeCell")
-        cell.contentView.addSubview(label)
-        cell.selectionStyle = .none
-        let labelConstraints = [label.constraintCenterXTo(cell.contentView),
-                                label.constraintAlignTopTo(cell.contentView, paddingTop: 45),
-                                label.constraintAlignLeadingTo(cell.contentView, paddingLeading: 30),
-                                label.constraintAlignTrailingTo(cell.contentView, paddingTrailing: 30)]
-        cell.contentView.addConstraints(labelConstraints)
-        return cell
-    }
-
-    private func createQRCodeView() -> UIView {
-        let width: CGFloat = 200
-        let frame = CGRect(origin: .zero, size: .init(width: width, height: width))
-        let imageView = QRCodeView(frame: frame)
-        if let qrCode = dcContext.getSecurejoinQr(chatId: chatId) {
-            imageView.generateCode(
-                qrCode,
-                foregroundColor: .darkText,
-                backgroundColor: .white
-            )
-        }
-        imageView.translatesAutoresizingMaskIntoConstraints = false
-        imageView.widthAnchor.constraint(equalToConstant: width).isActive = true
-        imageView.heightAnchor.constraint(equalToConstant: width).isActive = true
-        return imageView
-    }
-
-    private func createDescriptionView() -> UIView {
-        let label = UILabel.init()
-        label.translatesAutoresizingMaskIntoConstraints = false
-        let dcChat = dcContext.getChat(chatId: chatId)
-        if !dcChat.name.isEmpty {
-            label.text = String.localizedStringWithFormat(String.localized("qrshow_join_group_hint"), dcChat.name)
-        }
-        label.lineBreakMode = .byWordWrapping
-        label.numberOfLines = 0
-        label.textAlignment = .center
-        label.font = UIFont.preferredFont(forTextStyle: .subheadline)
-        label.adjustsFontForContentSizeCategory = true
-        return label
-    }
-}

+ 17 - 3
deltachat-ios/Controller/QrPageController.swift

@@ -9,6 +9,18 @@ class QrPageController: UIPageViewController, ProgressAlertHandler {
 
     private var selectedIndex: Int = 0
 
+    private lazy var qrCodeHint: String = {
+        var qrCodeHint = ""
+        if dcContext.isConfigured() {
+            let contact = DcContact(id: Int(DC_CONTACT_ID_SELF))
+            qrCodeHint = String.localizedStringWithFormat(
+                String.localized("qrshow_join_contact_hint"),
+                contact.email
+            )
+        }
+        return qrCodeHint
+    }()
+
     private lazy var qrSegmentControl: UISegmentedControl = {
         let control = UISegmentedControl(
             items: [String.localized("qrshow_title"), String.localized("qrscan_title")]
@@ -35,7 +47,7 @@ class QrPageController: UIPageViewController, ProgressAlertHandler {
         delegate = self
         navigationItem.titleView = qrSegmentControl
 
-        let qrController = QrViewController(dcContext: dcContext)
+        let qrController = QrViewController(dcContext: dcContext, qrCodeHint: qrCodeHint)
         setViewControllers(
             [qrController],
             direction: .forward,
@@ -60,10 +72,12 @@ class QrPageController: UIPageViewController, ProgressAlertHandler {
         self.progressObserver = nil
     }
 
+
+
     // MARK: - actions
     @objc private func qrSegmentControlChanged(_ sender: UISegmentedControl) {
         if sender.selectedSegmentIndex == 0 {
-            let qrController = QrViewController(dcContext: dcContext)
+            let qrController = QrViewController(dcContext: dcContext, qrCodeHint: qrCodeHint)
             setViewControllers([qrController], direction: .reverse, animated: true, completion: nil)
         } else {
             let qrCodeReaderController = makeQRReader()
@@ -99,7 +113,7 @@ extension QrPageController: UIPageViewControllerDataSource, UIPageViewController
         if viewController is QrViewController {
             return nil
         }
-        return QrViewController(dcContext: dcContext)
+        return QrViewController(dcContext: dcContext, qrCodeHint: qrCodeHint)
     }
 
     func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {

+ 16 - 25
deltachat-ios/Controller/QrViewController.swift

@@ -6,13 +6,7 @@ class QrViewController: UIViewController {
 
     private let dcContext: DcContext
 
-    private var contact: DcContact? {
-        // This is nil if we do not have an account setup yet
-        if !dcContext.isConfigured() {
-            return nil
-        }
-        return DcContact(id: Int(DC_CONTACT_ID_SELF))
-    }
+    var onDismissed: (() -> Void)?
 
     private lazy var scrollView: UIScrollView = {
         let scrollView = UIScrollView()
@@ -21,14 +15,19 @@ class QrViewController: UIViewController {
     }()
 
     private lazy var qrContentView: QrViewContentView = {
-        let qrCode = dcContext.getSecurejoinQr(chatId: 0)
-        let view = QrViewContentView(contact: contact, qrCode: qrCode)
+        let qrCode = dcContext.getSecurejoinQr(chatId: chatId)
+        let view = QrViewContentView(qrCode: qrCode, hint: qrCodeHint)
         view.translatesAutoresizingMaskIntoConstraints = false
         return view
     }()
 
-    init(dcContext: DcContext) {
+    private var qrCodeHint: String
+    private var chatId: Int
+
+    init(dcContext: DcContext, chatId: Int? = 0, qrCodeHint: String?) {
         self.dcContext = dcContext
+        self.chatId = chatId ?? 0
+        self.qrCodeHint = qrCodeHint ?? ""
         super.init(nibName: nil, bundle: nil)
     }
 
@@ -41,6 +40,7 @@ class QrViewController: UIViewController {
         super.viewDidLoad()
         title = String.localized("qr_code")
         setupSubviews()
+        view.backgroundColor = DcColors.defaultBackgroundColor
     }
 
     override func viewDidLayoutSubviews() {
@@ -54,6 +54,10 @@ class QrViewController: UIViewController {
         scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
     }
 
+    override func viewDidDisappear(_ animated: Bool) {
+        onDismissed?()
+    }
+
     // MARK: - setup
     private func setupSubviews() {
         view.addSubview(scrollView)
@@ -77,14 +81,6 @@ class QrViewController: UIViewController {
         frameGuide.widthAnchor.constraint(equalTo: contentGuide.widthAnchor).isActive = true
     }
 
-    // MARK: - actions
-    private func displayNewChat(contactId: Int) {
-        let chatId = dcContext.createChatByContactId(contactId: contactId)
-        let chatVC = ChatViewController(dcContext: dcContext, chatId: Int(chatId))
-
-        chatVC.hidesBottomBarWhenPushed = true
-        navigationController?.pushViewController(chatVC, animated: true)
-    }
 }
 
 // MARK: - QrViewContentView
@@ -117,14 +113,9 @@ class QrViewContentView: UIView {
         return container.heightAnchor.constraint(greaterThanOrEqualToConstant: 0)
     }()
 
-    init(contact: DcContact?, qrCode: String?) {
+    init(qrCode: String?, hint: String) {
         super.init(frame: .zero)
-        if let contact = contact {
-            hintLabel.text = String.localizedStringWithFormat(
-                String.localized("qrshow_join_contact_hint"),
-                contact.email
-            )
-        }
+        hintLabel.text = hint
         if let qrCode = qrCode {
             qrCodeView.generateCode(
                 qrCode,