TM-SGNL-iOS/Signal/DeviceTransfer/OutgoingDeviceTransferNavigationController.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

137 lines
5.2 KiB
Swift

//
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import SignalServiceKit
import SignalUI
class OutgoingDeviceTransferNavigationController: UINavigationController {
init() {
super.init(nibName: nil, bundle: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
pushViewController(OutgoingDeviceTransferInitialViewController(), animated: false)
setNavigationBarHidden(true, animated: false)
let dismissButton = UIButton()
dismissButton.setTemplateImage(Theme.iconImage(.buttonX), tintColor: Theme.primaryIconColor)
dismissButton.addTarget(self, action: #selector(tappedDismiss), for: .touchUpInside)
view.addSubview(dismissButton)
dismissButton.autoSetDimensions(to: CGSize(square: 40))
dismissButton.autoPinEdge(toSuperviewEdge: .leading, withInset: 8)
dismissButton.autoPinEdge(toSuperviewEdge: .top, withInset: 10)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc
private func tappedDismiss() {
AssertIsOnMainThread()
if let topVC = topViewController as? DeviceTransferBaseViewController, topVC.requiresDismissConfirmation {
let actionSheet = ActionSheetController(
title: OWSLocalizedString("DEVICE_TRANSFER_CANCEL_CONFIRMATION_TITLE",
comment: "The title of the dialog asking the user if they want to cancel a device transfer"),
message: OWSLocalizedString("DEVICE_TRANSFER_CANCEL_CONFIRMATION_MESSAGE",
comment: "The message of the dialog asking the user if they want to cancel a device transfer")
)
actionSheet.addAction(OWSActionSheets.cancelAction)
let okAction = ActionSheetAction(
title: OWSLocalizedString("DEVICE_TRANSFER_CANCEL_CONFIRMATION_ACTION",
comment: "The stop action of the dialog asking the user if they want to cancel a device transfer"),
style: .destructive
) { _ in
self.dismissActionSheet()
}
actionSheet.addAction(okAction)
present(actionSheet, animated: true)
} else {
dismissActionSheet()
}
}
func dismissActionSheet() {
AssertIsOnMainThread()
AppEnvironment.shared.deviceTransferServiceRef.cancelTransferToNewDevice()
actionSheetController?.dismiss(animated: true, completion: nil)
}
var actionSheetController: ActionSheetController?
func present(fromViewController: UIViewController) {
let actionSheetController = ActionSheetController()
self.actionSheetController = actionSheetController
actionSheetController.customHeader = view
view.autoSetDimension(.height, toSize: 440)
fromViewController.presentActionSheet(actionSheetController)
}
}
class DeviceTransferBaseViewController: UIViewController {
var transferNavigationController: OutgoingDeviceTransferNavigationController? {
return navigationController as? OutgoingDeviceTransferNavigationController
}
var requiresDismissConfirmation: Bool { false }
let contentView = UIStackView()
override func loadView() {
view = UIView()
view.backgroundColor = Theme.actionSheetBackgroundColor
view.addSubview(contentView)
contentView.autoPinEdgesToSuperviewEdges()
contentView.isLayoutMarginsRelativeArrangement = true
contentView.layoutMargins = UIEdgeInsets(top: 16, leading: 32, bottom: 16, trailing: 32)
contentView.axis = .vertical
}
func titleLabel(text: String) -> UILabel {
let titleLabel = UILabel()
titleLabel.text = text
titleLabel.textColor = Theme.primaryTextColor
titleLabel.font = UIFont.dynamicTypeTitle2.semibold()
titleLabel.numberOfLines = 0
titleLabel.lineBreakMode = .byWordWrapping
titleLabel.textAlignment = .center
return titleLabel
}
func explanationLabel(explanationText: String) -> UILabel {
let explanationLabel = UILabel()
explanationLabel.textColor = Theme.secondaryTextAndIconColor
explanationLabel.font = .dynamicTypeBody2
explanationLabel.text = explanationText
explanationLabel.numberOfLines = 0
explanationLabel.textAlignment = .center
explanationLabel.lineBreakMode = .byWordWrapping
return explanationLabel
}
func button(title: String, selector: Selector) -> OWSFlatButton {
let font = UIFont.dynamicTypeBodyClamped.semibold()
let buttonHeight = OWSFlatButton.heightForFont(font)
let button = OWSFlatButton.button(title: title,
font: font,
titleColor: .white,
backgroundColor: .ows_accentBlue,
target: self,
selector: selector)
button.autoSetDimension(.height, toSize: buttonHeight)
return button
}
}