Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/SignalShareExtension/SAELoadViewController.swift
1 views
//
// Copyright 2017 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import PureLayout
import SignalServiceKit
import SignalUI
import UIKit

class SAELoadViewController: UIViewController, OWSNavigationChildController {

    private weak var delegate: ShareViewDelegate?
    private let shouldMimicRecipientPicker: Bool

    private var activityIndicator: UIActivityIndicatorView!
    private var progressView: UIProgressView!

    var progress: Progress? {
        didSet {
            guard progressView != nil else {
                return
            }

            updateProgressViewVisibility()
            progressView.observedProgress = progress
        }
    }

    private func updateProgressViewVisibility() {
        guard progressView != nil, activityIndicator != nil else {
            return
        }

        // Prefer to show progress view when progress is present
        if self.progress == nil {
            activityIndicator.startAnimating()
            self.progressView.isHidden = true
            self.activityIndicator.isHidden = false
        } else {
            activityIndicator.stopAnimating()
            self.progressView.isHidden = false
            self.activityIndicator.isHidden = true
        }
    }

    // MARK: Initializers and Factory Methods

    init(delegate: ShareViewDelegate, shouldMimicRecipientPicker: Bool = false) {
        self.delegate = delegate
        self.shouldMimicRecipientPicker = shouldMimicRecipientPicker
        super.init(nibName: nil, bundle: nil)
    }

    @available(*, unavailable, message: "use other constructor instead.")
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func loadView() {
        super.loadView()

        // It's not (currently) safe to create a SharingThreadPickerViewController
        // while the Share Extension is launching, so instead mimic the header of
        // the picker on the loading view controller.
        //
        // TODO: Make it safe to do so and remove this hack.
        if self.shouldMimicRecipientPicker {
            self.title = ConversationPickerViewController.Strings.defaultTitle
            self.navigationItem.rightBarButtonItem = .cancelButton(action: {})
            self.navigationItem.rightBarButtonItem?.isEnabled = false
        }

        self.view.backgroundColor = (
            self.shouldMimicRecipientPicker
                ? Theme.tableView2PresentedBackgroundColor
                : Theme.backgroundColor,
        )

        let activityIndicator = UIActivityIndicatorView(style: .large)
        activityIndicator.color = Theme.primaryIconColor
        self.activityIndicator = activityIndicator
        self.view.addSubview(activityIndicator)
        activityIndicator.autoCenterInSuperview()

        progressView = UIProgressView(progressViewStyle: .default)
        progressView.observedProgress = progress

        self.view.addSubview(progressView)
        progressView.autoVCenterInSuperview()
        progressView.autoPinWidthToSuperview(withMargin: .scaleFromIPhone5(30))
        progressView.progressTintColor = Theme.accentBlueColor

        updateProgressViewVisibility()

        let label = UILabel()
        label.textColor = Theme.primaryTextColor
        label.font = .systemFont(ofSize: 17)
        label.text = OWSLocalizedString(
            "SHARE_EXTENSION_LOADING",
            comment: "Indicates that the share extension is still loading.",
        )
        self.view.addSubview(label)
        label.autoHCenterInSuperview()
        label.autoPinEdge(.top, to: .bottom, of: activityIndicator, withOffset: 12)
    }

    var preferredNavigationBarStyle: OWSNavigationBarStyle {
        // The false case should be the default, but we can't access the
        // extension's default implementation here.
        return self.shouldMimicRecipientPicker ? .solid : .blur
    }

    var navbarBackgroundColorOverride: UIColor? {
        // The false case should be the default, but we can't access the
        // extension's default implementation here.
        return self.shouldMimicRecipientPicker ? Theme.tableView2PresentedBackgroundColor : nil
    }
}