Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Signal/src/ViewControllers/AppSettings/Linked Devices/LinkedDevicesEducationSheet.swift
1 views
//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import SignalServiceKit
import SignalUI

class LinkedDevicesEducationSheet: StackSheetViewController {

    override var stackViewInsets: UIEdgeInsets {
        .init(top: 8, leading: 40, bottom: 24, trailing: 40)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        stackView.spacing = 32

        let imageView = UIImageView(image: UIImage(named: "all-devices"))
        imageView.contentMode = .center
        stackView.addArrangedSubview(imageView)
        stackView.setCustomSpacing(20, after: imageView)

        let titleLabel = UILabel()
        titleLabel.font = .dynamicTypeTitle2.bold()
        titleLabel.numberOfLines = 0
        titleLabel.textAlignment = .center
        titleLabel.text = OWSLocalizedString(
            "LINKED_DEVICES_EDUCATION_TITLE",
            comment: "Title for the linked device education sheet",
        )
        stackView.addArrangedSubview(titleLabel)
        stackView.setCustomSpacing(24, after: titleLabel)

        let privacyBulletPoint = Self.bulletPoint(
            icon: "lock",
            text: OWSLocalizedString(
                "LINKED_DEVICES_EDUCATION_POINT_PRIVACY",
                comment: "Bullet point about privacy on the linked devices education sheet",
            ),
        )
        stackView.addArrangedSubview(privacyBulletPoint)

        let messagesBulletPoint = Self.bulletPoint(
            icon: "thread",
            text: OWSLocalizedString(
                "LINKED_DEVICES_EDUCATION_POINT_MESSAGES",
                comment: "Bullet point about message sync on the linked devices education sheet",
            ),
        )
        stackView.addArrangedSubview(messagesBulletPoint)

        let iPadDownloadLinkString = "signal.org/install"
        let iPadDownloadURL = URL(string: "https://signal.org/install/")!
        let desktopDownloadLinkString = "signal.org/download"
        let desktopDownloadURL = URL(string: "https://signal.org/download/")!

        let downloadsString = String.nonPluralLocalizedStringWithFormat(
            OWSLocalizedString(
                "LINKED_DEVICES_EDUCATION_POINT_DOWNLOADS",
                comment: "Bullet point about downloads on the linked devices education sheet. Embeds {{ %1$@ iPad download link, %2$@ desktop download link }}",
            ),
            iPadDownloadLinkString,
            desktopDownloadLinkString,
        )

        let downloadsAttributedString = NSMutableAttributedString(string: downloadsString)

        downloadsAttributedString.addAttributes(
            [.link: iPadDownloadURL],
            range: (downloadsString as NSString).range(of: iPadDownloadLinkString),
        )

        downloadsAttributedString.addAttributes(
            [.link: desktopDownloadURL],
            range: (downloadsString as NSString).range(of: desktopDownloadLinkString),
        )

        let downloadsBulletPoint = Self.bulletPoint(
            icon: "save",
            text: downloadsAttributedString,
        )

        stackView.addArrangedSubview(downloadsBulletPoint)
    }

    private static func bulletPoint(icon: String, text: String) -> UIView {
        bulletPoint(icon: icon, text: NSAttributedString(string: text))
    }

    private static func bulletPoint(
        icon: String,
        text: NSAttributedString,
    ) -> UIView {
        let stackView = UIStackView()
        stackView.axis = .horizontal
        stackView.spacing = 24
        stackView.alignment = .top

        let iconView = UIImageView(image: UIImage(named: icon))
        iconView.tintColor = .Signal.label
        iconView.setCompressionResistanceHigh()
        stackView.addArrangedSubview(iconView)

        let textView = LinkingTextView()
        textView.setContentHuggingLow()
        textView.attributedText = text.styled(
            with: .font(.dynamicTypeSubheadline),
            .color(UIColor.Signal.label),
        )
        stackView.addArrangedSubview(textView)

        return stackView
    }
}