Skip to content

Commit

Permalink
Cleanup and refactorings (#2276)
Browse files Browse the repository at this point in the history
Also: Fix constraints and correctly set height for QR-code-image.
  • Loading branch information
zeitschlag committed Aug 31, 2024
1 parent 0599501 commit 798b270
Showing 1 changed file with 65 additions and 51 deletions.
116 changes: 65 additions & 51 deletions deltachat-ios/Controller/QrViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,9 @@ class QrViewController: UIViewController {

private let dcContext: DcContext
var onDismissed: (() -> Void)?

private lazy var qrContentView: UIImageView = {
let svg = dcContext.getSecurejoinQrSVG(chatId: chatId)
let view = UIImageView()
view.contentMode = .scaleAspectFit
view.translatesAutoresizingMaskIntoConstraints = false
view.image = getQrImage(svg: svg)
return view
}()

private lazy var moreButton: UIBarButtonItem = {
let image: UIImage?
if #available(iOS 13.0, *) {
image = UIImage(systemName: "ellipsis.circle")
} else {
image = UIImage(named: "ic_more")
}
return UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(showMoreOptions))
}()
private let qrContentView: UIImageView

private let moreButton: UIBarButtonItem

var qrCodeHint: String {
willSet {
Expand All @@ -36,54 +20,84 @@ class QrViewController: UIViewController {
}
private let chatId: Int

init(dcContext: DcContext, chatId: Int? = 0, qrCodeHint: String?) {
init(dcContext: DcContext, chatId: Int = 0, qrCodeHint: String = "") {
self.dcContext = dcContext
self.chatId = chatId ?? 0
self.qrCodeHint = qrCodeHint ?? ""
self.chatId = chatId
self.qrCodeHint = qrCodeHint

qrContentView = UIImageView()
qrContentView.contentMode = .scaleAspectFit
qrContentView.translatesAutoresizingMaskIntoConstraints = false

let moreButtonImage: UIImage?
if #available(iOS 13.0, *) {
moreButtonImage = UIImage(systemName: "ellipsis.circle")
} else {
moreButtonImage = UIImage(named: "ic_more")
}

moreButton = UIBarButtonItem(image: moreButtonImage, style: .plain, target: nil, action: nil)

super.init(nibName: nil, bundle: nil)
}

required init?(coder _: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
view.backgroundColor = DcColors.defaultBackgroundColor

// MARK: - lifecycle
override func viewDidLoad() {
super.viewDidLoad()
title = String.localized("qrshow_title")
setupSubviews()
view.backgroundColor = DcColors.defaultBackgroundColor
navigationItem.rightBarButtonItem = moreButton
moreButton.action = #selector(QrViewController.showMoreOptions(_:))
moreButton.target = self

let svg = dcContext.getSecurejoinQrSVG(chatId: chatId)
qrContentView.image = getQrImage(svg: svg)
qrContentView.backgroundColor = .yellow

view.addSubview(qrContentView)

setupConstraints()
}

required init?(coder _: NSCoder) { fatalError("init(coder:) has not been implemented") }

private func setupConstraints() {

// TODO: Calculate qrContentView.height based on width-constraint and image-ratio.

let qrImageRatio: CGFloat
if let image = qrContentView.image {
qrImageRatio = image.size.height / image.size.width
} else {
qrImageRatio = 1
}

let constraints = [
qrContentView.widthAnchor.constraint(lessThanOrEqualTo: view.safeAreaLayoutGuide.widthAnchor, multiplier: 0.75),
qrContentView.widthAnchor.constraint(lessThanOrEqualToConstant: 260),
qrContentView.heightAnchor.constraint(equalTo: qrContentView.widthAnchor, multiplier: qrImageRatio),
qrContentView.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor),
qrContentView.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor),
]

NSLayoutConstraint.activate(constraints)
}

// MARK: - lifecycle

override func viewDidDisappear(_ animated: Bool) {
onDismissed?()
}

// MARK: - setup
private func setupSubviews() {
view.addSubview(qrContentView)
let qrDefaultWidth = qrContentView.widthAnchor.constraint(equalTo: view.safeAreaLayoutGuide.widthAnchor, multiplier: 0.75)
qrDefaultWidth.priority = UILayoutPriority(500)
qrDefaultWidth.isActive = true
let qrMinWidth = qrContentView.widthAnchor.constraint(lessThanOrEqualToConstant: 260)
qrMinWidth.priority = UILayoutPriority(999)
qrMinWidth.isActive = true
qrContentView.heightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.heightAnchor, multiplier: 1.05).isActive = true
qrContentView.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor).isActive = true
qrContentView.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor).isActive = true
}

func getQrImage(svg: String?) -> UIImage? {
if let svg = svg {
let svgData = svg.data(using: .utf8)
return SDImageSVGKCoder.shared.decodedImage(with: svgData, options: [:])
}
return nil
guard let svg else { return nil }

let svgData = svg.data(using: .utf8)
let image = SDImageSVGKCoder.shared.decodedImage(with: svgData, options: [:])
return image
}

// MARK: - actions
@objc private func showMoreOptions() {

// Only relevant for GroupChatDetails, for QR-Code-Tab, this gets handled by QrPageController
@objc private func showMoreOptions(_ sender: Any) {
let alert = UIAlertController(title: String.localized("qrshow_title"), message: nil, preferredStyle: .safeActionSheet)
alert.addAction(UIAlertAction(title: String.localized("menu_share"), style: .default, handler: share(_:)))
alert.addAction(UIAlertAction(title: String.localized("menu_copy_to_clipboard"), style: .default, handler: copyToClipboard(_:)))
Expand Down

0 comments on commit 798b270

Please sign in to comment.