Path: blob/main/Signal/Provisioning/UserInterface/ProvisioningPrepViewController.swift
1 views
//
// Copyright 2019 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Lottie
import SignalServiceKit
import SignalUI
class ProvisioningPrepViewController: ProvisioningBaseViewController {
private lazy var animationView: LottieAnimationView = {
let view = LottieAnimationView(name: isTransferring ? "launchApp-iPad" : "launchApp-iPhone")
view.loopMode = .playOnce
view.backgroundBehavior = .pauseAndRestore
view.contentMode = .scaleAspectFit
return view
}()
private let isTransferring: Bool
init(provisioningController: ProvisioningController, isTransferring: Bool) {
self.isTransferring = isTransferring
super.init(provisioningController: provisioningController)
}
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.hidesBackButton = true
let titleText: String
if isTransferring {
titleText = OWSLocalizedString(
"SECONDARY_TRANSFER_GET_STARTED_BY_OPENING_IPAD",
comment: "header text before the user can transfer to this device",
)
} else {
titleText = OWSLocalizedString(
"SECONDARY_ONBOARDING_GET_STARTED_BY_OPENING_PRIMARY",
comment: "header text before the user can link this device",
)
}
let titleLabel = UILabel.titleLabelForRegistration(text: titleText)
titleLabel.setCompressionResistanceHigh()
titleLabel.accessibilityIdentifier = "onboarding.prelink.titleLabel"
let animationViewContainer = UIView.container()
animationViewContainer.addSubview(animationView)
animationView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
animationView.topAnchor.constraint(equalTo: animationViewContainer.topAnchor),
animationView.leadingAnchor.constraint(greaterThanOrEqualTo: animationViewContainer.leadingAnchor),
animationView.centerXAnchor.constraint(equalTo: animationViewContainer.centerXAnchor),
animationView.bottomAnchor.constraint(equalTo: animationViewContainer.bottomAnchor),
])
let dontHaveSignalButton = UIButton(
configuration: .mediumBorderless(title: OWSLocalizedString(
"SECONDARY_ONBOARDING_GET_STARTED_DO_NOT_HAVE_PRIMARY",
comment: "Link explaining what to do when trying to link a device before having a primary device.",
)),
primaryAction: UIAction { [weak self] _ in
self?.didTapNoSignalApp()
},
)
dontHaveSignalButton.enableMultilineLabel()
dontHaveSignalButton.accessibilityIdentifier = "onboarding.prelink.explanationLabel"
dontHaveSignalButton.isHidden = isTransferring
let nextButton = UIButton(
configuration: .largePrimary(title: CommonStrings.nextButton),
primaryAction: UIAction { [weak self] _ in
self?.didPressNext()
},
)
nextButton.accessibilityIdentifier = "onboarding.prelink.nextButton"
let topSpacer = UIView.transparentSpacer()
let bottomSpacer = UIView.transparentSpacer()
let stackView = addStaticContentStackView(arrangedSubviews: [
topSpacer,
titleLabel,
animationViewContainer,
bottomSpacer,
[dontHaveSignalButton, nextButton].enclosedInVerticalStackView(isFullWidthButtons: true),
])
stackView.setCustomSpacing(24, after: titleLabel)
topSpacer.translatesAutoresizingMaskIntoConstraints = false
bottomSpacer.translatesAutoresizingMaskIntoConstraints = false
animationViewContainer.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
topSpacer.heightAnchor.constraint(equalTo: bottomSpacer.heightAnchor, multiplier: 0.5),
animationViewContainer.heightAnchor.constraint(equalTo: contentLayoutGuide.heightAnchor, multiplier: 0.5),
])
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
animationView.play()
}
// MARK: - Events
func didTapNoSignalApp() {
let title = OWSLocalizedString("SECONDARY_ONBOARDING_INSTALL_PRIMARY_FIRST_TITLE", comment: "alert title")
let message = OWSLocalizedString("SECONDARY_ONBOARDING_INSTALL_PRIMARY_FIRST_BODY", comment: "alert body")
let alert = ActionSheetController(title: title, message: message)
alert.addAction(.acknowledge)
presentActionSheet(alert)
}
func didPressNext() {
Logger.info("")
Task {
if isTransferring {
await provisioningController.transferAccount(fromViewController: self)
} else {
await provisioningController.didConfirmSecondaryDevice(from: self)
}
}
}
}