aboutsummaryrefslogtreecommitdiffstats
path: root/WireGuard/WireGuard/UI/iOS/SettingsTableViewController.swift
diff options
context:
space:
mode:
authorRoopesh Chander <roop@roopc.net>2018-10-29 17:34:02 +0530
committerRoopesh Chander <roop@roopc.net>2018-10-29 17:34:09 +0530
commitffc9b11efb2f0d9faf50375f982dec5b3d802f40 (patch)
treedc0b831b71b0bb387bb5644919ec310e1c8de692 /WireGuard/WireGuard/UI/iOS/SettingsTableViewController.swift
parentModel: Cap networkPrefixLengths to valid values (diff)
downloadwireguard-apple-ffc9b11efb2f0d9faf50375f982dec5b3d802f40.tar.xz
wireguard-apple-ffc9b11efb2f0d9faf50375f982dec5b3d802f40.zip
Settings: Add a settings panel
Signed-off-by: Roopesh Chander <roop@roopc.net>
Diffstat (limited to 'WireGuard/WireGuard/UI/iOS/SettingsTableViewController.swift')
-rw-r--r--WireGuard/WireGuard/UI/iOS/SettingsTableViewController.swift148
1 files changed, 148 insertions, 0 deletions
diff --git a/WireGuard/WireGuard/UI/iOS/SettingsTableViewController.swift b/WireGuard/WireGuard/UI/iOS/SettingsTableViewController.swift
new file mode 100644
index 0000000..8cbaa2d
--- /dev/null
+++ b/WireGuard/WireGuard/UI/iOS/SettingsTableViewController.swift
@@ -0,0 +1,148 @@
+// SPDX-License-Identifier: MIT
+// Copyright © 2018 WireGuard LLC. All rights reserved.
+
+import UIKit
+
+class SettingsTableViewController: UITableViewController {
+
+ enum SettingsFields: String {
+ case iosAppVersion = "WireGuard for iOS"
+ case goBackendVersion = "WireGuard Go Backend"
+ case exportZipArchive = "Export zip archive"
+ }
+
+ let settingsFieldsBySection : [[SettingsFields]] = [
+ [.iosAppVersion, .goBackendVersion],
+ [.exportZipArchive]
+ ]
+
+ init() {
+ super.init(style: .grouped)
+ }
+
+ required init?(coder aDecoder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ self.title = "Settings"
+ self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneTapped))
+
+ self.tableView.rowHeight = 44
+ self.tableView.allowsSelection = false
+
+ self.tableView.register(TunnelSettingsTableViewKeyValueCell.self, forCellReuseIdentifier: TunnelSettingsTableViewKeyValueCell.id)
+ self.tableView.register(TunnelSettingsTableViewButtonCell.self, forCellReuseIdentifier: TunnelSettingsTableViewButtonCell.id)
+ }
+
+ @objc func doneTapped() {
+ dismiss(animated: true, completion: nil)
+ }
+}
+
+// MARK: UITableViewDataSource
+
+extension SettingsTableViewController {
+ override func numberOfSections(in tableView: UITableView) -> Int {
+ return settingsFieldsBySection.count
+ }
+
+ override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+ return settingsFieldsBySection[section].count
+ }
+
+ override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
+ switch (section) {
+ case 0:
+ return "About"
+ case 1:
+ return "Export configurations"
+ default:
+ return nil
+ }
+ }
+
+ override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+ let field = settingsFieldsBySection[indexPath.section][indexPath.row]
+ if (field == .iosAppVersion || field == .goBackendVersion) {
+ let cell = tableView.dequeueReusableCell(withIdentifier: TunnelSettingsTableViewKeyValueCell.id, for: indexPath) as! TunnelSettingsTableViewKeyValueCell
+ cell.key = field.rawValue
+ if (field == .iosAppVersion) {
+ let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown version"
+ cell.value = appVersion
+ } else if (field == .goBackendVersion) {
+ cell.value = "TODO"
+ }
+ return cell
+ } else {
+ assert(field == .exportZipArchive)
+ let cell = tableView.dequeueReusableCell(withIdentifier: TunnelSettingsTableViewButtonCell.id, for: indexPath) as! TunnelSettingsTableViewButtonCell
+ cell.buttonText = field.rawValue
+ return cell
+ }
+ }
+}
+
+class TunnelSettingsTableViewKeyValueCell: UITableViewCell {
+ static let id: String = "TunnelSettingsTableViewKeyValueCell"
+ var key: String {
+ get { return textLabel?.text ?? "" }
+ set(value) { textLabel?.text = value }
+ }
+ var value: String {
+ get { return detailTextLabel?.text ?? "" }
+ set(value) { detailTextLabel?.text = value }
+ }
+
+ override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
+ super.init(style: .value1, reuseIdentifier: TunnelSettingsTableViewKeyValueCell.id)
+ }
+
+ required init?(coder aDecoder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ override func prepareForReuse() {
+ super.prepareForReuse()
+ key = ""
+ value = ""
+ }
+}
+
+class TunnelSettingsTableViewButtonCell: UITableViewCell {
+ static let id: String = "TunnelSettingsTableViewButtonCell"
+ var buttonText: String {
+ get { return button.title(for: .normal) ?? "" }
+ set(value) { button.setTitle(value, for: .normal) }
+ }
+ var onTapped: (() -> Void)? = nil
+
+ let button: UIButton
+
+ override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
+ button = UIButton(type: .system)
+ super.init(style: style, reuseIdentifier: reuseIdentifier)
+ contentView.addSubview(button)
+ button.translatesAutoresizingMaskIntoConstraints = false
+ NSLayoutConstraint.activate([
+ button.centerYAnchor.constraint(equalTo: contentView.centerYAnchor),
+ button.centerXAnchor.constraint(equalTo: contentView.centerXAnchor)
+ ])
+ button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
+ }
+
+ @objc func buttonTapped() {
+ onTapped?()
+ }
+
+ required init?(coder aDecoder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ override func prepareForReuse() {
+ super.prepareForReuse()
+ buttonText = ""
+ onTapped = nil
+ }
+}