212 lines
7.9 KiB
Swift
212 lines
7.9 KiB
Swift
//
|
|
// Copyright 2020 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import SignalServiceKit
|
|
import SignalUI
|
|
import UIKit
|
|
|
|
class ProvisioningTransferChoiceViewController: ProvisioningBaseViewController {
|
|
|
|
override var primaryLayoutMargins: UIEdgeInsets {
|
|
var defaultMargins = super.primaryLayoutMargins
|
|
|
|
switch traitCollection.horizontalSizeClass {
|
|
case .unspecified, .compact:
|
|
// we want the choice buttons to have less padding on the left and right.
|
|
// on iPhone. consequently, we will need to add an extra 16 to all the text
|
|
// on this page.
|
|
defaultMargins.left = 16
|
|
defaultMargins.right = 16
|
|
case .regular:
|
|
break
|
|
@unknown default:
|
|
break
|
|
}
|
|
|
|
return defaultMargins
|
|
}
|
|
|
|
override func loadView() {
|
|
view = UIView()
|
|
view.addSubview(primaryView)
|
|
primaryView.autoPinEdgesToSuperviewEdges()
|
|
|
|
view.backgroundColor = Theme.backgroundColor
|
|
|
|
let titleLabel = self.createTitleLabel(
|
|
text: OWSLocalizedString("DEVICE_TRANSFER_CHOICE_TITLE",
|
|
comment: "The title for the device transfer 'choice' view")
|
|
)
|
|
titleLabel.accessibilityIdentifier = "onboarding.transferChoice." + "titleLabel"
|
|
|
|
let explanationText = OWSLocalizedString(
|
|
"DEVICE_TRANSFER_CHOICE_LINKED_EXPLANATION",
|
|
comment: "The explanation for the device transfer 'choice' view when linking a device"
|
|
)
|
|
let transferTitle = OWSLocalizedString(
|
|
"DEVICE_TRANSFER_CHOICE_TRANSFER_LINKED_TITLE",
|
|
comment: "The title for the device transfer 'choice' view 'transfer' option when linking a device"
|
|
)
|
|
let transferBody = OWSLocalizedString(
|
|
"DEVICE_TRANSFER_CHOICE_TRANSFER_LINKED_BODY",
|
|
comment: "The body for the device transfer 'choice' view 'transfer' option when linking a device"
|
|
)
|
|
let registerTitle = OWSLocalizedString(
|
|
"DEVICE_TRANSFER_CHOICE_REGISTER_LINKED_TITLE",
|
|
comment: "The title for the device transfer 'choice' view 'register' option when linking a device"
|
|
)
|
|
let registerBody = OWSLocalizedString(
|
|
"DEVICE_TRANSFER_CHOICE_REGISTER_LINKED_BODY",
|
|
comment: "The body for the device transfer 'choice' view 'register' option when linking a device"
|
|
)
|
|
|
|
let explanationLabel = self.createExplanationLabel(explanationText: explanationText)
|
|
explanationLabel.accessibilityIdentifier = "onboarding.transferChoice." + "explanationLabel"
|
|
|
|
let warningLabel = self.createExplanationLabel(
|
|
explanationText: OWSLocalizedString("DEVICE_TRANSFER_CHOICE_WARNING",
|
|
comment: "A warning for the device transfer 'choice' view indicating you can only have one device registered with your number")
|
|
)
|
|
warningLabel.accessibilityIdentifier = "onboarding.transferChoice." + "warningLabel"
|
|
|
|
let transferButton = choiceButton(
|
|
title: transferTitle,
|
|
body: transferBody,
|
|
iconName: Theme.iconName(.transfer),
|
|
selector: #selector(didSelectTransfer)
|
|
)
|
|
transferButton.accessibilityIdentifier = "onboarding.transferChoice." + "transferButton"
|
|
|
|
let registerButton = choiceButton(
|
|
title: registerTitle,
|
|
body: registerBody,
|
|
iconName: Theme.iconName(.register),
|
|
selector: #selector(didSelectRegister)
|
|
)
|
|
registerButton.accessibilityIdentifier = "onboarding.transferChoice." + "registerButton"
|
|
|
|
let topStackView = UIStackView(arrangedSubviews: [
|
|
titleLabel,
|
|
UIView.spacer(withHeight: 12),
|
|
explanationLabel
|
|
])
|
|
topStackView.axis = .vertical
|
|
topStackView.alignment = .fill
|
|
topStackView.isLayoutMarginsRelativeArrangement = true
|
|
topStackView.layoutMargins = UIEdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16)
|
|
|
|
let topSpacer = UIView.vStretchingSpacer()
|
|
let bottomSpacer = UIView.vStretchingSpacer()
|
|
|
|
let stackView = UIStackView(arrangedSubviews: [
|
|
topStackView,
|
|
topSpacer,
|
|
transferButton,
|
|
UIView.spacer(withHeight: 12),
|
|
registerButton,
|
|
bottomSpacer
|
|
])
|
|
stackView.axis = .vertical
|
|
stackView.alignment = .fill
|
|
primaryView.addSubview(stackView)
|
|
stackView.autoPinEdgesToSuperviewMargins()
|
|
|
|
topSpacer.autoMatch(.height, to: .height, of: bottomSpacer)
|
|
}
|
|
|
|
func choiceButton(title: String, body: String, iconName: String, selector: Selector) -> OWSFlatButton {
|
|
let button = OWSFlatButton()
|
|
button.setBackgroundColors(upColor: Theme.isDarkThemeEnabled ? .ows_gray80 : .ows_gray02)
|
|
button.layer.cornerRadius = 8
|
|
button.clipsToBounds = true
|
|
|
|
// Icon
|
|
|
|
let iconContainer = UIView()
|
|
let iconView = UIImageView(image: UIImage(named: iconName))
|
|
iconView.contentMode = .scaleAspectFit
|
|
iconContainer.addSubview(iconView)
|
|
iconView.autoPinWidthToSuperview()
|
|
iconView.autoSetDimensions(to: CGSize(square: 60))
|
|
iconView.autoVCenterInSuperview()
|
|
iconView.autoMatch(.height, to: .height, of: iconContainer, withOffset: 0, relation: .lessThanOrEqual)
|
|
|
|
// Labels
|
|
|
|
let titleLabel = UILabel()
|
|
titleLabel.text = title
|
|
titleLabel.numberOfLines = 0
|
|
titleLabel.lineBreakMode = .byWordWrapping
|
|
titleLabel.font = UIFont.dynamicTypeBody.semibold()
|
|
titleLabel.textColor = Theme.primaryTextColor
|
|
|
|
let bodyLabel = UILabel()
|
|
bodyLabel.text = body
|
|
bodyLabel.numberOfLines = 0
|
|
bodyLabel.lineBreakMode = .byWordWrapping
|
|
bodyLabel.font = .dynamicTypeBody2
|
|
bodyLabel.textColor = Theme.secondaryTextAndIconColor
|
|
|
|
let topSpacer = UIView.vStretchingSpacer()
|
|
let bottomSpacer = UIView.vStretchingSpacer()
|
|
|
|
let vStack = UIStackView(arrangedSubviews: [
|
|
topSpacer,
|
|
titleLabel,
|
|
bodyLabel,
|
|
bottomSpacer
|
|
])
|
|
vStack.axis = .vertical
|
|
vStack.spacing = 8
|
|
|
|
topSpacer.autoMatch(.height, to: .height, of: bottomSpacer)
|
|
|
|
// Disclosure Indicator
|
|
|
|
let disclosureContainer = UIView()
|
|
let disclosureView = UIImageView()
|
|
disclosureView.setTemplateImage(UIImage(imageLiteralResourceName: "chevron-right-20"), tintColor: Theme.secondaryTextAndIconColor)
|
|
disclosureView.contentMode = .scaleAspectFit
|
|
disclosureContainer.addSubview(disclosureView)
|
|
disclosureView.autoPinEdgesToSuperviewEdges()
|
|
disclosureView.autoSetDimension(.width, toSize: 20)
|
|
|
|
let hStack = UIStackView(arrangedSubviews: [
|
|
iconContainer,
|
|
vStack,
|
|
disclosureContainer
|
|
])
|
|
hStack.axis = .horizontal
|
|
hStack.spacing = 16
|
|
hStack.isLayoutMarginsRelativeArrangement = true
|
|
hStack.layoutMargins = UIEdgeInsets(top: 24, leading: 10, bottom: 24, trailing: 8.5)
|
|
hStack.isUserInteractionEnabled = false
|
|
|
|
button.addSubview(hStack)
|
|
hStack.autoPinEdgesToSuperviewEdges()
|
|
|
|
button.addTarget(target: self, selector: selector)
|
|
|
|
return button
|
|
}
|
|
|
|
// MARK: - Events
|
|
|
|
@objc
|
|
private func didSelectTransfer() {
|
|
Logger.info("")
|
|
|
|
let prepViewController = ProvisioningPrepViewController(provisioningController: provisioningController, isTransferring: true)
|
|
navigationController?.pushViewController(prepViewController, animated: true)
|
|
}
|
|
|
|
@objc
|
|
private func didSelectRegister() {
|
|
Logger.info("")
|
|
|
|
let prepViewController = ProvisioningPrepViewController(provisioningController: provisioningController, isTransferring: false)
|
|
navigationController?.pushViewController(prepViewController, animated: true)
|
|
}
|
|
}
|