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

112 lines
4.5 KiB
Swift

//
// Copyright 2019 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import SafariServices
import SignalServiceKit
import SignalUI
import UIKit
class ProvisioningSplashViewController: ProvisioningBaseViewController {
override var primaryLayoutMargins: UIEdgeInsets {
var defaultMargins = super.primaryLayoutMargins
// we want the hero image a bit closer to the top than most
// onboarding content
defaultMargins.top = 16
return defaultMargins
}
override func loadView() {
view = UIView()
view.addSubview(primaryView)
primaryView.autoPinEdgesToSuperviewEdges()
let modeSwitchButton = UIButton()
view.addSubview(modeSwitchButton)
modeSwitchButton.setTemplateImageName(
"link-slash",
tintColor: .ows_gray25
)
modeSwitchButton.autoSetDimensions(to: CGSize(square: 40))
modeSwitchButton.autoPinEdge(toSuperviewMargin: .trailing)
modeSwitchButton.autoPinEdge(toSuperviewMargin: .top)
modeSwitchButton.addAction(UIAction { [weak self] _ in
guard let self else { return }
self.provisioningController.provisioningSplashRequestedModeSwitch(viewController: self)
}, for: .touchUpInside)
modeSwitchButton.accessibilityIdentifier = "onboarding.splash.modeSwitch"
view.backgroundColor = Theme.backgroundColor
let heroImage = UIImage(named: "onboarding_splash_hero")
let heroImageView = UIImageView(image: heroImage)
heroImageView.contentMode = .scaleAspectFit
heroImageView.layer.minificationFilter = .trilinear
heroImageView.layer.magnificationFilter = .trilinear
heroImageView.setCompressionResistanceLow()
heroImageView.setContentHuggingVerticalLow()
heroImageView.accessibilityIdentifier = "onboarding.splash." + "heroImageView"
let titleLabel = self.createTitleLabel(text: OWSLocalizedString("ONBOARDING_SPLASH_TITLE", comment: "Title of the 'onboarding splash' view."))
primaryView.addSubview(titleLabel)
titleLabel.accessibilityIdentifier = "onboarding.splash." + "titleLabel"
if !TSConstants.isUsingProductionService {
titleLabel.text = "Internal Staging Build" + "\n" + "\(AppVersionImpl.shared.currentAppVersion)"
}
let explanationLabel = UILabel()
explanationLabel.text = OWSLocalizedString("ONBOARDING_SPLASH_TERM_AND_PRIVACY_POLICY",
comment: "Link to the 'terms and privacy policy' in the 'onboarding splash' view.")
explanationLabel.textColor = Theme.accentBlueColor
explanationLabel.font = UIFont.dynamicTypeSubheadlineClamped
explanationLabel.numberOfLines = 0
explanationLabel.textAlignment = .center
explanationLabel.lineBreakMode = .byWordWrapping
explanationLabel.isUserInteractionEnabled = true
explanationLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(explanationLabelTapped)))
explanationLabel.accessibilityIdentifier = "onboarding.splash." + "explanationLabel"
let continueButton = self.primaryButton(title: CommonStrings.continueButton, action: .init(handler: { [weak self] _ in
guard let self else { return }
Task { @MainActor in
await self.provisioningController.provisioningSplashDidComplete(viewController: self)
}
}))
continueButton.accessibilityIdentifier = "onboarding.splash." + "continueButton"
let primaryButtonView = ProvisioningBaseViewController.horizontallyWrap(primaryButton: continueButton)
let stackView = UIStackView(arrangedSubviews: [
heroImageView,
UIView.spacer(withHeight: 22),
titleLabel,
UIView.spacer(withHeight: 92),
explanationLabel,
UIView.spacer(withHeight: 24),
primaryButtonView
])
stackView.axis = .vertical
stackView.alignment = .fill
primaryView.addSubview(stackView)
stackView.autoPinEdgesToSuperviewMargins()
}
override func shouldShowBackButton() -> Bool {
return false
}
// MARK: - Events
@objc
private func explanationLabelTapped(sender: UIGestureRecognizer) {
guard sender.state == .recognized else {
return
}
let url = TSConstants.legalTermsUrl
let safariVC = SFSafariViewController(url: url)
present(safariVC, animated: true)
}
}