112 lines
4.5 KiB
Swift
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)
|
|
}
|
|
}
|