// // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // import Foundation class ReminderView: UIView { let TAG = "[ReminderView]" let label = UILabel() typealias Action = () -> Void var tapAction: Action? var text: String? { get { return label.text } set(newText) { label.text = newText } } enum ReminderViewMode { // Nags are urgent interactive prompts, bidding for the user's attention. case nag // Explanations are not interactive or urgent. case explanation } let mode: ReminderViewMode @available(*, unavailable, message:"use other constructor instead.") required init?(coder aDecoder: NSCoder) { fatalError("\(#function) is unimplemented.") } @available(*, unavailable, message:"use other constructor instead.") override init(frame: CGRect) { fatalError("\(#function) is unimplemented.") } private init(mode: ReminderViewMode, text: String, tapAction: Action?) { self.mode = mode self.tapAction = tapAction super.init(frame: .zero) self.text = text setupSubviews() } @objc public class func nag(text: String, tapAction: Action?) -> ReminderView { return ReminderView(mode: .nag, text: text, tapAction: tapAction) } @objc public class func explanation(text: String) -> ReminderView { return ReminderView(mode: .explanation, text: text, tapAction: nil) } func setupSubviews() { switch (mode) { case .nag: self.backgroundColor = UIColor.ows_reminderYellow case .explanation: self.backgroundColor = UIColor(rgbHex: 0xf5f5f5) } self.clipsToBounds = true let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(gestureRecognizer:))) self.addGestureRecognizer(tapGesture) let container = UIStackView() container.axis = .horizontal container.alignment = .center container.isLayoutMarginsRelativeArrangement = true self.addSubview(container) container.layoutMargins = UIEdgeInsets(top: 12, left: 16, bottom: 12, right: 16) container.autoPinToSuperviewEdges() // Label label.font = UIFont.ows_dynamicTypeSubheadline container.addArrangedSubview(label) label.textColor = UIColor.black.withAlphaComponent(0.9) label.numberOfLines = 0 label.lineBreakMode = .byWordWrapping // Show the disclosure indicator if this reminder has a tap action. if tapAction != nil { // Icon let iconName = (self.isRTL() ? "system_disclosure_indicator_rtl" : "system_disclosure_indicator") guard let iconImage = UIImage(named: iconName) else { owsFail("\(logTag) missing icon.") return } let iconView = UIImageView(image: iconImage.withRenderingMode(.alwaysTemplate)) iconView.contentMode = .scaleAspectFit iconView.tintColor = UIColor.black.withAlphaComponent(0.6) iconView.autoSetDimension(.width, toSize: 13) container.addArrangedSubview(iconView) } } @objc func handleTap(gestureRecognizer: UIGestureRecognizer) { guard gestureRecognizer.state == .recognized else { return } tapAction?() } }