element-ios/Riot/Modules/Integrations/WidgetPermission/WidgetPermissionViewController.swift

228 lines
7.8 KiB
Swift

// File created from ScreenTemplate
// $ createScreen.sh Modal/Show ServiceTermsModalScreen
/*
Copyright 2019 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import UIKit
@objc
final class WidgetPermissionViewController: UIViewController {
// MARK: - Constants
private enum Constants {
static let continueButtonCornerRadius: CGFloat = 8.0
}
private enum Sizing {
static var viewController: WidgetPermissionViewController?
static var widthConstraint: NSLayoutConstraint?
}
// MARK: - Properties
// MARK: Outlets
@IBOutlet private weak var scrollView: UIScrollView!
@IBOutlet private weak var titleLabel: UILabel!
@IBOutlet private weak var closeButton: UIButton!
@IBOutlet private weak var creatorInfoTitleLabel: UILabel!
@IBOutlet private weak var creatorAvatarImageView: MXKImageView!
@IBOutlet private weak var creatorDisplayNameLabel: UILabel!
@IBOutlet private weak var creatorUserIDLabel: UILabel!
@IBOutlet private weak var informationLabel: UILabel!
@IBOutlet private weak var continueButton: UIButton!
// MARK: Private
private var viewModel: WidgetPermissionViewModel! {
didSet {
self.updateViews()
}
}
private var theme: Theme!
// MARK: Public
@objc var didTapCloseButton: (() -> Void)?
@objc var didTapContinueButton: (() -> Void)?
// MARK: - Setup
@objc class func instantiate(with viewModel: WidgetPermissionViewModel) -> WidgetPermissionViewController {
let viewController = StoryboardScene.WidgetPermissionViewController.initialScene.instantiate()
viewController.viewModel = viewModel
viewController.theme = ThemeService.shared().theme
return viewController
}
// MARK: - Life cycle
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.setupViews()
self.updateViews()
self.registerThemeServiceDidChangeThemeNotification()
self.update(theme: self.theme)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.scrollView.flashScrollIndicators()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.creatorAvatarImageView.layer.cornerRadius = self.creatorAvatarImageView.frame.size.width/2
self.continueButton.layer.cornerRadius = Constants.continueButtonCornerRadius
self.closeButton.layer.cornerRadius = self.closeButton.frame.size.width/2
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return self.theme.statusBarStyle
}
// MARK: - Private
private func update(theme: Theme) {
self.theme = theme
self.view.backgroundColor = theme.headerBackgroundColor
self.titleLabel.textColor = theme.textPrimaryColor
self.closeButton.vc_setBackgroundColor(theme.headerTextSecondaryColor, for: .normal)
self.creatorInfoTitleLabel.textColor = theme.textSecondaryColor
self.creatorDisplayNameLabel.textColor = theme.textSecondaryColor
self.creatorUserIDLabel.textColor = theme.textSecondaryColor
self.informationLabel.textColor = theme.textSecondaryColor
self.continueButton.vc_setBackgroundColor(theme.tintColor, for: .normal)
}
private func registerThemeServiceDidChangeThemeNotification() {
NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .themeServiceDidChangeTheme, object: nil)
}
@objc private func themeDidChange() {
self.update(theme: ThemeService.shared().theme)
}
private func setupViews() {
self.closeButton.layer.masksToBounds = true
self.setupCreatorAvatarImageView()
self.titleLabel.text = VectorL10n.roomWidgetPermissionTitle
self.creatorInfoTitleLabel.text = VectorL10n.roomWidgetPermissionCreatorInfoTitle
self.informationLabel.text = ""
self.setupContinueButton()
}
private func updateViews() {
if let avatarImageView = self.creatorAvatarImageView {
let defaultavatarImage = AvatarGenerator.generateAvatar(forMatrixItem: self.viewModel.creatorUserId, withDisplayName: self.viewModel.creatorDisplayName)
avatarImageView.setImageURI(self.viewModel.creatorAvatarUrl, withType: nil, andImageOrientation: .up, previewImage: defaultavatarImage, mediaManager: self.viewModel.mediaManager)
}
if let creatorDisplayNameLabel = self.creatorDisplayNameLabel {
if let creatorDisplayName = self.viewModel.creatorDisplayName {
creatorDisplayNameLabel.text = creatorDisplayName
} else {
creatorDisplayNameLabel.isHidden = true
}
}
if let creatorUserIDLabel = self.creatorUserIDLabel {
creatorUserIDLabel.text = self.viewModel.creatorUserId
}
if let informationLabel = self.informationLabel {
informationLabel.text = self.viewModel.permissionsInformationText
}
}
private func setupCreatorAvatarImageView() {
self.creatorAvatarImageView.enableInMemoryCache = true
self.creatorAvatarImageView.clipsToBounds = true
}
private func setupContinueButton() {
self.continueButton.layer.masksToBounds = true
self.continueButton.setTitle(VectorL10n.continue, for: .normal)
}
// MARK: - Actions
@IBAction private func closeButtonAction(_ sender: Any) {
self.didTapCloseButton?()
}
@IBAction private func continueButtonAction(_ sender: Any) {
self.didTapContinueButton?()
}
}
// MARK: - SlidingModalPresentable
extension WidgetPermissionViewController: SlidingModalPresentable {
func allowsDismissOnBackgroundTap() -> Bool {
return false
}
func layoutHeightFittingWidth(_ width: CGFloat) -> CGFloat {
let sizingViewContoller: WidgetPermissionViewController
if let viewController = WidgetPermissionViewController.Sizing.viewController {
viewController.viewModel = self.viewModel
sizingViewContoller = viewController
} else {
sizingViewContoller = WidgetPermissionViewController.instantiate(with: self.viewModel)
WidgetPermissionViewController.Sizing.viewController = sizingViewContoller
}
let sizingViewContollerView: UIView = sizingViewContoller.view
if let widthConstraint = WidgetPermissionViewController.Sizing.widthConstraint {
widthConstraint.constant = width
} else {
let widthConstraint = sizingViewContollerView.widthAnchor.constraint(equalToConstant: width)
widthConstraint.isActive = true
WidgetPermissionViewController.Sizing.widthConstraint = widthConstraint
sizingViewContollerView.heightAnchor.constraint(equalToConstant: 0)
}
sizingViewContollerView.layoutIfNeeded()
return sizingViewContoller.scrollView.contentSize.height
}
}