QrViewController.swift 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. import Foundation
  2. import UIKit
  3. import DcCore
  4. class QrViewController: UIViewController {
  5. private let dcContext: DcContext
  6. private var contact: DcContact? {
  7. // This is nil if we do not have an account setup yet
  8. if !dcContext.isConfigured() {
  9. return nil
  10. }
  11. return DcContact(id: Int(DC_CONTACT_ID_SELF))
  12. }
  13. private lazy var scrollView: UIScrollView = {
  14. let scrollView = UIScrollView()
  15. scrollView.showsVerticalScrollIndicator = false
  16. return scrollView
  17. }()
  18. private lazy var qrContentView: QrViewContentView = {
  19. let view = QrViewContentView()
  20. view.translatesAutoresizingMaskIntoConstraints = false
  21. return view
  22. }()
  23. init(dcContext: DcContext) {
  24. self.dcContext = dcContext
  25. super.init(nibName: nil, bundle: nil)
  26. }
  27. required init?(coder _: NSCoder) {
  28. fatalError("init(coder:) has not been implemented")
  29. }
  30. // MARK: - lifecycle
  31. override func viewDidLoad() {
  32. super.viewDidLoad()
  33. title = String.localized("qr_code")
  34. setupSubviews()
  35. }
  36. override func viewDidLayoutSubviews() {
  37. super.viewDidLayoutSubviews()
  38. qrContentView.minContainerHeight = view.frame.height
  39. }
  40. override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
  41. super.viewWillTransition(to: size, with: coordinator)
  42. qrContentView.minContainerHeight = size.height
  43. scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
  44. }
  45. // MARK: - setup
  46. private func setupSubviews() {
  47. view.addSubview(scrollView)
  48. scrollView.translatesAutoresizingMaskIntoConstraints = false
  49. scrollView.addSubview(qrContentView)
  50. let frameGuide = scrollView.frameLayoutGuide
  51. let contentGuide = scrollView.contentLayoutGuide
  52. frameGuide.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
  53. frameGuide.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
  54. frameGuide.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
  55. frameGuide.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
  56. contentGuide.leadingAnchor.constraint(equalTo: qrContentView.leadingAnchor).isActive = true
  57. contentGuide.topAnchor.constraint(equalTo: qrContentView.topAnchor).isActive = true
  58. contentGuide.trailingAnchor.constraint(equalTo: qrContentView.trailingAnchor).isActive = true
  59. contentGuide.bottomAnchor.constraint(equalTo: qrContentView.bottomAnchor).isActive = true
  60. // this enables vertical scrolling
  61. frameGuide.widthAnchor.constraint(equalTo: contentGuide.widthAnchor).isActive = true
  62. }
  63. // MARK: - actions
  64. private func displayNewChat(contactId: Int) {
  65. let chatId = dcContext.createChatByContactId(contactId: contactId)
  66. let chatVC = ChatViewController(dcContext: dcContext, chatId: Int(chatId))
  67. chatVC.hidesBottomBarWhenPushed = true
  68. navigationController?.pushViewController(chatVC, animated: true)
  69. }
  70. }
  71. // MARK: - QrViewContentView
  72. class QrViewContentView: UIView {
  73. private let container = UIView()
  74. var minContainerHeight: CGFloat = 0 {
  75. didSet {
  76. containerMinHeightConstraint.constant = minContainerHeight
  77. }
  78. }
  79. private lazy var containerMinHeightConstraint: NSLayoutConstraint = {
  80. return container.heightAnchor.constraint(greaterThanOrEqualToConstant: 0)
  81. }()
  82. init() {
  83. super.init(frame: .zero)
  84. setupSubviews()
  85. }
  86. required init?(coder: NSCoder) {
  87. fatalError("init(coder:) has not been implemented")
  88. }
  89. private func setupSubviews() {
  90. addSubview(container)
  91. container.translatesAutoresizingMaskIntoConstraints = false
  92. container.topAnchor.constraint(equalTo: topAnchor).isActive = true
  93. container.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
  94. container.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.75).isActive = true
  95. container.centerXAnchor.constraint(equalTo: centerXAnchor, constant: 0).isActive = true
  96. containerMinHeightConstraint.isActive = true
  97. }
  98. }
  99. /*
  100. private func createQRCodeCell() -> UITableViewCell {
  101. let cell = UITableViewCell(style: .default, reuseIdentifier: "qrCodeCell")
  102. let qrCode = createQRCodeView()
  103. let infolabel = createInfoLabel()
  104. cell.contentView.addSubview(qrCode)
  105. cell.contentView.addSubview(infolabel)
  106. cell.selectionStyle = .none
  107. let qrCodeConstraints = [qrCode.constraintAlignTopTo(cell.contentView, paddingTop: 25),
  108. qrCode.constraintCenterXTo(cell.contentView)]
  109. let infoLabelConstraints = [infolabel.constraintToBottomOf(qrCode, paddingTop: 25),
  110. infolabel.constraintAlignLeadingTo(cell.contentView, paddingLeading: 8),
  111. infolabel.constraintAlignTrailingTo(cell.contentView, paddingTrailing: 8)]
  112. cell.contentView.addConstraints(qrCodeConstraints)
  113. cell.contentView.addConstraints(infoLabelConstraints)
  114. return cell
  115. }
  116. private func createInfoLabel() -> UIView {
  117. let label = UILabel.init()
  118. label.translatesAutoresizingMaskIntoConstraints = false
  119. if let contact = contact {
  120. label.text = String.localizedStringWithFormat(String.localized("qrshow_join_contact_hint"), contact.email)
  121. }
  122. label.lineBreakMode = .byWordWrapping
  123. label.numberOfLines = 0
  124. label.textAlignment = .center
  125. label.font = UIFont.systemFont(ofSize: 14)
  126. return label
  127. }
  128. private func createQRCodeView() -> UIView {
  129. let width: CGFloat = 230
  130. let frame = CGRect(origin: .zero, size: .init(width: width, height: width))
  131. let imageView = QRCodeView(frame: frame)
  132. if let qrCode = dcContext.getSecurejoinQr(chatId: 0) {
  133. imageView.generateCode(
  134. qrCode,
  135. foregroundColor: .darkText,
  136. backgroundColor: .white
  137. )
  138. }
  139. imageView.translatesAutoresizingMaskIntoConstraints = false
  140. imageView.widthAnchor.constraint(equalToConstant: width).isActive = true
  141. imageView.heightAnchor.constraint(equalToConstant: width).isActive = true
  142. return imageView
  143. }
  144. */