You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-ios/Session/Media Viewing & Editing/MediaInfoVC+MediaInfoView.s...

195 lines
8.3 KiB
Swift

// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved.
import UIKit
import SessionUIKit
import SessionUtilitiesKit
import SessionMessagingKit
import SignalUtilitiesKit
extension MediaInfoVC {
final class MediaInfoView: UIView {
1 year ago
private static let cornerRadius: CGFloat = 12
private var attachment: Attachment?
1 year ago
private let width: CGFloat = MediaInfoVC.mediaSize - 2 * MediaInfoVC.arrowSize.width
// MARK: - UI
private lazy var fileIdLabel: UILabel = {
let result: UILabel = UILabel()
result.font = .systemFont(ofSize: Values.mediumFontSize)
result.themeTextColor = .textPrimary
return result
}()
private lazy var fileTypeLabel: UILabel = {
let result: UILabel = UILabel()
result.font = .systemFont(ofSize: Values.mediumFontSize)
result.themeTextColor = .textPrimary
return result
}()
private lazy var fileSizeLabel: UILabel = {
let result: UILabel = UILabel()
result.font = .systemFont(ofSize: Values.mediumFontSize)
result.themeTextColor = .textPrimary
return result
}()
private lazy var resolutionLabel: UILabel = {
let result: UILabel = UILabel()
result.font = .systemFont(ofSize: Values.mediumFontSize)
result.themeTextColor = .textPrimary
return result
}()
private lazy var durationLabel: UILabel = {
let result: UILabel = UILabel()
result.font = .systemFont(ofSize: Values.mediumFontSize)
result.themeTextColor = .textPrimary
return result
}()
// MARK: - Lifecycle
init(attachment: Attachment?) {
self.attachment = attachment
super.init(frame: CGRect.zero)
self.accessibilityLabel = "Media info"
setUpViewHierarchy()
update(attachment: attachment)
}
override init(frame: CGRect) {
preconditionFailure("Use init(attachment:) instead.")
}
required init?(coder: NSCoder) {
preconditionFailure("Use init(attachment:) instead.")
}
private func setUpViewHierarchy() {
let backgroundView: UIView = UIView()
backgroundView.clipsToBounds = true
backgroundView.themeBackgroundColor = .contextMenu_background
backgroundView.layer.cornerRadius = Self.cornerRadius
addSubview(backgroundView)
backgroundView.pin(to: self)
let container: UIView = UIView()
1 year ago
container.set(.width, to: self.width)
// File ID
let fileIdTitleLabel: UILabel = {
let result = UILabel()
result.font = .boldSystemFont(ofSize: Values.mediumFontSize)
result.text = "ATTACHMENT_INFO_FILE_ID".localized() + ":"
result.themeTextColor = .textPrimary
return result
}()
let fileIdContainerStackView: UIStackView = UIStackView(arrangedSubviews: [ fileIdTitleLabel, fileIdLabel ])
fileIdContainerStackView.axis = .vertical
1 year ago
fileIdContainerStackView.spacing = 6
container.addSubview(fileIdContainerStackView)
fileIdContainerStackView.pin([ UIView.HorizontalEdge.leading, UIView.HorizontalEdge.trailing, UIView.VerticalEdge.top ], to: container)
// File Type
let fileTypeTitleLabel: UILabel = {
let result = UILabel()
result.font = .boldSystemFont(ofSize: Values.mediumFontSize)
result.text = "ATTACHMENT_INFO_FILE_TYPE".localized() + ":"
result.themeTextColor = .textPrimary
return result
}()
let fileTypeContainerStackView: UIStackView = UIStackView(arrangedSubviews: [ fileTypeTitleLabel, fileTypeLabel ])
fileTypeContainerStackView.axis = .vertical
1 year ago
fileTypeContainerStackView.spacing = 6
container.addSubview(fileTypeContainerStackView)
fileTypeContainerStackView.pin(.leading, to: .leading, of: container)
1 year ago
fileTypeContainerStackView.pin(.top, to: .bottom, of: fileIdContainerStackView, withInset: Values.largeSpacing)
// File Size
let fileSizeTitleLabel: UILabel = {
let result = UILabel()
result.font = .boldSystemFont(ofSize: Values.mediumFontSize)
result.text = "ATTACHMENT_INFO_FILE_SIZE".localized() + ":"
result.themeTextColor = .textPrimary
return result
}()
let fileSizeContainerStackView: UIStackView = UIStackView(arrangedSubviews: [ fileSizeTitleLabel, fileSizeLabel ])
fileSizeContainerStackView.axis = .vertical
1 year ago
fileSizeContainerStackView.spacing = 6
container.addSubview(fileSizeContainerStackView)
fileSizeContainerStackView.pin(.trailing, to: .trailing, of: container)
1 year ago
fileSizeContainerStackView.pin(.top, to: .bottom, of: fileIdContainerStackView, withInset: Values.largeSpacing)
fileSizeContainerStackView.set(.width, to: 90)
// Resolution
let resolutionTitleLabel: UILabel = {
let result = UILabel()
result.font = .boldSystemFont(ofSize: Values.mediumFontSize)
result.text = "ATTACHMENT_INFO_RESOLUTION".localized() + ":"
result.themeTextColor = .textPrimary
return result
}()
let resolutionContainerStackView: UIStackView = UIStackView(arrangedSubviews: [ resolutionTitleLabel, resolutionLabel ])
resolutionContainerStackView.axis = .vertical
1 year ago
resolutionContainerStackView.spacing = 6
container.addSubview(resolutionContainerStackView)
resolutionContainerStackView.pin(.leading, to: .leading, of: container)
1 year ago
resolutionContainerStackView.pin(.top, to: .bottom, of: fileTypeContainerStackView, withInset: Values.largeSpacing)
// Duration
let durationTitleLabel: UILabel = {
let result = UILabel()
result.font = .boldSystemFont(ofSize: Values.mediumFontSize)
result.text = "ATTACHMENT_INFO_DURATION".localized() + ":"
result.themeTextColor = .textPrimary
return result
}()
let durationContainerStackView: UIStackView = UIStackView(arrangedSubviews: [ durationTitleLabel, durationLabel ])
durationContainerStackView.axis = .vertical
1 year ago
durationContainerStackView.spacing = 6
container.addSubview(durationContainerStackView)
durationContainerStackView.pin(.trailing, to: .trailing, of: container)
1 year ago
durationContainerStackView.pin(.top, to: .bottom, of: fileSizeContainerStackView, withInset: Values.largeSpacing)
durationContainerStackView.set(.width, to: 90)
container.pin(.bottom, to: .bottom, of: durationContainerStackView)
backgroundView.addSubview(container)
container.pin(to: backgroundView, withInset: Values.largeSpacing)
}
// MARK: - Interaction
public func update(attachment: Attachment?) {
guard let attachment: Attachment = attachment else { return }
self.attachment = attachment
fileIdLabel.text = attachment.serverId
fileTypeLabel.text = attachment.contentType
fileSizeLabel.text = Format.fileSize(attachment.byteCount)
resolutionLabel.text = {
guard let width = attachment.width, let height = attachment.height else { return "N/A" }
return "\(width)×\(height)"
}()
durationLabel.text = {
guard let duration = attachment.duration else { return "N/A" }
return floor(duration).formatted(format: .videoDuration)
}()
}
}
}